Platform SDK: DirectX

スプライトを描画するための準備

ここでは、Direct3DX ユーティリティ ライブラリを使用してスプライトを描画する前に必要な準備について、詳しく説明する。

レンダリング ターゲットにスプライトを転送する前に、適切なメソッドを呼び出して、シーンを開始し、レンダリング ターゲットをクリアする。

    hr = m_pd3dDevice->BeginScene();
 
    hr = m_pd3dx->Clear(D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER);

スプライトをレンダリングするために、D3DXPrepareDeviceForSprite 関数を呼び出してラスタライザを初期化する。一般に、この関数はレンダリングするすべてのスプライトに対して一度呼び出すだけでよい。ただし、レンダリング状態が D3DXDrawSpriteSimple 呼び出しの範囲外で変更される場合は、D3DXPrepareDeviceForSprite を再度呼び出す必要がある。

    ::D3DXPrepareDeviceForSprite(m_pd3dDevice);
    

ソース テクスチャ上のどこにスプライトを表示するかを定義する RECT 構造体をセットアップする。

    RECT srcRect;

スプライトを使用する場合、イメージはピクチャのグリッドから構成されることがよくある。この場合、ソースの RECT 構造体はフレームごとに異なる小矩形となる。たとえば、ピクチャのグリッドが 10 列と 6 行とする。x 座標を判定するには m_currentFrame % 10 (ただし、m_currentFrame はカレント フレーム) を計算する。y 座標を判定するには m_currentFrame / 10 を計算する。

    int iX = (m_currentFrame % 10);
    int iY = (m_currentFrame / 10);

各フレームは 64 ピクセル×64 ピクセルのセルに区切られる。

    srcRect.left = iX * 64;
    srcRect.top  = iY * 64;

ソースの RECT 構造体の各サブフレームは、幅が 64 ピクセルで、高さが 48 ピクセルである。

    srcRect.right  = srcRect.left + 64;
    srcRect.bottom = srcRect.top  + 48;

ここで、カレント ビューポートを取得する。

    D3DVIEWPORT7 viewport;
    hr = m_pd3dDevice->GetViewport(&viewport);

次に、このビューポートを RECT 構造体に変換する。

    RECT rectViewport;
    rectViewport.left   = viewport.dwX;
    rectViewport.top    = viewport.dwY;
    rectViewport.right  = viewport.dwX + viewport.dwWidth;
    rectViewport.bottom = viewport.dwY + viewport.dwHeight;

非回転レンダリング ターゲットをビューポートの中心とする。

    D3DXVECTOR3 pointDest; 
    pointDest.x = (float)viewport.dwX + (float)viewport.dwWidth  / 2.0f;
    pointDest.y = (float)viewport.dwY + (float)viewport.dwHeight / 2.0f;

この時点で、Direct3DX ユーティリティ ライブラリにより提供されているスプライト描画関数のいずれかを呼び出せば、スプライトを描画できる。

スプライトの描画方法については、「単純なスプライトの描画」および「トランスフォームされたスプライトの描画」を参照すること。

スプライトを描画した後、適切なメソッドを呼び出してシーンを終了し、フレームを更新すること。

    hr = m_pd3dDevice->EndScene();
    
    hr = m_pd3dx->UpdateFrame(D3DX_DEFAULT);