DirectX游戏编程入门——第二部分(游戏编程工具箱) ——打印文本

来源:互联网 发布:何老师都哭了知乎 编辑:程序博客网 时间:2024/05/18 02:19

     本系列文章由 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); }

测试字体输出





原创粉丝点击