続いてBGMの扱いについて説明します。
ゲームはBGMや効果音が無いと寂しいものです。
逆にBGMや効果音があるだけで雰囲気や手ごたえを出す事が出来たりします。
まずはBGMとなる曲データを用意しなければなりません。
※このシステムで使用可能なBGMデータの形式は「mp3」と「mid」のみです。
私には音楽の才能は欠片もありませんので、インターネット上のフリー素材に頼ります。
今回使用するBGMは「魔王魂」様よりお借りした曲を使います。
「魔王魂」様のゲーム向けBGM素材、イベントの曲にある「イベント45」をmp3形式でダウンロードしました。
※特にこの曲でなければならない、と言う訳ではありませんので、皆さんは好きなBGMを選んでいただいて結構です。
※もちろん他のサイトのものでも構いませんが、利用規約などはよく読んでから使うようにしてください。
ダウンロードしたファイルは、プロジェクトフォルダの「Resource\\BGMフォルダ」に入れておきます。
私が選んだ曲のファイル名は「game_maoudamashii_7_event45.mp3」でした。
BGMもリソース(資源)の1つですから、テクスチャ(画像)と同じように扱います。
「GameBase.h」を開き、パス付ファイル名を定数化しましょう。
//----------------------------------------------------------------------------- //ゲーム中で使用するテクスチャ、BGM、SE、フォントのパス付ファイル名を書きます。 //----------------------------------------------------------------------------- namespace KeyString { const std::string TEXTURE_SAMEGAME = "Resource\\Texture\\Samegame.png"; const std::string BGM_GAME = "Resource\\BGM\\game_maoudamashii_7_event45.mp3"; } |
ゲーム中のBGMなので「BGM_GAME」と言う名前にしました。
「SceneGame.cpp」の「Start関数」でBGMをロードします。
//============================================================================= // シーンの実行時に1度だけ呼び出される開始処理関数 //============================================================================= void SceneGame::Start() { m_pEngine->AddTexture(TEXTURE_SAMEGAME); m_pEngine->LoadBGM(BGM_GAME); m_samegame.Initialize(4); m_bStalemate = false; } |
画像は「AddTextuire関数」を使っていますが、BGMは「LoadBGM関数」を使います。
画像は1度に複数の画像を扱う事があるため、Add(追加)出来るようにしています。
BGMは1度に2曲再生する事はないため、Load(読み込み)としています。
ですから、
m_pEngine->LoadBGM(BGM_TITLE); m_pEngine->LoadBGM(BGM_GAME); m_pEngine->LoadBGM(BGM_RESULT); |
のように一気に3つのBGMをロードしたとしても、一番最後のBGMしか残っていません。
ロードしたBGMは「PlayBGM関数」で再生出来ます。
「LoadBGM関数」でロードした後、再生してみましょう。
//============================================================================= // シーンの実行時に1度だけ呼び出される開始処理関数 //============================================================================= void SceneGame::Start() { m_pEngine->AddTexture(TEXTURE_SAMEGAME); m_pEngine->LoadBGM(BGM_GAME); m_pEngine->PlayBGM(); m_samegame.Initialize(4); m_bStalemate = false; } |
1曲しか読み込めませんので引数はありません。
最後に読み込んだ曲を再生します。
実行してBGMが再生されるかどうか試してください。
※再生されない場合、次の事を確認してください。
「Resource\\BGMフォルダ」に音楽ファイルが入っているか?
パス名やファイル名を間違っていないか?
mp3、mid以外の形式のファイルではないか?
初心者の方は無理やり拡張子を変えてしまう荒業を繰り出す事もあります。
拡張子が「m4a」のファイルを、無理やり「mp3」に変えてしまうとか・・・
拡張子を変えただけでは「ファイル形式」を変える事は出来ません。
私が選んだBGMデータは「1分23秒」の曲でした。
ゲームをやっている最中に「1分23秒」を超えてしまったらどうなるか、実際に試してください。
曲が終わったら、もう再生される事はありませんね。
連続してBGMを再生させたい場合は「LoopBGM関数」を使います。
この関数は、BGMが再生されているかどうかを調べ、止まっていた場合再生する関数です。
BGMの状態を確認するため、シーンの「Update関数」に書いておく事が望ましいです。
//============================================================================= // シーンの実行時に繰り返し呼び出される更新処理関数 //============================================================================= void SceneGame::Update() { if (m_samegame.IsStalemate()) { m_bStalemate = true; } POINT point = m_pEngine->GetMousePosition(); m_samegame.SelectBlock(point); if (m_pEngine->GetMouseButtonSync(DIK_LBUTTON)) { if (!m_bStalemate) { m_samegame.DeleteBlock(); } else { m_nowSceneData.Set(Common::SCENE_EXIT, false, NULL); } } m_pEngine->LoopBGM(); } |
もう1度、実行して繰り返し再生されるかどうか試してください。
BGMを止めたい場合は「StopBGM関数」を使います。
実はシーンが変わってもBGMは止まりません。
シーンの切り替え時にBGMを止めたい場合「Exit関数」で「StopBGM関数」を呼び出します。
//============================================================================= // シーンの終了時に呼び出される終了処理関数 //============================================================================= void SceneGame::Exit() { m_pEngine->StopBGM(); } |
このプログラムはシーン切り替えがありませんから、終わった時に終了シーンに移ってしまいます。
終了シーンに移ってアプリケーションが終了する際には、BGMは自動的に止まります。
使わなくなったBGMを解放するには「ReleaseBGM関数」を使います。
これも「Exit関数」で呼び出してみましょう。
//============================================================================= // シーンの終了時に呼び出される終了処理関数 //============================================================================= void SceneGame::Exit() { m_pEngine->StopBGM(); m_pEngine->ReleaseBGM(); } |
実際には「LoadBGM関数」を実行すると、BGMが停止し解放され、新しいBGMが読み込まれますので使用頻度は高くないと思います。
最後に、このシステムを使う場合の注意点を書いておきます。
「PlayBGM関数」を「Update関数」などの繰り返し実行される関数内で呼び出すと音が鳴らなくなります。
「PlayBGM関数」はBGMを曲の先頭から再生する関数です。
繰り返し呼び出されると、最初の音が出る前に曲の先頭に戻ってしまい、音が出ない状態になります。