《清华大学DirectX游戏编程第十章(全20章).ppt》由会员分享,可在线阅读,更多相关《清华大学DirectX游戏编程第十章(全20章).ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第10章文字处理本章将讨论如何使用本章将讨论如何使用Direct3D生成和输出文本。生成和输出文本。在在Direct3D中,文本的输出主要有三种方法,中,文本的输出主要有三种方法,对于每一种方法都可以在本书相关的网站上找对于每一种方法都可以在本书相关的网站上找到对应的实例。到对应的实例。主要目标:如何用ID3DXFont接口输出文字。如何用CD3DFont类来进行文字输出。怎样计算并输出帧速。如何使用D3DXCreateText方法创建3D文字效果。110.1ID3DXFont、ID3DXFont接口D3DX库是使用库是使用ID3DXFont接口来在接口来在Direct3D应用程序中输出文字的
2、。这应用程序中输出文字的。这个接口通过个接口通过GDI(图形设备接口图形设备接口)来输来输出文字,因此用这个接口完成任务的出文字,因此用这个接口完成任务的时候会有些效率上的损失。时候会有些效率上的损失。但是,运用了但是,运用了GDI,ID3DXFont可以可以处理复杂的文字和文字格式。处理复杂的文字和文字格式。210.1.1创建一个ID3DXFont接口在在DirectX中通过中通过D3DXCreateFontIndirect方方法来创建一个法来创建一个ID3DXFont接口:接口:HRESULTWINAPID3DXCreateFontIndirect(LPDIRECT3DDEVICE9pDe
3、vice,/当前所使用的设备CONSTD3DXFONT_DESC*pDesc,/字体描述结构LPD3DXFONT*ppFont/返回的字体接口);下面的代码展示了这个方法的具体应用:下面的代码展示了这个方法的具体应用:参见教材P150310.1.2文字输出当获得了一个当获得了一个ID3DXFont接口以后,可以方便接口以后,可以方便地利用地利用ID3DXFont接口的接口的DrawText方法来输出方法来输出文字:文字:INTID3DXFont:DrawText(LPCSTRpString,INTCount,LPRECTpRect,DWORDFormat,D3DCOLORColor);410.
4、1.2文字输出范例代码如下:Font-DrawText(HelloWorld,/待输出字符串-1,/NULL结尾(Nullterminating)的字符串&rect,/决定文字输出到屏幕的位置DT_TOP|DT_LEFT,/在指定RECT的左上角输出0 xff000000/文字颜色:黑色);510.1.3计算帧速(FPS)在程序开始的时候,声明在程序开始的时候,声明3个全局变量:个全局变量:DWORDFrameCnt;/已经渲染的帧数floatTimeElapsed;/已经经过的时间floatFPS;/FPS程序中每秒钟计算一次帧速,即每秒钟内的平程序中每秒钟计算一次帧速,即每秒钟内的平均帧数
5、,从而保证帧速在一秒的时间间隔内得均帧数,从而保证帧速在一秒的时间间隔内得到的帧速不会改变,以便拥有充足的时间在它到的帧速不会改变,以便拥有充足的时间在它改变之前读出数据。改变之前读出数据。610.1.3计算帧速(FPS)每一帧渲染结束后都会将帧数计数器每一帧渲染结束后都会将帧数计数器FrameCnt加加1,然后将时间计数器,然后将时间计数器TimeElapsed加上渲染的每两加上渲染的每两帧之间经过的时间差帧之间经过的时间差timeDelta:FrameCnt+;TimeElapsed+=timeDelta;每一秒时间间隔后,通过下面的公式计算帧速:每一秒时间间隔后,通过下面的公式计算帧速:
6、FPS=(float)FrameCnt/TimeElapsed;每一次计算完毕帧速后,需要重设每一次计算完毕帧速后,需要重设FrameCnt和和TimeElapsed变量的值来开始下一秒钟帧速的计算。变量的值来开始下一秒钟帧速的计算。710.1.3计算帧速(FPS)下面是计算帧速的完整代码:下面是计算帧速的完整代码:voidCalcFPS(floattimeDelta)FrameCnt+;TimeElapsed+=timeDelta;if(TimeElapsed=1.0f)FPS=(float)FrameCnt/TimeElapsed;TimeElapsed=0.0f;FrameCnt=0;8
7、10.2CD3DFont、CD3DFont类由于由于CD3DFont使用了使用了Direct3D代替代替GDI来渲染文本,来渲染文本,因此它比因此它比ID3DXFont更快。但是,更快。但是,CD3DFont不能像不能像ID3DXFont那样支持复杂的文字和格式。那样支持复杂的文字和格式。如果你想要提高程序的效率并且简单的文字格式就能如果你想要提高程序的效率并且简单的文字格式就能满足需求,那么满足需求,那么CD3DFont类可以方便地解决问题。类可以方便地解决问题。使用使用CD3DFont类之前需要把如下的文件加入到你的类之前需要把如下的文件加入到你的工程中去:工程中去:d3dfont.h、d
8、3dfont.cpp、d3dutil.h、d3dutil.cpp、dxutil.h和和dxutil.cpp,这些文件可以,这些文件可以在在DirectX SDK根目录下的根目录下的SamplesC+Common文件文件夹下面的夹下面的Include和和Src文件夹内找到。文件夹内找到。910.2.1构造CD3DFont对象下面是下面是CD3DFont类的构造函数:类的构造函数:CD3DFont(constTCHAR*strFontName,DWORDdwHeight,DWORDdwFlags=0L);实例化一个实例化一个CD3DFont对象后,必须调用下面的方法对象后,必须调用下面的方法将将C
9、D3DFont对象创建到对象创建到Direct3D设备中去,或者从设备中去,或者从Direct3D设备中卸载设备中卸载(之所以这样做,是为了满足之所以这样做,是为了满足D3D框架程序的需要,因为当框架程序的需要,因为当Direct3D应用程序中出应用程序中出现设备丢失时,需要重建与设备相关的对象,包括现设备丢失时,需要重建与设备相关的对象,包括CD3DFont对象,设备丢失的情况在对象,设备丢失的情况在Windows 2000中打开任务管理器时可能发生中打开任务管理器时可能发生):Font=newCD3DFont(TimesNewRoman,16,0);/创建CD3DFont对象Font-In
10、itDeviceObjects(Device);Font-RestoreDeviceObjects();1010.2.2DrawText输出文字函数函数DrawText用于将文字输出到屏幕:用于将文字输出到屏幕:HRESULTCD3DFont:DrawText(FLOATx,FLOATy,DWORDdwColor,constTCHAR*strText,DWORDdwFlags=0L);例如:例如:Font-DrawText(20,20,0 xff000000,Hello,World);1110.2.3销毁CD3DFont对象在从堆中删除在从堆中删除CD3DFont对象之前,对象之前,必须首先调
11、用必须首先调用CD3DFont类的一些方类的一些方法,以便安全地释放法,以便安全地释放CD3DFont对象,对象,如下所示:如下所示:Font-InvalidateDeviceObjects();Font-DeleteDeviceObjects();deleteFont;1210.3三维网格(3DMesh)在文字显示中的应用10.3.1D3DXCreateText方法D3DXCreateText方法被用来创建文本的三维网格图像。图10.1显示了本章例子FontMesh3D渲染的三维网格图像。1310.3三维网格(3DMesh)在文字显示中的应用函数的原型如下:函数的原型如下:HRESULTD3
12、DXCreateText(LPDIRECT3DDEVICE9pDevice,/Mesh关联的DeviceHDChDC,/将要用来创建mesh的文本的设备上下文句柄LPCTSTRpText,/指向需要显示的以NULL结尾的字符串的指针FLOATDeviation,FLOATExtrusion,/按照负Z方向指定的Font的深度LPD3DXMESH*ppMesh,/返回被创建的MeshLPD3DXBUFFER*ppAdjacency,LPGLYPHMETRICSFLOATpGlyphMetrics);1410.3三维网格(3DMesh)在文字显示中的应用下面的实例代码展示了如何用这个函下面的实例代
13、码展示了如何用这个函数来创建一个三维网格:数来创建一个三维网格:参见教材P155然后可以用然后可以用Mesh的的DrawSubset方法方法渲染这个渲染这个3D文字网格信息:文字网格信息:Text-DrawSubset(0);1510.4小结如果你需要复杂的字体格式,可以使用如果你需要复杂的字体格式,可以使用ID3DXFont接口来输出文字。这个接口实际上接口来输出文字。这个接口实际上使用了图形设备接口来输出文字,因此会降低使用了图形设备接口来输出文字,因此会降低效率。效率。如果需要快速输出简单的文字,可以使用如果需要快速输出简单的文字,可以使用CD3DFont类。这个类利用了带纹理帖图的三类。这个类利用了带纹理帖图的三角形和角形和Direct3D来输出文字,效率比来输出文字,效率比ID3DXFont高一些。高一些。如果需要创建立体效果的文字,可以使用如果需要创建立体效果的文字,可以使用D3DXCreateText方法。方法。16