16:フォントクラスを作る
黎明期のパソコンではグラフィック処理をするだけでも大変な処理能力が必要とされていたため、個人で作るゲームといえば、キャラクター(文字)ベースのゲームがあたりまえでした。このキャラクターベースのゲームで有名なものとして「ローグ」があげられます。
不思議なダンジョンシリーズのモチーフとなったゲームでもある
Direct3Dにおいても2Dグラフィックよりも文字列を扱うプログラムの方が簡単なので、まずは文字列の描画を行うクラスを作成しましょう。Direct3Dによるフォントの描画はID3DXFontインターフェースによって行われます。このインターフェースを基盤とするクラスを作成することで、数行のコーディングでフォント描画を実現できるようにします。
#pragma once
#include "GameObject.h"
class CDxFont : public CGameObject
{
private:
LPD3DXFONT font;
public:
CDxFont();
CDxFont(int fontsize);
~CDxFont();
BOOL Create(int fontsize);
void Draw(LPCTSTR text, int x, int y);
void Draw(LPCTSTR text, int count,
LPRECT pRect, DWORD Format, D3DXCOLOR Color);
const LPD3DXFONT GetD3DXFont();
};
#include "DxFont.h"
CDxFont::CDxFont()
{
font = NULL;
Create(16);
}
CDxFont::CDxFont(int fontsize)
{
font = NULL;
Create(fontsize);
}
CDxFont::~CDxFont()
{
RELEASE(font);
}
BOOL CDxFont::Create(int fontsize)
{
RELEASE(font);
int result = D3DXCreateFont(
pD3Ddevice, // 取得元となるデバイス
fontsize, // 幅
NULL, // 高さ(規定の高さ)
FW_DONTCARE, // 太さ(規定の太さ)
NULL, // ミップマップレベル(なし)
FALSE, // 斜体(なし)
ANSI_CHARSET, // 文字セット(ANSI)
OUT_DEFAULT_PRECIS, // 出力精度(標準)
DEFAULT_QUALITY, // 出力品質(標準)
DEFAULT_PITCH | FF_DONTCARE, // フォントピッチ&フォントファミリ(システムに任せる)
_T("MS UI Gothic"), // フォント名
&font // 格納先
);
return (result == 0) ? FALSE : TRUE;
}
const LPD3DXFONT CDxFont::GetD3DXFont()
{
return font;
}
void CDxFont::Draw
(LPCTSTR text, int count, LPRECT pRect,
DWORD Format, D3DXCOLOR Color)
{
if(font){
pSprite->Begin(NULL); // 2Dの描画開始を宣言
font->DrawText(
pSprite, // 描画に用いるスプライトオブジェクト
text, // 表示する文字列
count, // 表示する文字数。-1で文字列すべて
pRect, // 文字列を描画する範囲
Format, // 文字列描画設定
Color // 文字列描画色
);
pSprite->End(); // 描画終了の宣言
}
}
void CDxFont::Draw(LPCTSTR text, int x, int y)
{
// 最低限の指定だけですむものぐさ版
// [x, y]の位置を左上にして文字列が描画される
RECT rect = {x, y, x, y};
Draw(text, -1, &rect,
DT_NOCLIP | DT_SINGLELINE,
0xFFFFFFFF);
}
DT_BOTTOM | 指定枠の底に描画 | DT_CENTER | 指定枠の左右中央に描画 |
DT_LEFT | 指定枠の左に描画 | DT_NOCLIP | 枠からはみ出た文字も描画 |
DT_RIGHT | 指定枠の右に描画 | DT_SINGLELINE | 改行を無視する |
DT_TOP | 指定枠の上に描画 | DT_VCENTER | 指定枠の上下中央に描画 |
DT_WORDBREAK | 単語単位で改行 |
class CDxFontTest : public CGameObject
{
private:
CDxFont font;
protected:
void Exec();
};
void CDxFontTest::Exec()
{
font.Draw(_T("文字列描画のテストです"), 100, 100);
}
