/// <summary> /// loadChunkで読み込んだサウンドをfadeさせる /// </summary> /// <param name="speed"></param> /// <returns></returns> private YanesdkResult PlayChunkFade(int speed) { CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.PreconditionError); } int ch = (chunkChannel == 0) ? // おまかせchunkでの再生ならば空きチャンクを探す ch = ChunkManager.GetEmptyChunk(this) : ch = chunkChannel - 1; // チャンネルの占拠を明示 ChunkManager.chunk[ch] = this; // ↑このチャンクが使用中であることはここで予約が入る // volumeの設定(これは再生時に設定する) ChunkManager.SetVolume(ch + 1, Volume); return(SDL.Mix_FadeInChannel(ch, chunk, loopflag, speed) == ch ? YanesdkResult.NoError : YanesdkResult.SdlError); }
/// <summary>サーフェースに文字列を描画します。</summary> /// <remarks> /// サーフェースをnewしたくないときは、こちらを使うよろし。 /// </remarks> public void DrawSolidUnicode(Surface surface, string str) { CacheSystem.OnAccess(this); if (font != IntPtr.Zero) { SDL.TTF_SetFontStyle(font, style); IntPtr image = SDL.TTF_RenderUNICODE_Solid(font, str, color); RateCheck(ref image); /* * // debug目的でsurfaceの種類を調べるためのコード * unsafe * { * SDL.SDL_PixelFormat* format = (SDL.SDL_PixelFormat*)((SDL.SDL_Surface*)image)->format; * int alpha = format->alpha; * } * // 8bppのsurfaceが戻ってきているな… */ // ここで取得されるsurfaceは転送元color keyを設定されているので // これを設定するとalphaつきのsurfaceになってしまうのだが…(´ω`) // どうしたもんかの…。 surface.SDL_Surface = image; // .setSurface(image); } else { surface.SDL_Surface = IntPtr.Zero; // setSurface(IntPtr.Zero); } }
/// <summary> /// Pauseで停止させていたならば、 /// それを前回停止させていた再生ポジションから再開する。 /// </summary> /// <returns></returns> public YanesdkResult Resume() { CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.NoError); } return(ChunkManager.Resume(this)); }
/// <summary> /// play中のサウンドを停止させる /// </summary> /// 読み込んでいるサウンドデータ自体を解放するには release を /// 呼び出すこと。こちらは、あくまで停止させるだけ。次にplayが /// 呼び出されれば、再度、先頭から再生させることが出来る。 /// <returns></returns> public YanesdkResult Stop() { CacheSystem.OnAccess(this); isPlayingLast = false; // stopは、channelごとに管理されているので、 // 自分が再生しているchannelなのかどうかを // このクラスが把握している必要がある if (NoSound) { return(YanesdkResult.NoError); } return(ChunkManager.Stop(this)); }
/// <summary>サーフェースに文字列を描画します。</summary> /// <remarks> /// サーフェースをnewしたくないときは、こちらを使うよろし。 /// </remarks> public void DrawBlended(Surface surface, string str) { CacheSystem.OnAccess(this); if (font != IntPtr.Zero) { SDL.TTF_SetFontStyle(font, style); IntPtr image = SDL.TTF_RenderText_Blended(font, str, color); RateCheck(ref image); surface.SDL_Surface = image; // setSurface(image); } else { surface.SDL_Surface = IntPtr.Zero; // setSurface(IntPtr.Zero); } }
/// <summary> /// テクスチャーを貼り付けるときに使う /// </summary> /// <remarks> /// この関数を呼び出したあと、 /// <code> /// glBegin(GL_POLYGON); /// glTexCoord2f(0 , 0); glVertex2f(-0.9 , -0.9); /// glTexCoord2f(0 , 1); glVertex2f(-0.9 , 0.9); /// glTexCoord2f(1 , 1); glVertex2f(0.9 , 0.9); /// glTexCoord2f(1 , 0); glVertex2f(0.9 , -0.9); /// glEnd(); /// </code> /// のようにすれば、テクスチャーをポリゴンにはりつけることが出来ます。 /// /// ※ OpenGLのコードが混在するのが嫌なら使わないで。 /// </remarks> public void Bind() { // bindのタイミングでcache systemにこのテクスチャを使用したことを通知する CacheSystem.OnAccess(this); if (loaded) { if (textureType == Gl.GL_TEXTURE_RECTANGLE_ARB) { Gl.glEnable(Gl.GL_TEXTURE_RECTANGLE_ARB); } Gl.glBindTexture(textureType, textureName); } }
unsafe private void DrawSolidUTF8_(Surface surface, byte[] str) { CacheSystem.OnAccess(this); if (font != IntPtr.Zero && str.Length > 0) { SDL.TTF_SetFontStyle(font, style); Array.Resize(ref str, str.Length + 1); // C文字列用の終端の '\0' を追加。 IntPtr image = SDL.TTF_RenderUTF8_Solid(font, str, color); RateCheck(ref image); surface.SDL_Surface = image; // setSurface(image); } else { surface.SDL_Surface = IntPtr.Zero; // setSurface(IntPtr.Zero); } }
/// <summary> /// loadMusicで読み込んだBGMをfadeさせる /// </summary> private YanesdkResult PlayMusicFade(int speed) { CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.PreconditionError); } ChunkManager.music = this; // チャンネルの占拠を明示 // volumeの設定(これは再生時に設定する) ChunkManager.SetVolume(0, Volume); return(SDL.Mix_FadeInMusic(music, loopflag, speed) == 0 ? YanesdkResult.NoError : YanesdkResult.SdlError); }
/// <summary> /// フェードイン付きのplay。speedはfade inに必要な時間[ms] /// </summary> /// <param name="speed"></param> /// <returns></returns> public YanesdkResult PlayFade(int speed) { CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.NoError); } Stop(); // 停止させて、sound managerの再生チャンネルをクリアしなければ if (music != IntPtr.Zero) { return(PlayMusicFade(speed)); } if (chunk != IntPtr.Zero) { return(PlayChunkFade(speed)); } return(YanesdkResult.PreconditionError); // Sound読み込んでないぽ }
/// <summary> /// loadで読み込んだサウンドを再生する /// </summary> /// <returns> /// 再生エラーならばYanesdkResult.no_error以外が返る /// </returns> public YanesdkResult Play() { // cache systemにこのSoundを使用したことを通知する CacheSystem.OnAccess(this); isPlayingLast = true; if (NoSound) { return(YanesdkResult.NoError); } Stop(); // 停止させて、sound managerの再生チャンネルをクリアしなければ if (music != IntPtr.Zero) { return(PlayMusic()); } if (chunk != IntPtr.Zero) { return(PlayChunk()); } return(YanesdkResult.PreconditionError); // Sound読み込んでないぽ }
/// <summary>サーフェースに文字列を描画します。</summary> /// <remarks> /// サーフェースをnewしたくないときは、こちらを使うよろし。 /// </remarks> public void DrawBlendedUnicode(Surface surface, string str) { CacheSystem.OnAccess(this); if (font != IntPtr.Zero) { SDL.TTF_SetFontStyle(font, style); IntPtr image = SDL.TTF_RenderUNICODE_Blended(font, str, color); RateCheck(ref image); // debug目的でsurfaceの種類を調べるためのコード unsafe { SDL.SDL_PixelFormat *format = (SDL.SDL_PixelFormat *)((SDL.SDL_Surface *)image)->format; int alpha = format->alpha; } surface.SDL_Surface = image; // setSurface(image); } else { surface.SDL_Surface = IntPtr.Zero; // setSurface(IntPtr.Zero); } }