インデックスに戻る ←前のチャプター →次のチャプター

6. Delphi+Quadruple D+Alpha Oggを用いたOgg Vorbis 再生機能の実装

1.実装

ソースとバイナリ

今回、チャプター5-3で作ったソースコードに、新たにコードを付け加えてOgg Vorbis再生機能を実装します。
できあがりのソースコード・バイナリはこちらです。 ただし、Ogg Vorbisファイルのみ同梱していませんから、解凍したら、前のチャプターで紹介したwuAlphaOggに同梱されているur_beijing.oggを忘れずコピーしておいてください

解説

wuAlphaOggは、Quadruple D 3に含まれるDDSDコンポーネントと、wuvorbis.dllを使用して、Ogg Vorbisを、いわゆるストリーム再生します。
今回、そのwuAlphaOggを更に薄くラッピングして簡単に使えるようにしたPNAlphaOgg.pasも併用して、簡単にOgg Vorbisを再生させてみることにします。

私PCNOMが書いたPNAlphaOgg.pasは、wuAlphaOggで必要な初期化等の代行を行って簡単に使えるようにしたものですが、かわりに、DDSDコンポーネントの0チャンネルを決め打ちで使うこと、Ogg Vorbisは単channelでしか再生できないということ、再生位置調整不可、イコライザー使用不可といった制限があります。
将来的に効果音をDDSDで再生したくなったりしたら、1channel以降を使用して下さい。
また、Ogg Vorbis再生マルチチャネル化やイコライザー・再生位置調整等は、wuAlphaOggに付属されているサンプルを見れば、割と簡単に実装できると思います。
興味のある方は是非試して下さい。
今回はえらく機能を絞り込んでいますので、簡単にOgg Vorbisを鳴らすことが出来ます。
では、これから、Ogg Vorbisを鳴らすための具体的な説明を行っていきます。

DDSDコンポーネントの追加

ここまで読んでいると言うことは、すでにQuadruple Dのインストールは終わっているわけですから、超簡単です。
下の絵のように、適当にコンポーネントを、いわゆるポトペタしてください。
DDSDコンポーネントをポトペタ

PNAlphaOggをuses説に追加

今回、TPNAlphaOggクラスを使用しますので、Interface部のuses節にPNAlphaOggを追加して下さい。
PNAlphaOggがあるフォルダへのライブラリパスはもう通ってますよね?
通ってなかったら、前のチャプターをよく読み直して設定して下さい。


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DGCarad9, SXLib9, d3d9, s_mathpack, AppEvnts, Ddidex, MMSystem,
  ddsd, PNAlphaOgg;

TPNAlphaOgg型変数をTForm1のメンバーに追加

TPNAlphaOggクラス変数をTForm1のメンバーとして追加します。
今回は、他のクラスから参照されるわけでもないので、privateでいいでしょう。

TPNAlphaOggクラスからインスタンス(オブジェクト)生成

オブジェクト指向を少し勉強すればわかりますが、クラス型変数は、メモリ上で実際扱うためのインスタンスが必要なので、Form1のOnCreateイベント内(このソースコードではTForm1.FormCreate手続き)でこれを生成します。
蛇足ですが、ここらへんの知識は、ポインタの知識とわりとカブります。


  ogg:=TPNAlphaOgg.create(ddsd1);

プログラム終了時のインスタンス解放

生成したインスタンスは使わなくなったら解放してやらないといけません。
今回は、Form1のOnDestroyイベントでやります。
ソースコードでいうところの、TForm1.FormDestroy手続き内ですね。


  ogg.free;

なお、クラスのメンバーは直接freeせずfreeandnilを使うべきだ、との意見もあるんですが、今回は簡単にfreeで済ませることにします。
この件について興味のある方は、オライリー・ジャパンから出ているDELPHI クイックリファレンスという本のP.51〜P.52を読んでみて下さい。

ゲームが始まったら鳴らすようにする

タイトル画面でZキーを押して、ゲームが始まったら音楽がスタートするようにしましょう。
このソースコードでは、makegraphicメソッドの中です。
具体的には、下のように、オープンしてボリューム決めて、プレイするだけの簡単操作です。


  0://タイトル画面
    begin
      DDIDEX1.Scan(DI_KEYB);//キー入力のチェック
      if DDIDEX1.Buttons[DI_B1] then//DDIDEXでは、デフォルトで、Zキーは
                                    //DI_B1に割り振られている
        begin
          //自機と敵弾の初期化
          //自機の初期座標を決める
            player.x:=320;
            player.y:=240;

          //敵弾の状態を初期化。全てOFFに。
            for tmpint:=0 to Maxbullet-1 do
              begin
                bullet[tmpint].Flag:=false;
              end;

          //敵弾発射番号の初期化
            nextbullet:=0;



          gamemode:=1;//ゲームモードにする。

          ogg.open('ur_beijing.ogg');//ogg vorbisファイルをオープン
          ogg.volume:=1.0;//ボリュームは0.0以上1.0以下で指定
          ogg.play(true);//音楽スタート trueだと再生ループあり。falseだとループなし
          exit;
        end;
      //画面のクリア、色は黒で
//      Scene.Clear(D3DCLEAR_TARGET, $000000, 1.0, 0);
      Scene.Clear(D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, $FF000000, 1.0, 0);
      //タイトル画像を表示
      putsprite(titletexture,0,0);

    end;

ゲーム中、自機が敵弾に当たったら音楽を止める

最後に、ゲーム中、敵弾に当たってゲームが終了したら、音楽を止めましょう。
具体的にはogg.stopとやるだけです。超簡単。


            //自機と敵弾のあたり判定をチェック。
        for tmpint:=0 to MaxBullet-1 do
          begin
            if bullet[tmpint].Flag then
              begin
                if collision(//自機と敵弾それぞれのあたり判定が重なっているかチェック
                            Rect(
                                  player.x-player.hitx,
                                  player.y-player.hity,
                                  player.x+player.hitx,
                                  player.y+player.hity
                                  ),
                            Rect(
                                  round(bullet[tmpint].x-bullet[tmpint].hitx),
                                  round(bullet[tmpint].y-bullet[tmpint].hity),
                                  round(bullet[tmpint].x+bullet[tmpint].hitx),
                                  round(bullet[tmpint].y+bullet[tmpint].hity)
                                )
                            ) then
                    begin
                      gamemode:=0;//タイトル画面に戻らせて
                      ogg.stop;//音楽も止めて
                      exit;//今の手続きはここで処理を終了させる。
                    end;
                end;

          end;

できあがり

Ogg Vorbisを鳴らすためのコード追加は以上です。
見ての通り超簡単です。
是非、一度実際にバイナリを動かして試してみて下さい。
自分の書いたプログラムが、動いて音を出すのはなかなか感動しますよ。

あ、最後にもう一度書いときますけど、ur_Beijing.oggはちゃんとwuAlphaOggのフォルダからコピーしておいてくださいね。
でないと、音鳴りませんから。