48 章
今回は音楽を付けてみましょう。
音楽は煉獄庭園さんの曲を利用させていただきました。
datフォルダのmusicフォルダに入っている曲を聞いてみて下さい。
oggファイルが開けない人はGOM Playerなどをインストールして聞いて下さい。
1面の曲っぽくはないですが、まぁこの辺は好きな曲に変更して下さい。
今回は
SetLoopPosSoundMemという関数を利用します。
PlaySoundMem関数でもループは出来ますが、曲というものは、大抵前奏があります。
ですから、ゲーム内でループ再生したいときで、曲のある部分までいって最初に戻る時、
曲の先頭まで戻ってしまっては都合が悪いときがあります。
それを解決してくれるのがこの関数で、指定したミリ秒位置がループが返って来る位置になります。
Audacityなどで曲のどの部分がループ位置になりそうか確認してみます。
例えばラスボス曲である0_1.oggのループになりそうな位置を拡大してみると
26.672秒つまり26672ミリ秒をループ位置に設定してやるとよさそうです。
--------------------------------------------------------------------
今回、そのエリアごとに保持すべき情報をもった構造体area_t型を用意しました。
その中にBGM系の変数の集合であるbgm_t型を用意しています。
---- struct.h に以下を追加 ---- //BGM情報(area_tで使用(48) typedef struct{ //BGMの再生フラグ、再生ハンドル、いつならすか再生種類番号をいれる、ループ位置 int flag,handle,knd[2],loop_pos[2]; }bgm_t; //そのエリアが持っている情報(48) typedef struct{ bgm_t bgm; }area_t; ---- GV.h に以下を追加 ---- GLOBAL area_t area;//そのエリアで持っているデータ(48) ---- function.h に以下を追加 ---- GLOBAL void delete_bgm(); GLOBAL void bgm_main(); ---- load.cpp 内の以下の部分を変更 ---- ChangeVolumeSoundMem関数内の音量を適当に調整しました。詳しくは省略
bgm_tには
flag, handle, knd[2], loop_pos[2];
を用意しました。音楽の再生状態は以下のような0〜4の状態を順番に遷移します。
0:まだ再生されていない
1:通常BGMを再生している
2:通常BGMをとめている
3:ラスボスBGMを流している
4:ラスボスBGMを止めている
0はそのエリアのゲームが始まったばかりの状態です。この時データを読み込みます。
1でいつ再生するかはkndで設定します。サンプルでは種類0の再生の仕方ははじまってから60カウント後としています。
設定した種類ごとに再生するタイミングを変更したいので、今後music.cppで再生の仕方を増やしていきましょう。
2はラスボスにさしかかった状態です。通常BGMをとめ、データを削除し、ラスボス音楽データを読み込み待機します。
3で再生します。
4でとめますが、まだとめる処理はサンプルでも書いていません。
loop_posは先ほどいったループの位置です。ini関数内でセットします。
[0]は通常BGM、[1]はラスボスBGMの設定です。
また、load_bgm関数でパスを作成していますね。
0_0を1面の通常BGM
0_1を1面のラスボスBGM
1_0を2面の通常BGM
1_1を2面のラスボスBGM
としていけばこの関数の仕様を引き継いで拡張出来ます。
---- ini.cpp に以下を追加 ---- memset(&area,0,sizeof(area_t));//(48) area.bgm.knd[0]=0;//通常BGMをどういうタイミングで再生するか、取り決めはmusic.cpp(48) area.bgm.knd[1]=0;//ボスBGMをどういうタイミングで再生するか、取り決めはmusic.cpp(48) area.bgm.loop_pos[0]=26672;//通常BGMのループ位置(48) area.bgm.loop_pos[1]=27010;//ボスBGMのループ位置(48) ---- GV.h に以下を追加 ---- GLOBAL area_t area;//そのエリアで持っているデータ(48) ---- function.h に以下を追加 ---- GLOBAL void delete_bgm(); GLOBAL void bgm_main(); ---- load.cpp 内の以下の部分を変更 ---- ChangeVolumeSoundMem関数内の音量を適当に調整しました。詳しくは省略 ---- music.cpp に以下を追加 ---- void load_bgm(int flag){ char str[64]; sprintf(str,"../dat/music/%d_%d.ogg",stage,flag); area.bgm.handle=LoadSoundMem(str); } void delete_bgm(){ DeleteSoundMem(area.bgm.handle); } void bgm_main(){ if(area.bgm.flag==0){//最初に読み込む load_bgm(0); SetLoopPosSoundMem( area.bgm.loop_pos[0], area.bgm.handle );//ループ位置セット area.bgm.flag=1; } if(area.bgm.flag==1){//種類に応じて再生をはじめる switch(area.bgm.knd[0]){ case 0://再生種類0なら if(stage_count==60){//はじまって60カウント後に再生 PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP); area.bgm.flag=2; } break; default: break; } } if(area.bgm.flag==2){//ボス出現時に読み込む if(stage_count==boss.appear_count[1]){//ラスボスが現れたら読み込む StopSoundMem(area.bgm.handle); delete_bgm(); load_bgm(1); SetLoopPosSoundMem( area.bgm.loop_pos[1], area.bgm.handle );//ループ位置セット area.bgm.flag=3; } } if(area.bgm.flag==3){ switch(area.bgm.knd[0]){ case 0://再生種類0なら if(stage_count==boss.appear_count[1]){//ラスボスが現れたら再生 PlaySoundMem(area.bgm.handle,DX_PLAYTYPE_LOOP); area.bgm.flag=4; } break; default: break; } } } ---- main.cpp に以下赤字部を追加 ---- case 100://通常処理 enter_func_tm("最初"); calc_ch(); enter_func_tm("キャラ計算"); ch_move(); enter_func_tm("キャラ移動"); cshot_main(); enter_func_tm("自機ショットメイン"); enemy_main(); enter_func_tm("敵処理メイン"); boss_shot_main();enter_func_tm("ボスショットメイン"); shot_main(); enter_func_tm("ショットメイン"); out_main(); enter_func_tm("当たり判定"); effect_main(); enter_func_tm("エフェクトメイン"); calc_main(); enter_func_tm("計算メイン"); graph_main(); enter_func_tm("描画メイン"); bgm_main(); enter_func_tm("BGMメイン"); if(boss.flag==0) stage_count++; break; default: printfDx("不明なfunc_state\n"); break;
実行結果
音が鳴るかどうかの違いなので目に見える違いはありません。
※練習してみよう※
このプロジェクトを実行し、ボス戦でわざとのんびりしてBGMを聞いてみて下さい。どこでループしているかわかるでしょうか。
この曲は煉獄庭園さんの曲で「裏桜華-CODE:桜樺-」という曲です。
http://www.rengoku-teien.com/mp3_wahuu.html
ダウンロードして、自分で曲を編集し、きっちり継ぎ目がわからないように編集、設定出来るかやってみて下さい。
※管理人から一言※
龍神録では容量の都合上、この「裏桜華-CODE:桜樺-」は仕方なく短くしてループしてあります。
しかしこの曲は4分以上あり、前半も後半もとてもよい曲です。
龍神録を何回かプレイしてくださった方は、全部聞いてみると「あれ、この曲にこんな部分あったんだ」みたいに思っていただけるかもしれません。
是非よい曲なので、もしよければ最初から最後まで聞いてみて下さい。
- Remical Soft -