fps 値 (frames per second:一秒間に画面を更新した回数) を表示するために必要なので、
デバッグ用の文字表示として、文字列の表示を用意しました。
今回は、次のソースを使います。
今回は、独立性を考えて、クラス化してみました。 文字列表示用に定義したクラスは次のとおりです。
class CMyFont{
private:
LPD3DXFONT m_lpFont;
public:
CMyFont(){m_lpFont = NULL;};
virtual void Init(LPDIRECT3DDEVICE8 lpD3DDEV, int w, int h); // 初期化 (DirectX の初期化の後に呼ぶ)
virtual void Print(char *str, int x, int y, D3DCOLOR color=0xffffffff); // 表示
virtual void Clean(); // オブジェクトの開放
};
フォントの為のインターフェイスは、LPD3DXFONT です。
このポインタを、メンバー変数として表示オブジェクトごとに用意します。
表示するときは、Print を毎フレーム使います。文字列 str と、位置 x, y を指定します。
白以外の色で文字を表示したいときには、さらに D3DCOLOR 型で色を指定します。
実際に使うときには、次のように使います。 ありがちな Hello world を作ってみました。 次の関数は、WinMain のウィンドウを作成した後です。
// Direct3D の初期化
if(SUCCEEDED(InitD3D(hWnd))){
sFont.Init(s_lpD3DDEV, 12, 24);// ★★★★★ Direct3D の初期化
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
// メインループ
MSG msg;
while (!s_end)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
// メッセージの処理
}else{
// Direct3D の描画
// バックバッファと Z バッファをクリア
s_lpD3DDEV->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
// シーン開始
s_lpD3DDEV->BeginScene();
// 描画などの処理
sFont.Print("Hello world!", 0,0);// ★★★★★ フォントの描画
// シーン終了
s_lpD3DDEV->EndScene();
if (FAILED(s_lpD3DDEV->Present(NULL,NULL,NULL,NULL)))
s_lpD3DDEV->Reset(&s_d3dpp);// バックバッファをプライマリバッファにコピー
}
}
}
// 終了
sFont.Clean(); // ★★★★★ フォントの後かたずけ
RELEASE(s_lpD3DDEV);
RELEASE(s_lpD3D);
return 0;
DirectX として表示するので、BeginScene と、EndScene の間で表示します。
実は、初期化が一番大切です。
ここで、フォントの種類及び、サイズを指定します。
CreateFont でフォントを設定、作成した後に、D3DXCreateFont で、DirectX で使えるように設定します。
void CMyFont::Init(LPDIRECT3DDEVICE8 lpD3DDEV, int w, int h)
{
HDC hTextDC = NULL;
HFONT hFont = NULL, hOldFont = NULL;
hTextDC = CreateCompatibleDC(NULL);
hFont = CreateFont( h, w, 0, 0,
FW_REGULAR,
FALSE,FALSE,FALSE,
SHIFTJIS_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
"MS ゴシック"
);
if(!hFont) return;
hOldFont = (HFONT)SelectObject(hTextDC, hFont);
if( FAILED( D3DXCreateFont( lpD3DDEV, hFont, &m_lpFont ) ) ) {
MessageBox( 0, "D3DXCreateFontIndirect FALSE", "ok", MB_OK);
return;
}
SelectObject(hTextDC, hOldFont);
DeleteObject(hFont);
}
表示するときには、RECT 型の長方形で、表示領域を設定して、DrawText で表示します。
void CMyFont::Print( char *str, int x, int y, D3DCOLOR color )
{
RECT rect;
rect.left = x;
rect.right = WIDTH;
rect.top = y;
rect.bottom = HEIGHT;
// デバイス上に、整形した テキストを描画する
m_lpFont->DrawText(str, -1, &rect
,DT_LEFT | DT_EXPANDTABS
,color
);
}
後始末は、作成したオブジェクトを開放します。
void CMyFont::Clean()
{
RELEASE(m_lpFont);
}