ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Soundのバグ

SoundクラスのLoad(string filename,int ch)のソースで

else if (ch>=0 && ch<=8) result = LoadChunk(filename,ch-1);

となっているので、チャンネルに1を指定した場合にLoadChunkで0番を指定したことになってしまう。ということで、次のように修正。

else if (ch>=0 && ch<=8) result = LoadChunk(filename,ch);


チャンネルに2以上を指定した場合などに、Play()を呼ぶと戻り値がSdlErrorとなってしまう。
PlayChunk()のソースでSDL.Mix_PlayChannelを読んでいる部分、

return SDL.Mix_PlayChannel(ch , chunk , loopflag) == 0 ?
    YanesdkResult.NoError : YanesdkResult.SdlError;

return SDL.Mix_PlayChannel(chunkChannel-1, chunk, loopflag) == 0 ?
    YanesdkResult.NoError : YanesdkResult.SdlError;

どうやら、SDL.Mix_PlayChannelの戻り値はチャンネル番号らしい(未確認)ので、以下のように修正。

return SDL.Mix_PlayChannel(ch , chunk , loopflag) == ch ?
    YanesdkResult.NoError : YanesdkResult.SdlError;

return SDL.Mix_PlayChannel(chunkChannel-1, chunk, loopflag) == chunkChannel-1 ?
    YanesdkResult.NoError : YanesdkResult.SdlError;


あと、チャンネル番号に0を指定しておまかせで再生したとき、再生停止を頻繁に繰り返していると、停止できなくなったり、鳴っているのにIsPlaying()がfalseを返してしまうことがある。内部のチャンク情報が食い違ってしまうらしいが、なにが原因なのかは調査中。