【阅读笔记之十】《DIRECTX.9.0.3D游戏开发编程基础》:Direc3D中的字体

Direct3D中的字体

 

      1. 在游戏中,我们常常要向用户显示一些文字信息。Direct3D有3中生成和输出文本的方式。本章学习目标如下:

          1) 了解如何用ID3DXFont接口绘制文本;

          2) 了解如何使用CD3DFont绘制文本;

          3) 了解如何计算应用程序每秒所绘制的帧数;

          4) 了解如何用D3DXCreateText函数创建并绘制3D文本;

         

      2. ID3DXFont接口

          1)创建接口对象

             运用D3DXCreateFontIndirect函数创建一个ID3DXFont接口对象。在创建之前,需要填充一个D3DXFONT _DESC的一个结构。这个结构中包含了您要创建的字体一些描述信息,包括高度,宽度等。

          2)绘制文本

             一旦获取了D3DXFont接口对象的指针,只需调用ID3DXFont::DrawText即可完成文本绘制。函数原型如下:

//
INT ID3DXFont::DrawText(
	LPD3DXSPRITE pSprite,	//指定字符串所属的ID3DXSprite对象接口
				//可设为默认0或者NULL,表示在当前窗口中绘制字符串
	LPCSTR pString,		//指定将要绘制的字符串的指针
	INT Count,		//字符串中字符个数,若该值为-1,则认为pString指向一个以NULL结尾的字符串
	LPRECT pRect,		//指定字符串绘制的矩形区域的位置
	DWORD Format,		//指定字符串在矩形区域格式化方法
	D3DCOLOR Color		//文本颜色
        );

             3)计算每秒绘制的帧数

           下面详细讲解如何计算程序每秒绘制帧数FPS。如下:

//
// 1.首先初始化3个全局变量
DWORD FrameCnt = 0;
float TimeElapsed = 0;
float FPS = 0;

// 2.计算FPS函数如下
void CalcFPS(float timeDelta)	//timeDelta为相邻帧之间的时间差
{
	FrameCnt++;
	TimeElapsed += timeDelta;
	if(TimeElapsed >= 1.0f)
	{
		FPS = (float)FrameCnt/TimeElapsed;
 		TimeElapsed = 0 ;
		FrameCnt = 0;
	}
}


     3. CD3DFont类

          CD3DFont也用于绘制文本,但是CD3DFont绘制文本时借助的是Direct3D而非GDI,所以其绘制速度比ID3DXFont要快得多。但是该类也有缺陷,CD3DFont不能支持那些复杂的字体和格式。使用者可以视具体情况选择使用。

         1)创建CD3DFont类

           创建CD3DFont类,只需要像普通C++对象那样进行实例化即可。该类的构造函数原型如下:

CD3DFont(const TCHAR * strFontName,	//一个以NULL结尾的字符串,指定字体的名称
	 DWORD dwHeight,		//字体高度
	 DWORD dwFlags = 0L		//创建标记,可选。可设为0或者以下标记的组合
					//D3DFONT_BOLD, D3DFONT_ITALIC, D3DFONT_ZENABLE
	);


          创建好该类对象之后,需要初始化,如下:

Font = new CD3DFont("Times New Roman", 16, 0);
Font->InitDeviceObject(Device);
Font->RestoreDeviceObject();

         2)绘制文本

           创建并且初始化之后,就可以用函数CD3DFont::DrawText绘制文本了。

         3)清理工作

           在删除一个CD3DFont类对象之前,需要调用一些清理函数,如下面代码段所示:

Font->InvalidateDeviceObject();
Font->DeleteDeviceObject();
delete Font;

 

      4. D3DXCreateText函数

        该函数用于创建文本的3D网格。该函数原型如下:

HRESULT D3DXCreateText(
	LPDIRECT3DDEVICE9 pDevice,	//指向于网格相关的设备
	HDC hDc,			//设备环境句柄
	LPCTSTR pText,			//指向文本的指针
	FLOAT Deviation,		//TrueType字体轮廓的最大弦偏差
	FLOAT Extrusion,		//沿Z轴负方向度量的字体深度
	LPD3DXMESH * ppMesh,		//返回所创建的网格
	LPD3DXBUFFER * ppAdjacency,	//返回所创建的网格临接信息,如果不需要,指定为NULL
	LPGLYPHMETRICSFLOAT pGlyphMetrics	
	);

       

     5. 示例

        下面示例显示了创建文本的3D网格的代码。

HDC hdc = CreateCompatibleDC(0);
HFONT hFont;
HFONT hFontOld;

//填充LONFONT结构描述要创建字体的信息
LONFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));

lf.lfHeight         = 25;    // in logical units
lf.lfWidth          = 12;    // in logical units
lf.lfEscapement     = 0;        
lf.lfOrientation    = 0;     
lf.lfWeight         = 500;   // boldness, range 0(light) - 1000(bold)
lf.lfItalic         = false;   
lf.lfUnderline      = false;    
lf.lfStrikeOut      = false;    
lf.lfCharSet        = DEFAULT_CHARSET;
lf.lfOutPrecision   = 0;              
lf.lfClipPrecision  = 0;          
lf.lfQuality        = 0;  
strcpy(lf.lfFaceName, "Times New Roman"); // font style

//创建ID3DXFont接口对象
hFont = CreateFontIndirect(&lf);
hFontOld = (HFONT)SelectObject(hdc, hFont);

//创建文本的3D网格
D3DXCreateText(Device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);

//释放资源
SelectObject(hdc, hFontOld);
DeleteObject(hFont);
DeleteDC(hdc);

Text->DrawSubset(0); 

 

本章完

                                                                               ————Josh 2012年11月6日



 

 



 


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值