まず文字ですが、前回LPD3DXFONT(D3DebugFont)に必要なパラメータを入れて初期化してるので、あとはDrawTextA()で表示するだけです。ちなみにこの関数、DirectX8と同名で別物だったんで、ちょっと苦労した(汗) ネットで検索しても、新旧両方のバージョンが入り混じってるからなぁ。
次はスプライト(画像)を表示させます。DirectX8以降、スプライトは3Dテクスチャとして扱われてるので、テクスチャ関連のクラスを使います。ファイルからD3DXCreateTextureFromFile()でテクスチャとして読み込み、オブジェクトLPDIRECT3DTEXTURE9に格納します。そしてDraw()で描画します。今回のスプライトまわりは直打ちで汚いので、後ほど作り直します。
それらを画面に出力します。背景をClear()で青に塗りつぶし、描画部分をBeginScene()とEndScene()で囲います。最後にPresent()で出力。
ようやく画面が表示されました。そういえばフレームレートは何となく50FPSにしてみた。次回はグラフィックまわりを突き詰めるか、入力系のどちらかにします。
//---------------------------------------------------------
// テクスチャ読み込み
BOOL CGraphicsBase::CreateTextureBase(LPCTSTR filename, LPDIRECT3DTEXTURE9 *tex)
{
if(D3DXCreateTextureFromFile(D3Device, filename, tex)!=S_OK) {
MessageBox(NULL, "テクスチャの読み込みに失敗しました", "CGraphicsBase::CreateTextureBase", MB_OK);
return E_FAIL;
}
return S_OK;
}
//---------------------------------------------------------
// スプライト描画
void CGraphicsBase::DrawSpriteBase(int tex_no, RECT drawRect, int x, int y, int damage)
{
RECT srcRect;
SetRect(&srcRect, 0, 0, 128, 128); // テクスチャ切り出し
D3DXVECTOR3 Center=D3DXVECTOR3(0, 0, 0); // センター
D3DXVECTOR3 Position=D3DXVECTOR3(100, 100, 0); // 位置
// 描画
D3Sprite->Draw(Texture[tex_no]->Tex, &srcRect, &Center, &Position, D3DXCOLOR(1,1,1,1));
}
//---------------------------------------------------------
// レンダリング
void CGraphicsBase::Render()
{
RECT drawRect;
char text[100];
if (D3Device==NULL) {
return;
}
// バックバッファを青でクリアする
D3Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0);
// シーン開始
D3Device->BeginScene();
// スプライト描画
D3Sprite->Begin(D3DXSPRITE_ALPHABLEND);
SetRect(&drawRect, 0, 0, 128, 128);
DrawSpriteBase(0, drawRect, 100, 100);
D3Sprite->End();
// デバッグ文字表示
if (System->DebugFlag==1) {
SetRect(&drawRect, 0, 0, strlen(text)*32, 32);
System->GetFPS(text);
D3DebugFont->DrawTextA(NULL, (char *)text, -1, &drawRect, (DT_SINGLELINE | DT_LEFT | DT_TOP | DT_NOCLIP), 0xFFFFFFFF);
}
// シーン終了
D3Device->EndScene();
// シーンを表示する
D3Device->Present(NULL, NULL, NULL, NULL);
}
