D3DXFontによる文字描画

文字の描画を実装してみます。

http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%CA%B8%BB%FA%CE%F3%C9%C1%B2%E8

// フォントの設定
SPDXFont DXClass::CreateFont (int height) {

    D3DXFONT_DESC lf;
    lf.Height          = height;
    lf.Width           = 0;
    lf.Weight          = 0;//FW_NORMAL;
    lf.MipLevels       = 0;
    lf.Italic          = FALSE;
    lf.CharSet         = SHIFTJIS_CHARSET;
    lf.OutputPrecision = OUT_TT_ONLY_PRECIS;//0;//OUT_TT_ONLY_PRECIS
    lf.Quality         = DEFAULT_QUALITY; // PROOF_QUALITY
    lf.PitchAndFamily  = DEFAULT_PITCH | FF_DONTCARE; //FIXED_PITCH | FF_MODERN
    lstrcpy(lf.FaceName, "MS ゴシック");

    // ID3DXFontコンポーネント生成
    LPD3DXFONT pD3DFont;
    HRESULT hr = D3DXCreateFontIndirect(m_pd3dDevice, &lf, &pD3DFont);

    if ( FAILED(hr) ) {
        // エラー時どうするか
        exit(EXIT_FAILURE);
    }

    return SPDXFont(new DXFont(pD3DFont));
}

まずFontコンポーネントを作成します。色々引数があるのですが、今回はとりあえずフォントサイズだけを指定できるようにしておきます。今後他の設定も必要になれば拡張する感じです。

戻り値の型は以下のような前回勉強したスマートポインタをtypedefで定義した物です。

typedef std::tr1::shared_ptr<DXFont> SPDXFont;

さて次は描画のメソッドです。

// 文字の描画
void DXClass::DrawText (SPDXFont pFont,TCHAR* str,float x,float y,DWORD color,int alpha) {
    RECT r={static_cast<int>(x),static_cast<int>(y),0,0};
    HRESULT hr = pFont->pFont()->DrawText(
        NULL,
        str,
        -1,
        &r,
        DT_LEFT | DT_NOCLIP,
        ((alpha<<24) | (color & 0xffffff))
    );
    if ( FAILED(hr) ) {
        // エラー時どうするか
        exit(EXIT_FAILURE);
    }
}

描画の場合は文字列、座標、色、透明度の指定をできるようにしてみました。

ちなみに各種メソッド内でのエラー処理をどうすればいいのか迷い中です。例外を投げるのがいいのかどうか。とりあえずは今は処理が続行されたらどこでエラーになったか分からなくなるのでexitを呼んでいます。

このあたりの例外処理に関してもどうするか考えないといけないですね。

実行結果



んー、できたにはできましたが何の面白みも無いですね。というかそろそろゲームっぽいものを作っていかないと前に進みませんね。道のりは長いです。