以前作ったスプライト処理ですが、間違いを見つけました。今のままだとZ方向の移動が出来ず、奥行きが実現できません。
そんな訳でまず、CGraphicsBase::InitD3D()に以下のパラメータを追加します。これは奥行きを使うための宣言です。
d3dpp.EnableAutoDepthStencil=TRUE; d3dpp.AutoDepthStencilFormat=D3DFMT_D16; D3Device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
次にCGraphicsBase::DrawSpriteBase()の中の計算とかを変更します。これでZ方向にも移動できるようになりました。
なぜ2Dなのに奥行きが必要かというと、背景の手前にキャラクタを表示し、キャラクタの手前に文字や設定画面を表示させたいからです。前のままでも、描画の順番を奥から順に並べれば同じ事はできます。でも、描画命令はあっちこっちのクラスから投げられてくるので、管理がややこしくなりそうです。そのため、今のうちに厳密に設定させるという訳です。
//--------------------------------------------------------- // スプライト描画 void CGraphicsBase::DrawSpriteBase(int tex_no, RECT drawRect, float x, float y, float z, DWORD color, float angle, float scale_x, float scale_y) { D3DXMATRIX mat, mat1, mat2, mat3; float center_x, center_y; D3DXVECTOR3 Trans, Center; // マトリクス初期化 D3DXMatrixIdentity(&mat1); D3DXMatrixIdentity(&mat2); D3DXMatrixIdentity(&mat3); // マトリクスで拡大縮小回転移動 D3DXMatrixScaling(&mat1, scale_x, scale_y, 1); D3DXMatrixRotationZ(&mat2, D3DXToRadian(angle)); D3DXMatrixTranslation(&mat3, x, y, 0); mat=mat1*mat2*mat3; D3Sprite->SetTransform(&mat); // 移動 Trans=D3DXVECTOR3(0, 0, z); // 画像の中心 center_x=(float)(drawRect.right-drawRect.left)/2; center_y=(float)(drawRect.bottom-drawRect.top)/2; Center=D3DXVECTOR3(center_x, center_y, 0); // 描画 D3Sprite->Draw(Texture[tex_no]->Tex, &drawRect, &Center, &Trans, color); }