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