今回、チャプター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を鳴らすための具体的な説明を行っていきます。
ここまで読んでいると言うことは、すでにQuadruple Dのインストールは終わっているわけですから、超簡単です。
下の絵のように、適当にコンポーネントを、いわゆるポトペタしてください。
今回、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のメンバーとして追加します。
今回は、他のクラスから参照されるわけでもないので、privateでいいでしょう。
オブジェクト指向を少し勉強すればわかりますが、クラス型変数は、メモリ上で実際扱うためのインスタンスが必要なので、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のフォルダからコピーしておいてくださいね。
でないと、音鳴りませんから。