ゲーム開発6:文字と画像を表示する

36e2abd7.gif引き続きDirect3Dでグラフィックスします。

まず文字ですが、前回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);
}

コメントを残す

メールアドレスが公開されることはありません。