Startreck から弾を発射する

Startreck から敵機に向けて弾を発射します。

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

プログラムの説明

  1. Global variables の定義です。
    g_pMesh1, g_pMesh2, g_pMesh3 はエンタープライズとエネミーとトーピードウのメッシュです。
    start が弾の発射座標で、target が敵艦の座標で、vect が魚雷の座標です。
    今回は弾の発射座標と目標座標を固定して発射してみました。
    step は vect の単位時間あたりの XYZ の移動量です。
    flag は 魚雷の描画フラグです。
    oldtime と nowtime で前回描画してからの経過時間を計算します。
        //Global variables
        HWND                    g_hWnd   = NULL;
        LPDIRECT3D9             g_pD3D   = NULL;
        LPDIRECT3DDEVICE9       g_pDEV   = NULL;
        LPD3DXMESH              g_pMesh1 = NULL;    //Enterprise.x
        LPD3DXMESH              g_pMesh2 = NULL;    //Enemy3
        LPD3DXMESH              g_pMesh3 = NULL;    //Torpedo2
        D3DMATERIAL9*           g_pMat1  = NULL;
        D3DMATERIAL9*           g_pMat2  = NULL;
        D3DMATERIAL9*           g_pMat3  = NULL;
        LPDIRECT3DTEXTURE9*     g_pTex1  = NULL;
        LPDIRECT3DTEXTURE9*     g_pTex2  = NULL;
        LPDIRECT3DTEXTURE9*     g_pTex3  = NULL;
        DWORD                   g_Num1   = 0L;
        DWORD                   g_Num2   = 0L;
        DWORD                   g_Num3   = 0L;
        char                    XFile1[24] = "Enterprise.x";
        char                    XFile2[24] = "Enemy3.x";
        char                    XFile3[24] = "Torpedo2.x";
        D3DXVECTOR3             ViewForm(0.0f,50.0f,-500.0f);   // 視点座標
    
        //弾発射の座標計算領域
        D3DVECTOR               vect=  { 0.0f,50.0f,0.0f };     // Torpedo の現在座標
        D3DVECTOR               start= { -80.0f,-50.0f,0.0f };  // 発射座標(Enterprise)
        D3DVECTOR               target={ 220.0f,100.0f,300.0f };// 目標座標(Enemy)
        D3DVECTOR               step;                           // 弾の移動量
        bool                    flag= FALSE;                    // 弾の描画フラグ
        DWORD                   oldtime,nowtime;                // 経過時間の取得
        
  2. WinMain() はいつもと同じです。
    メッセージループでキーをチェックする KeyCheck() を呼んで下さい。
        int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
        {   MSG     msg;
                     :
            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() 関数です。
    oldtime と nowtime を設定して SetupMatrices() で描画環境を設定します。
    g_pMesh1 と g_pMesh2 を描画します。
    flag が ON のとき g_pMesh3 を描画します。
        VOID Render()
        {   DWORD    i;
    
            //Clear the backbuffer and the zbuffer
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,50,50),1.0f,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   //描画環境の設定
                oldtime= nowtime;
                nowtime= timeGetTime();
                SetupMatrices();
                FrameMove1();
                //g_pMesh1 を描画
                FrameMove2();
                //g_pMesh2 を描画
                FrameMove3();
                if (flag)
                {   //g_pMesh3 を描画
                }
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  5. Enterprise の描画環境の設定です。
    画面中央から左に寄せて、右後向きに描画します。
        HRESULT FrameMove1()
        {   D3DXMATRIX  matWorld,matWork;
            //画面の左に移動
            //正面から後右向きに回転
            return S_OK;
        }
        
  6. Enemy の描画環境の設定です。
    画面中央から右に寄せて、奥のほうに右向きに描画します。
        HRESULT FrameMove2()
        {   D3DXMATRIX  matWorld,matWork;
            //画面の右に移動
            //正面から左向きに回転
            return S_OK;
        }
        
  7. Torpedo の描画環境の設定です。
    経過時間分だけ座標を移動します。
    Torpedo の座標が画面の外(Enemy の後)に移動すると flag をリセットします。
        HRESULT FrameMove3()
        {   D3DXMATRIX  matWorld,matWork;
            float       dttime;
            if (flag==FALSE)    return S_OK;
            //nowtime - oldtime の経過時間分だけ座標を移動
            //描画範囲を超えたとき flag をリセット
            return S_OK;
        }
        
  8. KeyCheck() でキーのタイプを検出します。
    ESC でプログラムを終了します。
    SPACE が押されて flag==FALSE のとき Torpedo の座標を設定して flag をセットします。
        void KeyCheck()
        {   BYTE    KeyBuffer[256];
    
            //キーボードの状態を読み取る
            //ESC でプログラムを終了する
            //SPACE が押されて flag==FALSE のとき
            {   //Torpedo の座標を設定する
                //step を設定する
                //flag= TRUE;
            }
        }
        
  9. MsgProc() と Cleanup() はいつもと同じです。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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

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

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