DirectXプログラミング講座 〜Vol23. 【2Dシューティング】効果音で臨場感を〜

リアルな爆発を演出できたはいいものの、やはり「ボーン」とか「ババハッ」とか、効果音がなければシラけてしまいますよねf(^^)。今回は、ショット発射と敵機爆発の2つのタイミングに効果音をセットしてみます。


今回のサンプルプロジェクト

効果音の再生ってどんな風にやるの?

Vol9. DirectMusicを利用したWAVE/MIDIの再生で解説済みのCAudioクラスを利用して効果音を再生します。このCAudio、下記のような簡単な順序でWAVEファイルを再生することができてしまうんです☆

CAudioオブジェクトを生成

CAudio::Loadを呼び出してWAVEファイルをロード

CAudio::Playを呼び出してサウンドを再生(何回でも呼び出しOK)

CAudio::Stopを呼び出してサウンドを停止

CAudioオブジェクトを破棄

WAVEファイルの用意

効果音として利用するWAVEファイルは、ゲームに使えそうな効果音を配布してくださっている、ULTIMATEゲーム事業部などのWebサイトから調達すると良いでしょう。

これら2つのWAVEファイルは、プロジェクトが保存されているディレクトリに新たにsoundsディレクトリを作成し、その中にコピーしておいてください。

コーディング作業

前回のVol22. 【2Dシューティング】爆発を演出しようで作成したコードに手を加える形で作業を進めます。赤色で示すコードが前回からの変更点または追加点です。

"fight.abp" の先頭部分のコーディング

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のコーディング

ショットを発射する瞬間、即ち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のコーディング

爆発が起きたとき、即ち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

InitProc関数のコーディング

ショット音、爆発音として利用する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

QuitProc関数のコーディング

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