リアルな爆発を演出できたはいいものの、やはり「ボーン」とか「ババハッ」とか、効果音がなければシラけてしまいますよねf(^^)。今回は、ショット発射と敵機爆発の2つのタイミングに効果音をセットしてみます。
Vol9. DirectMusicを利用したWAVE/MIDIの再生で解説済みのCAudioクラスを利用して効果音を再生します。このCAudio、下記のような簡単な順序でWAVEファイルを再生することができてしまうんです☆
CAudioオブジェクトを生成効果音として利用するWAVEファイルは、ゲームに使えそうな効果音を配布してくださっている、ULTIMATEゲーム事業部などのWebサイトから調達すると良いでしょう。
これら2つのWAVEファイルは、プロジェクトが保存されているディレクトリに新たにsoundsディレクトリを作成し、その中にコピーしておいてください。
前回のVol22. 【2Dシューティング】爆発を演出しようで作成したコードに手を加える形で作業を進めます。赤色で示すコードが前回からの変更点または追加点です。
CAudioオブジェクトポインタを定義します。今回は、ショット音と爆発音の効果音を鳴らすので、pAudio_Shot及びpAudio_Blastの2つを定義します。
#include "fight.idx"
Dim ScreenX=640 As Long 'ディスプレイの幅 (ピクセル単位)
Dim ScreenY=480 As Long 'ディスプレイの高さ(ピクセル単位)
' TODO: この位置にグローバル変数を定義してください。
Const SCREENBASE_X=140 'ゲーム画面左上のスクリーンX座標
Const SCREENBASE_Y=0 'ゲーム画面左上のスクリーンY座標
Const SCREEN_WIDTH=360 'ゲーム画面の幅
Const SCREEN_HEIGHT=480 'ゲーム画面の高さ
Const MAX_SHOTS=50 '弾の最大数
Const MAX_ENEMIES=50 '敵機の最大数
Const MAX_BLASTS=50 '爆発の最大数
'DirectInput用
Dim pInKey As *CInputKeyboard
'背景画像
Dim pImage_BackGround As *CImage2D
'キャラクタマップ画像
Dim pImage_CharaMap1 As *CImage2D
Dim pImage_CharaMap2 As *CImage2D
'ショット(弾)を管理する配列
Dim pShotsArray[ELM(MAX_SHOTS)] As *CShot
Dim ShotTime As Long, TempTime_Shot As Long
'自機クラス
Dim pMyPlane As *CPlane
'敵機クラス
Dim pEnemiesArray[ELM(MAX_ENEMIES)] As *CEnemie
Dim TempTime_Enemie=0 As Long
'爆発を管理する配列
Dim pBlastsArray[ELM(MAX_BLASTS)] As *CBlast
'音源クラス
Dim pAudio_Shot As *CAudio 'ショット音
Dim pAudio_Blast As *CAudio '爆発音
ショットを発射する瞬間、即ちCPlane::Shotが呼び出される瞬間に、pAudio_Shot->Playを呼び足してショット音を再生します。
'---------------
' 自機クラス
'---------------
Class CPlane
'位置・高さ・幅
x As Long
y As Long
width As Long
height As Long
'移動スピード
speed As Long
'傾き
RudderSituation As Single
'自機が画面からはみ出さないようにチェックする関数
Sub EreaOutCheck()
If x-width/2<0 Then
x=width/2
End If
If x+width/2>SCREEN_WIDTH Then
x=SCREEN_WIDTH-width/2
End If
If y-height/2<0 Then
y=height/2
End If
If y+height/2>SCREEN_HEIGHT Then
y=SCREEN_HEIGHT-height/2
End If
End Sub
Public
'コンストラクタ
Sub CPlane()
width=32
height=32
'初期位置
x=SCREEN_WIDTH/2
y=SCREEN_HEIGHT*0.8
'初期スピード
speed=5
End Sub
'デストラクタ
Sub ~CPlane()
End Sub
'描画
Sub Draw()
Dim TextureX As Long, TextureY As Long
TextureX=32*(Fix(RudderSituation)+2)
TextureY=0
pImage_CharaMap1->DrawStretch(
x-width/2 +SCREENBASE_X,
y-height/2 +SCREENBASE_Y,
width,
height,
TextureX,
TextureY,
32,
32)
End Sub
'自機を移動させる関数
Sub MoveUp()
y=y-speed
EreaOutCheck()
End Sub
Sub MoveDown()
y=y+speed
EreaOutCheck()
End Sub
Sub MoveLeft()
x=x-speed
EreaOutCheck()
If RudderSituation>-2 Then
'左方向に移動中は自機の傾きをマイナス値にする
RudderSituation=RudderSituation-1/speed
End If
End Sub
Sub MoveRight()
x=x+speed
EreaOutCheck()
If RudderSituation<2 Then
'右方向に移動中は自機の傾きをプラス値にする
RudderSituation=RudderSituation+1/speed
End If
End Sub
Sub NoMove()
'移動していないときは自機の傾きを0に近づける
If RudderSituation<0 Then
RudderSituation=RudderSituation+1/speed
ElseIf RudderSituation>0 Then
RudderSituation=RudderSituation-1/speed
End If
End Sub
Sub Shot()
'弾を撃つ
Dim pShot As *CShot
pShot=New CShot(x,y-width/2)
'発射音を再生
pAudio_Shot->Play()
End Sub
End Class
爆発が起きたとき、即ちCBlastオブジェクトが生成されたときにpAudio_Blast->Playを呼び出して爆発音を再生します。
'-----------------
' 爆発クラス
'-----------------
Class CBlast
'位置
x As Long
y As Long
width As Long
height As Long
TempTime As Long
TempStep As Long
Public
Sub CBlast(sx As Long, sy As Long)
x=sx
y=sy
width=32
height=32
TempTime=0
TempStep=-5
AddBlast(VarPtr(This))
'爆発音を再生
pAudio_Blast->Play()
End Sub
Sub ~CBlast()
DeleteBlast(VarPtr(This))
End Sub
Sub Draw()
pImage_CharaMap2->DrawStretch(
x-width/2 +SCREENBASE_X,
y-height/2 +SCREENBASE_Y,
width,
height,
Abs(TempStep)*32,
160,
width,
height)
TempTime=TempTime+1
If TempTime=3 Then
If TempStep>=5 Then
'爆発しきったとき
Delete VarPtr(This)
Exit Sub
End If
TempStep=TempStep+1
TempTime=0
End If
End Sub
End Class
ショット音、爆発音として利用する2つのCAudioオブジェクトを初期化します。同時再生をしなければならないので、SetSecondaryを呼び足してセカンダリモードに設定します。
Function InitProc()
'DirectXを初期化
If dx_Init(hMainWnd,ScreenX,ScreenY,FALSE)=0 Then
InitProc=0
Exit Function
End If
'マウスカーソルを非表示にする
ShowCursor(FALSE)
' TODO: この位置にアプリケーションの初期化コードを記述してください。
'キーボードデバイスオブジェクトを生成
pInKey=New CInputKeyboard
'背景画像を生成
pImage_BackGround=New CImage2D
pImage_BackGround->SetTexture("back_ground.bmp",D3DCOLOR_XRGB(0,0,0))
'キャラクタマップイメージを生成
pImage_CharaMap1=New CImage2D
pImage_CharaMap1->SetTexture("chara_map1.bmp",D3DCOLOR_XRGB(0,0,0))
pImage_CharaMap2=New CImage2D
pImage_CharaMap2->SetTexture("chara_map2.bmp",D3DCOLOR_XRGB(0,0,0))
'自機を生成
pMyPlane=New CPlane
'-----------------------
' Direct Musicの初期化
'-----------------------
'ショット音
pAudio_Shot=New CAudio
pAudio_Shot->Load("sounds\hyupa2.wav")
pAudio_Shot->SetSecondary()
'爆発音
pAudio_Blast=New CAudio
pAudio_Blast->Load("sounds\bokan.wav")
pAudio_Blast->SetSecondary()
InitProc=1
End Function
2つのCAudioオブジェクトのストップと破棄を行います。
Sub QuitProc()
' TODO: この位置にアプリケーションの終了処理を記述してください。
'キーボードデバイスオブジェクトを破棄
Delete pInKey
'背景画像を破棄
Delete pImage_BackGround
'キャラクタマップイメージを破棄
Delete pImage_CharaMap1
Delete pImage_CharaMap2
'自機を破棄
Delete pMyPlane
'-------------------------
' Direct Musicの終了処理
'-------------------------
pAudio_Shot->Stop()
Delete pAudio_Shot
pAudio_Blast->Stop()
Delete pAudio_Blast
'DirectXの終了処理
dx_Quit()
End Sub
ショットを発射したとき、敵機が爆発したときの効果音を聞くことができましたでしょうか?効果音があるだけで雰囲気が全く違いますね☆
講座インデックスへ戻る | ©2005 Discoversoft |