Rensya

マウスのクリックで弾丸に見立てたカラーキューブを連射します。

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

プロジェクトの説明

  1. Shoot をベースに改造するので、Shoot のプロジェクトを準備して下さい。
    class Shoot のソースコードは、このページから取得して下さい。
  2. class Shoot を修正します。
    SetEnv() 関数でパラメータ(XMMATRIX *mat)を受け取り、mat の情報に従って描画環境を設定します。
    void Shoot::SetEnv(DirectX::XMMATRIX *mat)
    {
        DirectX::XMMATRIX   w;
        w = mat[0];
        Camera(w.r->m128_f32[12], w.r->m128_f32[13], w.r->m128_f32[14]);
        w.r->m128_f32[12] = 0.0f;
        w.r->m128_f32[13] = 0.0f;
        w.r->m128_f32[14] = 0.0f;
        XMStoreFloat4x4(&m_model, w);
    }
    
  3. それに伴い m_mat; の領域は不要になります。
        //DirectX::XMMATRIX m_mat;
    
  4. Sample3DSceneRenderer.h で連射領域を定義します。
    mov[10] は連射される弾丸の現在座標で、flag[10] は描画フラグです。
        float3      mov[10];
        bool        flag[10];
    
  5. Sample3DSceneRenderer.cpp の Constructor で連射の領域を初期化します。
        for(int i=0; i<10; i++)
        {   mov[i] = mat_camera->f3(0.0f, 0.0f, 0.0f);
            flag[i] = false;
        }
    
  6. Rotate() 関数で弾丸の移動と、画面の外に出た弾丸の flag[10] をリセットします。
    void Sample3DSceneRenderer::Rotate(float radians)
    {   for (int i = 0; i<10; i++)
        {   if (flag[i])
            {   mov[i].x -= 0.2f;
                mov[i].y -= 0.1f;
                if (mov[i].x<-20.0f)    flag[i] = false;
            }
        }
    }
    
  7. StartTracking() 関数で弾丸を発射します。
    現在未使用の領域を調べて、フラグと発射座標を設定します。
    void Sample3DSceneRenderer::StartTracking()
    {   int i;
        for (i = 0; i<10 && flag[i]; i++);
        if (i < 10)
        {   flag[i] = true;
            mov[i] = mat_camera->f3(16.0f, 10.0f, 0.0f);
        }
    }
    
  8. Render() 関数でフラグを調べて弾丸を描画します。
    SetEnv(&XMMatrixTranslation(mov[i].x, mov[i].y, mov[i].z)); で描画環境を設定します。
    パラメータで渡すのは変換行列(XMMATRIX)のポインターです。
    void Sample3DSceneRenderer::Render()
    {
        if (!m_loadingComplete) { return; }
        auto context = m_deviceResources->GetD3DDeviceContext();
    
        context->VSSetShader(m_vertexShader.Get(), nullptr, 0);
        context->PSSetShader(m_pixelShader.Get(), nullptr, 0);
        context->VSSetConstantBuffers(0, 1, m_constantBuffer.GetAddressOf());
        context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
        context->IASetInputLayout(m_inputLayout.Get());
    
        UINT stride = sizeof(VertexPositionColor);
        UINT offset = 0;
    
        //☆モデルを描画
        for (int i = 0; i < 10; i++)
        {   if (flag[i])
            {   shoot->SetEnv(&XMMatrixTranslation(mov[i].x, mov[i].y, mov[i].z));
                m_constantBufferData.projection = shoot->m_projection;
                m_constantBufferData.view = shoot->m_view;
                m_constantBufferData.model = shoot->m_model;
                context->UpdateSubresource(m_constantBuffer.Get(), 0, NULL, &m_constantBufferData, 0, 0);
                context->IASetVertexBuffers(0, 1, m_vertexBuffer.GetAddressOf(), &stride, &offset);
                context->IASetIndexBuffer(m_indexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0);
                context->DrawIndexed(m_indexCount, 0, 0);
            }
        }
    }
    
  9. マウスのクリックで左下から右上に向かって弾丸が発射されます。
    連続してクリックすると、同時に最大10発まで連射出来ます。

超初心者のプログラム入門(DirectX Store)