ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

フレームワークのデバッグ用文字列表示

出力ウィンドウにデバッグ用の文字列を表示する方法は分かったが、今度は画面上にデバッグ用の文字列を表示したかったので調べてみた。
サンプルフレームワークのSimpleSampleを見ると、SDKmisc.hに定義されているCDXUTTextHelperというクラスが使えそうだと分かったのでEmptyProjectでも使えるようにしてみた。簡単にいくかとおもったら、結構変更しなければいけない箇所が多かったので忘れないようにメモ。

SDKmisc.h, SDKmisc.cppをプロジェクトに追加
これらはEmptyProjectでもプロジェクトフォルダ内のDXUT\Optionalフォルダにインストールされているのでここから追加。しかしパスが通っていないので、プロジェクトのプロパティを開いてC/C++の全般の"追加インクルードディレクトリ"の項目にDXUT\Core;DXUT\Optionalと設定。
ライブラリファイルd3dx10d.libの追加
SDKmisc.cppでDirectX10関連の関数を参照しているので、プロジェクトのプロパティを開いてリンカの入力の"追加の依存ファイル"の項目にd3dx10d.libを追加。
DLLの遅延読み込みの設定
リンカの"DLLの遅延読み込み"の項目にd3dx10d_35.dllを追加。これを追加しないと実行したときにd3dx10d_35.dllを読みにいってしまい、DirectX9環境では見つからずにエラーになってしまう。

あとはコードにCDXUTTextHelperを使うためのコードを追加。
グローバル変数として次のコードを追加。

CDXUTTextHelper* g_pTxtHelper = NULL;
ID3DXFont*       g_pFont9 = NULL;
ID3DXSprite*     g_pSprite9 = NULL;

OnD3D9CreateDevice()でフォントを作成する。

HRESULT hr;
V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
                          OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 
                          L"Arial", &g_pFont9 ) );

OnD3D9ResetDevice()でデバイスがリセットされたときの処理を追加。

HRESULT hr;

if( g_pFont9 ) V_RETURN( g_pFont9->OnResetDevice() );
V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pSprite9 ) );
g_pTxtHelper = new CDXUTTextHelper( g_pFont9, g_pSprite9, NULL, NULL, 15 );

OnD3D9LostDevice()でデバイスがロストしたときの処理を追加。

if( g_pFont9 ) g_pFont9->OnLostDevice();
SAFE_RELEASE( g_pSprite9 );
SAFE_DELETE( g_pTxtHelper );

OnD3D9DestroyDevice()でデバイスが破棄されたときの処理を追加。

SAFE_RELEASE( g_pFont9 );

あとはOnD3D9FrameRender()で実際に描画処理。BeginScene()とEndScene()の間で次のような感じ。

g_pTxtHelper->Begin();
g_pTxtHelper->SetInsertionPos( 5, 5 );
g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
g_pTxtHelper->DrawTextLine( L"TEST" );
g_pTxtHelper->End();

これで画面上に文字列を表示することが出来るようになった。