■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第33夜:効果音(WAV)を鳴らす 前回までの内容で選択処理まで出来るようになって、ゲームとしての体裁は随分整ってきました。・・・が、何かまだ足りないものがあります。そう、音です♪ 一人静かに黙々とプレイする・・・というスタイルを否定する訳ではありませんが(笑)、やはり音の鳴らないゲームは片手落ちと言っても過言ではないでしょう。そんな訳で、今回は効果音としてWAVを再生してみましょう。サンプルソースはこちらになります。 ■マルチメディアって? ・・・とまあ冗談はさておき、WAVやMIDIを鳴らすにはライブラリの追加が必要です。VC++の統合環境からプロジェクト→設定を選び、開いたダイアログ内でリンクのタブをクリックしてください。するとオブジェクト/ライブラリモジュールと表示されたテキストBOXが現われますので、ここに winmm.lib を追加します。また、このライブラリの中身を使用するためには、ソースファイルの先頭で mmsystem.h のインクルードが必要になります。 ※winmm.lib は標準でVC++に付属してくるライブラリですが、ワークスペースを作るときにデフォルトで設定されるリンクライブラリには含まれません。そんな訳で手動で登録してやる必要があります。 ■PlaySound()で音を鳴らす |
bool PlaySound(LPCSTR pszSound,HMODULE
hmod,DWORD fdwSound);
|
を知っていれば充分だと思います♪ ここで言う単発とは、波形合成して複数のWAVを鳴らすことは出来ないという意味で、ループ再生はフラグ指定で可能です。とりあえずリソースWAVは無視してファイル読みに限定すると、以下のようにすれば即席で音が鳴らせます。 |
●単発再生 ●ループ再生 |
ここで ABC.WAV は再生したいWAVファイル名です。また↑ここではインスタンスハンドルにNULLを渡していますが、ここでいうインスタンスはリソースとしてWAVを含んでいるものを指しています。リソースWAVは実行ファイルに取りこまれる形でメモリ上に存在している音声ファイルのことですが、ゲームで使用する効果音をすべてリソースとして取りこんでしまうのはサイズ的に非現実的ですので(笑)、ここではファイル読みに徹して第2引数はNULLにしておくのが無難だと思います。
■コマンド書式 では、以上の処理をスクリプトコマンドの形でインプリメントしてみましょう。ここではコマンド仕様は以下のようなものにして話を進めます。@一発再生で終わる音、A延々とループしながら流したい音(波、風、虫の声など)の両方に対応したいので、フラグ付きのコマンドにします。 また WAVファイルはキャラクタを喋らせるようなゲームになると飛躍的に量が増えたりしますので、サブフォルダ .\WAV を作ってファイルはそこに入れるようにしましょう。
■フラグ 今回は Mode_stat に新たなメンバは加えません(タスク化する必要がありませんので…
^^)。 |
struct _WAV_stat {
extern _WAV_stat WAV_stat; //実体は Text_Com_03.cpp の中にあります。 |
■コマンド呼び出し部 TextEngine.cpp の Command_call() に以下の記述を追加します。う〜ん、コマンドも随分充実してきましたねぇ(^0^) void Command_call()
|
■コマンド実行部 【WAVを演奏する】 まずこれまでと同じ要領で、kaiseki_10() 、Kaiseki_TextStr() を用いてパラメータ解析を行います。パラメータの値に応じて PlaySound() に渡すフラグの値を決めて「一発演奏」か「ループ演奏」かを振り分ける訳ですね。その後はステータスを保持して PlaySound() を呼んでいます。パラメータ解釈の部分はほとんど定型作業なので他のコマンド記述部からカット&ペーストしても全然OKですね♪。 |
_WAV_stat WAV_stat;//ステータス保持用構造体 int Com_play_wav() {
|
【演奏を停止する】 演奏の停止はパラメータ解釈がないので超カンタンです。ファイル名に NULL を指定して PlaySound() を呼び、演奏を停止します。あとはステータスをクリアしておしまい。らくちんです♪ |
int Com_stop_wav() { //フラグ類の解除 return 0; |
そんな訳で、今回はおしまいです。 なお今回ソースに同梱したWAVファイルは 某所の某氏(ただいまインドの山奥で修行中につき情報秘匿中 ^^;)に提供して頂きました。 ご協力頂きありがとうございます〜 |