1.フォント生成


0.とりあえず生成

ということで前回初期化したIDirect3DDevice9を使用してフォントを生成します。
フォントの生成
static bool CreateFont(LONG width, LONG height, LONG weight, const char* faceName)
{
    D3DXFONT_DESC fd;
    fd.Width = width;
    fd.Height = height;
    fd.Weight = weight;
    fd.MipLevels = D3DX_DEFAULT;
    fd.Italic = FALSE;
    fd.CharSet = DEFAULT_CHARSET;
    fd.OutputPrecision = OUT_DEFAULT_PRECIS;
    fd.Quality = DEFAULT_QUALITY;
    fd.PitchAndFamily = DEFAULT_PITCH;
    strcpy_s(fd.FaceName, faceName);

    if(FAILED(D3DXCreateFontIndirect(g_pDevice_, &fd, &g_pFont_)))
    {
        return false;
    }

    return true;
}
と関数呼び出しは上のようになります。引数はそれぞれ、
Widthフォントの幅。
Heightフォントの高さ。
Weightフォントの太さ。
MipLevelsミップマップレベルの数。
Italic斜体かどうか。
CharSetフォントの文字セット。
OutputPrecisionフォントの選択方法に関する設定。
Qualityフォントの選択方法に関する設定2。
PitchAndFamily文字の間隔に関する設定(固定、可変)。
FaceNameフォント名。
という感じになっています。
で上記の関数がtrueを返せば、フォントの生成は成功です。
次は実際にフォントを使って描画を行います。

1.描画関数

文字列の描画関数
static void DrawText(float x, float y, int dtFormat, DWORD color, const char* format, ...)
{
    char va_str[512];
    va_list list;
    va_start(list, format);
    vsprintf_s(va_str, format, list);

    RECT rect;
    SetRect(&rect, (int)x, (int)y, SCREEN_WIDTH, SCREEN_HEIGHT);

    g_pFont_->DrawText(0, va_str, -1, &rect, dtFormat, color);
}
とりあえず上のような形になりました。
x,yで描画位置、dtFormatで描画の種類(左寄せ、中央寄せ、右寄せ)などの設定、colorで描画色の設定を行い、
printfのような感じで書式指定子と不定個引数を渡せるようにしました。
実装自体は、まずformat...から出力する文字列を作り、Direct3Dでは描画位置の指定を、描画領域の指定として、
矩形領域を使って指定する為、渡された描画位置を左上とした画面サイズ分の矩形を作っているぐらいで、
後は単純にIDirect3DFontDrawFont()を呼び出しています。

2.解放

で使い終わったらいつものように解放します。
解放部分はポインタのみが変化してその他の部分が処理が変化しないため他の方もよくやっている次のような関数マクロを用意しました。
DirectXオブジェクトの解放用マクロ
#define SafeReleaseD3D(p) if((p) != 0){ (p)->Release(); (p) = 0; }
ということでフォントの解放は次のようになります。
フォントの解放
    SafeReleaseD3D(g_pFont_);
単純です。
次回はこれまでに作ってきたDirect3D関連の処理をクラスとしてまとめてみようかと思います。
今回のソース。
戻る。