本系列文章由 net_assassin 整理编写,转载请注明出处。
http://blog.csdn.net/net_assassin/article/category/1100363
作者:net_assassin 邮箱: net_assassin@hotmail.com 期待着与志同道合的朋友们相互交流
本章我们将学习使用ID3DXFont创建字体并在屏幕上打印文本的方法。这个类使我们可能使用任何安装在Windows系统中的TrueType字体来打印文本。不过建议只使用标准字体。
创建字体
在过去我喜欢使用基于位图的字体,其字体集以ASCII顺序储存在一个位图文件中。在装载了这个位图之后,这种字体借用精灵的特性将字符串中的每个字符渲染出来。这样做的结果是我们会得到一种在现实效果上和我们所期望的完全一致的字体,因为我们在控制着原位图。
DirectX提供了一个字体类,它抽象了整个过程,从而使我们可以不必太关注其内部逻辑(例如满载字体的位图图像)而花更多的时间在游戏代码上。ID3DXFont接口用于创建字体,其指针版已经预定义好了:
LPD3DXFONT font;
创建字体对象
D3DXCreateFontIndirect(d3ddev,&desc,&font);
desc 是 D3DXFONT_DESC 结构,定义如下:
D3DXFONT_DESC desc = {
size, //height
0, //width
0, //weight
0, //miplevels
false, //italic
DEFAULT_CHARSET, //charset
OUT_TT_PRECIS, //output precision
CLIP_DEFAULT_PRECIS, //quality
DEFAULT_PITCH, //pitch and family
"" //font name
};
可重用的MakeFont函数
将所有这些代码放到一个可重用的函数中,然后添加到游戏库中。这个函数需要字体明晨及字体点尺寸作为参数,它返回一个指向LPD3DXFONT 对象的指针。
LPD3DXFONT MakeFont(string name, int size)
{
LPD3DXFONT font = NULL;
D3DXFONT_DESC desc = {
size, //height
0, //width
0, //weight
0, //miplevels
false, //italic
DEFAULT_CHARSET, //charset
OUT_TT_PRECIS, //output precision
CLIP_DEFAULT_PRECIS, //quality
DEFAULT_PITCH, //pitch and family
"" //font name
};
strcpy(desc.FaceName, name.c_str());
D3DXCreateFontIndirect(d3ddev, &desc, &font);
return font;
}
使用ID3DXFont打印文本
void FontPrint(LPD3DXFONT font, int x, int y, string text, D3DCOLOR color)
{
//figure out the text boundary
RECT rect = { x, y, 0, 0 };
font->DrawText( NULL, text.c_str(), text.length(), &rect, DT_CALCRECT, color);
//print the text
font->DrawText(spriteobj, text.c_str(), text.length(), &rect, DT_LEFT, color);
}