トップページ > 過去ログ > 記事閲覧
14歳からはじめるC言語の
名前:プログラマー希望者 日時: 2009/06/06 19:33

初めまして。現在ゲームプログラミングを勉強しているものです。『14歳から始めるC言語ゲームプログラミング』の4章で使用しているPlaySoundMem()について質問があります。ご教授をお願いします。 4章のサンプルプログラムでは、 @WinMain関数内でwhileループに入る前に  PlaySoundMem()でタイトル用BGMを鳴らす。 Aタイトル画面を描画するDrawGameTitle()内で  キー入力を待ってからタイトル用BGMを止め、  ゲーム本編用のBGMを鳴らす。 という処理をしています。ただ、個人的に DrawGameTitle内でタイトル用BGMを鳴らして、 ゲーム本体を実行するDrawGameMain()内で ゲーム本編のBGMを鳴らすという方がしっくり くるので、以下のように変更しました。 int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) {      〜〜〜〜中略〜〜〜〜〜  SetDrawScreen(DX_SCREEN_BACK); //PlaySoundMem(openmusic,DX_PLAYTYPE_LOOP);      〜〜〜〜中略〜〜〜〜〜 } void DrawGameTitle() { PlaySoundMem(openmusic,DX_PLAYTYPE_LOOP);      〜〜〜〜中略〜〜〜〜〜 StopSoundMem(openmusic); PlaySoundMem(clip4, DX_PLAYTYPE_BACK); //PlaySoundMem(backmusic,DX_PLAYTYPE_LOOP); } void DrawGameMain() { PlaySoundMem(backmusic, DX_PLAYTYPE_LOOP);       〜〜〜〜中略〜〜〜〜〜 } DrawGameOver()とDrawGameClear()内のPlaySoundMem(openmusic,DX_PLAYTYPE_LOOP)も コメントアウトしています。 この場合、タイトル画面のBGMは鳴るのですが、 ゲーム本編のBGMが鳴りません。DrawGameTitle()の PlaySoundMem()のコメントを外せば鳴ります。 DrawGameMain()内でPlaySoundMem()を使用しても BGMが鳴らない原因はどういう理由からなのでしょうか?

Page: 1 |

Re: 14歳からはじめるC言語の ( No.1 )
名前:管理人 日時:2009/06/07 00:18

 プログラムをよく見てみるとお気づきになると思いますが、DrawGameMain は一秒間に 60回程呼ばれる関数ですので、その冒頭で PlaySoundMem を実行してしまうと一秒間に 60回もBGMが再生されることになります  一つのサウンドハンドルで同時に鳴らせる数はデフォルトでは3つまでですので、 それ以上同時に鳴らそうとした場合は以前に鳴った音を止めて、再度最初から再生しようとします なので、恐らく曲の冒頭部分が再生された時点で音が止まってしまっているのだと思います DrawGameTitle は逆に関数に入ったらボタンが押されるまで出ないので、 冒頭部分に再生処理を書いておけばそれでうまく動作するわけです 確かにゲーム本編のBGMですから DrawGameMain で鳴らした方がすっきりしますが、 恐らくこのような理由で一度だけ実行される DrawGameTitle の最後にゲーム本編の BGMを再生する処理を書いたのだと思います
Re: 14歳からはじめるC言語の ( No.2 )
名前:プログラマー希望者 日時:2009/06/07 23:24

ありがとうございます! 正直まだ理屈が分かった程度の状況で、 リフレッシュシートの部分は特に勉強が必要な 部分なのですが、何となくイメージはつかめました。 早速のご回答ありがとうございました。

Page: 1 |