Windows游戏编程 第八章.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:48 大小:3.8MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

Windows游戏编程 第八章.doc

Windows游戏编程第八章.doc

预览

免费试读已结束,剩余 38 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

••C++游戏编程••第8章生成游戏第8章生成游戏在第六章中策划了一个游戏,并做了三个例子。其中最后一个例子已经具有游戏的外形了。但距离所策划的那个游戏所要达到的效果还很远。本章将把角色动画、场景转换、立体效果、怪物、音效以及本章即将介绍的文字显示系统、战斗系统和人工智能加入游戏中。把这些功能都加入游戏后,将使游戏变得更加完善。8.1文字显示系统在不使用DirectDraw的应用程序中,很容易显示文字;只需产生一个WM_PAINT消息,再获得设备内容句柄,调用GDI函数就可以显示文字了。而使用了DirectDraw的应用程序特别是游戏程序中,使用上面的方法显示会出现一些怪现象。因为,游戏程序的运行过程是这样的:在消息机制中不断地循环显示后台缓冲表面中的内容。当在一个WM_PAINT消息中显示文字后,将被后台表面的内容的覆盖;而显示文字的这个过程不一定与消息机制的循环相同步;所以,会出现文字的闪烁现象。为了不产生文字的闪烁现象,应该把文字显示在后台表面或者其他的表面上,再通过消息机制把这些表面的内容显示在客户区上,就不会出现闪烁现象了。这一节主要讨论如何在表面中显示文字。8.1.1获得表面的设备内容要调用GDI函数接口显示文字,就必须获得设备内容。可以通过调用IDirectDrawSurface7::GetDC方法获得表面设备内容,其只有一个指向设备内容变量的指针参数。调用IDirectDrawSurface7::ReleaseDC方法则释放指定的设备内容,其参数表示设备内容。所以,要在指定表面显示文字的通常做法是这样的:HDChdc;Surf->GetDC(&hdc);TextOut(hdc,......);//显示文字Surf->ReleaseDC(hdc);其中Surf表示表面指针。8.1.2建立文字显示类游戏的程序在每次消息机制循环时都把新的内容放入后台缓冲表面,就是说,如果在后台缓冲表面中显示文字,文字只被显示一次(速度快的个人电脑将看不到显示的文字)。在大多数情况下,只在后台缓冲表面中显示文字。所以有必要设置文字的显示时间。把文字的显示归为一个类,对于设置文字的显示时间是很容易的事情。本小节将建立一个文字显示类CText。1.定义CText类CText类的定义代码在CText.h文件里。该文件的代码如下:/*---------------------------------------------------|CText.h|字符串输出相关功能声明|(c)mochsh,2004-----------------------------------------------------*/#include<windows.h>#include<stdio.h>#include<ddraw.h>#defineMAX_TEXT200typedefstructTEXTDESC{LPDIRECTDRAWSURFACE7lpSurf;//在哪个表面显示POINTPos;//在什么位置显示TCHARText[MAX_TEXT];//指向的字符串DWORDcolor;//字符的颜色DWORDStartTime;//开始显示的时间DWORDLastTime;//显示多长时间TEXTDESC*next;//链表节点}TEXTDESC,*PTEXTDESC;classCText{protected:DWORDTime;//当前时间PTEXTDESCpText;//字符串链表LPDIRECTDRAWSURFACE7lpDDSBack;//后台缓冲表面public://获得后台缓冲表面voidSet_lpDDSBack(LPDIRECTDRAWSURFACE7lpBackSurf){lpDDSBack=lpBackSurf;}//构造函数CText();//析构函数~CText();//删除字符串链表voidDeleteText(void);//获得要显示的字符串并设置对应字符描述的属性voidGetText(LPDIRECTDRAWSURFACE7lpSurf,LONGx,LONGy,LPCSTRlpText,DWORDcolor,DWORDLastTime);//获得要显示的整数并设置对应字符描述的属性voidGetText(LPDIRECTDRAWSURFACE7lpSurf,LONGx,LONGy,LONGlNumber,DWORDcolor,DWORDLastTime);//获得要显示的浮点数并设置对应字符描述的属性voidGetText(LPDIRECTDRAWS