デバッグフォントを表示しよう
ゲーム開発をしていると画面に文字を出したい時がよくあります。
現在の状況やプレイヤーの位置、敵の数、時間等。
確認したい情報が沢山あります。
必要になる都度ブレイクポイントで止めて値を確認したり、
出力ウィンドウに出力して確認するのも手間です。
そういった時は画面に文字で表示して確認できると楽になります。
ID3DXFont
ID3DXFontはDIrectX9のD3DX(ヘルパー機能)に入っているフォント描画用のオブジェクトです。
今回はこのID3DXFontを使って文字を表示する実装の方法を記載していきます。
ちなみにID3DXFontは比較的に低速な機能なのでノベルゲーム程度であれば問題ありませんが、速度が求められる環境下では推薦できる機能ではありません。
なので今回はデバッグ機能として利用する前提で記述していきます。
ID3DXFontの初期化
ID3DXFontの初期化は簡単に出来るようになっています。
ID3DXFont* pFont; D3DXFONT_DESC desc; desc.Height = 14; desc.Width = desc.Height / 2; desc.Weight = 400; desc.MipLevels = D3DX_DEFAULT; desc.Italic = FALSE; desc.CharSet = DEFAULT_CHARSET; desc.OutputPrecision = OUT_DEFAULT_PRECIS; desc.Quality = DEFAULT_QUALITY; desc.PitchAndFamily = FIXED_PITCH | FF_MODERN; ZeroMemory(desc.FaceName, sizeof(desc.FaceName)); D3DXCreateFontIndirect( GetDirect3DDevice(), &desc, &pFont );
D3DXFONT_DESCにフォントの設定を指定してD3DXCreateFontIndirectに渡すだけです。
では重要な部分だけ説明していきます。
・Height, Width
そのまま縦と横の幅です。
横幅は半角の際は高さの半分なので2で割った値を入れています。
・Weight
フォントの太さを表します。
・Italic
フォントを斜体にするか?
・FaceName
使用するフォント名
特に指定が無ければNULLで問題ありません
解放は例にもれずにSAFE_RELEASEです。
SAFE_RELEASE(pFont);
これでフォントが初期化と解放ができます。
フォントの描画
フォントの描画も初期化が完了していれば簡単です。
DrawTextで描画が出来ます。
描画処理
RECT rect; SetRect(&rect, 0, 0, 0, 0); // 描画範囲の取得 pFont->DrawText(NULL, pText, -1, &rect, DT_LEFT | DT_CALCRECT, color); // 描画 OffsetRect(&rect, X, Y); pFont->DrawText(NULL, pText, -1, &rect, DT_LEFT, color);
何故か2回描画しているのですが、これはID3DXFontの仕様で描画範囲を指定してその範囲内に描画するようになっています。
一度目のDrawTextではDT_CALCRECTを指定して描画範囲の取得をしています。
そして2度目のタイミングで描画範囲にX, Yの位置にオフセット移動して描画しています。
これで画面にpTextの内容を画面に表示します。
フォント描画関数の実装
フォント描画用の関数は下記のようなものがあれば使い勝手がいいかと思います。
void DrawText(int X, int Y, D3DCOLOR color, const char* pText) { if( s_pFont == NULL ) return; RECT rect; SetRect(&rect, 0, 0, 0, 0); // 描画範囲の取得 pFont->DrawText(NULL, pText, -1, &rect, DT_LEFT | DT_CALCRECT, color); // 描画 OffsetRect(&rect, X, Y); pFont->DrawText(NULL, pText, -1, &rect, DT_LEFT, color); }
通常のテキスト描画関数です。
先ほど書いていた処理のまんまですね。
次に少し使い勝手のいい関数を実装しましょう。
void DrawFormatText(int X, int Y, D3DCOLOR color, const char* pFormat, ...) { char temp[MAX_PATH]; va_list list; va_start(list, pFormat); vsprintf_s(temp, pFormat, list); va_end(list); DrawText(X, Y, color, temp); }
DrawFormatText関数ではフォントをprintfのように可変引数で渡せるようにしてあります。
可変引数の内容で文字列を作り直してから画面に表示します。
これがあれば数値も簡単に画面に表示することができますね!
フォント描画が出来れば色々なデバッグ機能が実装できるのでなるべく早めに実装しましょう!