当たり判定と効果音

弾の連射と当たり判定を行い、効果音を鳴らします。
当たり判定を調整するために、矢印キーで Enemy を移動します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. Global variables の定義です。
    Audio は Audio Class の Object です。
    SEFile[] はヒットしたときに鳴らす効果音です。
    弾は最大10発まで連射できることにしました。
    step[] と vect[] は各弾ごとの移動量と座標です。
    flag[] は弾の描画フラグです。
    shtime は連射の速度を調整する変数です。
        //Audio Object Class
        Audio       AUDIO;
        char        SEFile[24]= "14_5.wav";
    
        //弾発射の座標計算領域
        D3DVECTOR               start= { -80.0f,-50.0f,0.0f };  // 発射座標(Enterprise)
        D3DVECTOR               target={ 220.0f,100.0f,300.0f };// 目標座標(Enemy)
        D3DVECTOR               step[10];                       // 弾の移動量
        D3DVECTOR               vect[10];                       // Torpedo の現在座標
        bool                    flag[10];                       // 弾の描画フラグ
        DWORD                   oldtime,nowtime,shtime;         // 経過時間の取得
        
  2. WinMain() はいつもと同じです。
    初期化が完了したら効果音をロードして下さい。
        int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
        {   MSG     msg;
                 :
            //Initialize Direct3D
            if (InitGraphics(g_hWnd)==FALSE)    return FALSE;
            AUDIO.Load(SEFile);
                 :
            ZeroMemory(&msg,sizeof(msg));
            while(msg.message!=WM_QUIT)
            {   if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
                {   TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
                else
                {   KeyCheck();
                    Render();
                }
            }
                  :
        
  3. InitGraphics() ではデバイスの初期化を行った後で、三枚のメッシュを入力します。
  4. Render() 関数は前回と同じ要領です。
    FrameMove3() は個々の弾ごとに呼び出します。
            for(n=0; n<10; n++)
            {   if (flag[n])
                {   FrameMove3(n);
                    for(i=0; i<g_Num3; i++)
                    {   g_pDEV->SetMaterial(&g_pMat3[i]);
                        g_pDEV->SetTexture(0,g_pTex3[i]);
                        g_pMesh3->DrawSubset(i);    // Draw the mesh subset
                    }
                }
            }
        
  5. Enterprise の描画環境の設定も前回と同じ要領です。
  6. FrameMove1() と FrameMove2() も前回と同じ要領です。
  7. Torpedo の描画環境の設定です。
    経過時間分だけ座標を移動します。
    Torpedo の座標が画面の外(Enemy の後)に移動すると flag をリセットします。
    Torpedo と Enemy の当たり判定をします。
    シューティングゲームの当たり判定は厳密にしても意味が無く、プレイをした感じで設定します。
    最も簡単な当たり判定は、XYZ座標を大小関係で調べる方法です。
    実用的なのは、中心からの距離で判定する方法でしょうか?
    Sqrt((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2)
    ヒットすると効果音を鳴らし、flag をリセットします。
        HRESULT FrameMove3(int n)
        {   D3DXMATRIX  matWorld,matWork;
            float       dttime;
    
            //nowtime - oldtime の経過時間分だけ座標を移動
            //描画範囲を超えたとき flag をリセット
            //当たり判定
            //ヒットしたときの処理
            AUDIO.Play();
            flag[n]= FALSE;
            return S_OK;
        }
        
  8. KeyCheck() でキーのタイプを検出します。
    ESC でプログラムを終了します。
    上下左右の矢印キーで Enemy を移動します。
    SPACE が押されて弾に余裕があるとき(最大10発) Torpedo の座標を設定して flag をセットします。
        void KeyCheck()
        {   BYTE    KeyBuffer[256];
    
            // キーボードの状態を読み取る
            // ESC でプログラムを終了する
            // 矢印キーで Enemy の移動
            // Space キーで弾を発射(連射)
        }
        
  9. MsgProc() と Cleanup() はいつもと同じです。

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)