二维游戏的编程技术.ppt
《二维游戏的编程技术.ppt》由会员分享,可在线阅读,更多相关《二维游戏的编程技术.ppt(140页珍藏版)》请在三一办公上搜索。
1、VC+游戏编程,第二章 二维游戏的编程技术,第一节 二维游戏的基本流程和架构1.二维游戏的基本功能:交互和输出交互部分:根据用户的操作,改变游戏的各种数据,以反映游戏的当前状态。输出:处理游戏运行中的各种数据,在输出设备上体现游戏的内容,包括游戏画面、游戏音效、游戏提示等。这两个部件的执行由调度模块指挥,简单的调度模块是一个do-while循环,串行执行:交互输出再输出再渲染。当然也可以将两个部件分成不同的线程,并行执行。,VC+游戏编程游戏的编程技术,2.实现二维游戏框架,需要做下面的几个工作:实现游戏地图的加载和编辑操作图像的半透明技术精灵动画技术:采用连续帖图方式产生动画效果碰撞检测,V
2、C+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,第二节 VC+基本绘图技巧一、为什么使用VC+来设计游戏1.优异的运行速度:2.直接访问内存(VB间接访问)-双刃剑3.(VC+)+MFC数据库 架构4.(VC+)+Windows API 架构二、与其他函数库的结合1.DirecX SDK2.OpenGL,VC+游戏编程游戏的编程技术,三、游戏舞台的坐标系统1.屏幕区、窗口、客户区 屏幕区的大小视用户计算机所设置的分辨率而定,如:1024x768,VC+游戏编程游戏的编程技术,2.坐标点与坐标转换 以屏幕左上角为原点,屏幕上的任何位置都可以用一个坐标表示,我们称为屏幕坐标。当程序中调用
3、某些以坐标点为实参的函数时,都要传递相应的屏幕坐标,如果我们只知道该点在客户区中的位置,则必须先将它转换为屏幕坐标。转换方法是调用ClientToScreen函数,反之调用ScreebToClient,VC+游戏编程游戏的编程技术,四、MFC(Microsoft Foundation Class)绘图类1.MFC的GDI类 GDI(Graphic Device Interface)意为“图形设备接口”。Windows的架构不允许使用者直接存取VGA显卡上的内存,所以在MFC中提供了图形设备接口类,用来让使用者显示数据。上图表示GDI类都是从CGdiObject继承而来,这些类必须在配合设备上下
4、文(DC,Device Context)来使用。这些GDI类的用途如下:,VC+游戏编程游戏的编程技术,CBimap:该类封装了一个GDI位图,提供一个操作位图的接口CBrush:该类封装了一个GDI画刷,可被选择为设备描述表的当前画刷,画笔为图形中填满样式CFont:该类封装了一种GDI字体,可被选择为设备描述表的当前字体Cpalette:该类封装了一个GDI调色板,可作应用程序和一色彩输出设备如显示器之间的接口CPen:该类封装了一种GDI画笔,可被选择为设备描述的当前画笔,画笔为图形外框样式CRgn:该类封装了一GDI域,用于操作窗口内的椭圆域或多边形域。该类一般与CDC类的裁剪成员一起
5、使用,VC+游戏编程游戏的编程技术,2.MFC的CDC类DC(Device Context,设备上下文)可以将其想象成一个图形绘制的区域。当要在屏幕上绘图时,应用程序就必须先取得“屏幕的DC”才可以进行绘图;当使用者要操作其窗口绘图时,就必须先取得“操作窗口的DC”,然后再把要绘制的图形放到各个DC中,这时在该DC所代表的区域中,就会显示所绘制的图形。,VC+游戏编程游戏的编程技术,MFC把各种不同的DC类包装在CDC类中,并提供了许多与绘图有关的函数。,VC+游戏编程游戏的编程技术,CClientDC:代表操作窗口的DC,可用于在快速响应鼠标事件时进行绘画CMetaFileDC:Window
6、s元文件的设备环境类,Windows元文件包含一个图形设备接口(GDI)命令序列,该序列可被重新执行而创建一幅图像CPaintDC:响应MN_PAINT消息的DC,是显示设备环境类,用于窗口中的OnPaint成员和视图OnDraw成员函数中,自动调用BeginPaint进行构造,调用EndPaint进行析构。CWindowsDC:代表整个屏幕的DC,即整个窗口的显示设备环境类,包括客户区和框架区。,VC+游戏编程游戏的编程技术,五、构建游戏窗口1.设置VC+应用程序中的头文件,VC+游戏编程游戏的编程技术,这样就不用担心VC+会出现编译程序找不到DirectX的.h和.lib的头文件错误,VC
7、+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,2.建立程序项目使用VC+中的File|New命令建立新项目并按下面步骤操作:,可以使用VC+的MFC架构开发应用程序,它可以帮助你套入许多默认的窗口、对话框、菜单等基本组件,这些组件在设计游戏时基本用不上,因此只要建立一个单纯的Win32应用程序项目即可。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,建立新项目后,接着在Header Files中新增一个名为stdafx.h的头文件,方法如下:,VC+游戏编程游戏的编程技术,在项目中加入此文件后,就打开它并加以编辑。在这个程序中,所要引用的头
8、文件都是在stdafx.h中设定。,VC+游戏编程游戏的编程技术,下面建立这个项目所属的资源文件,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,最后,还要为这个新项目设定使用的MFC函数库,方法如下,VC+游戏编程游戏的编程技术,完成了设置MFC之后,就可以建立应用程序窗口了,VC+游戏编程游戏的编程技术,应用程序与窗口 下面我们建立一个信息窗口来展示程序的功能,即建立一个应用程序对象以及窗口对象。,V
9、C+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,这样,VC+便会自动为这个项目建立一个gameFrame类。双击gameFrame.h,即可看到它的内容。,VC+游戏编程游戏的编程技术,下面我们再建一个Class类,并将其命名为gameApp,VC+游戏编程游戏的编程技术,gameApp Class建立完后,先在gameApp.h中声明MFC的初始函数,内容如下:,VC+游戏编程游戏的编程技术,然后在gameApp.cpp中建立函数的实体:,VC+游戏编程游戏的编程技术,最后建立一个基本的Windows窗口,在gameFrame.cpp中加入如下程序代码:这段程序建立了一个名称为“绘
10、图窗口”的窗口,MFC的Create()函数会帮你完成所有建立窗口时遇到的函数调用动作。,VC+游戏编程游戏的编程技术,运行结果:,VC+游戏编程游戏的编程技术,在gameFrame.cpp中可以加入窗口控制命令,程序代码如下:width=dc.GetDeviceCaps(HORZRES);height=dc.GetDeviceCaps(VERTRES);GetWindowRect(这样可以将窗口放置在屏幕的正中。,VC+游戏编程游戏的编程技术,六、MFC绘图类-从项目建立绘图成员函数 执行VC+中的View|Class Wizard,打开MFC Class Wizard对话框,VC+游戏编程
11、游戏的编程技术,这时在项目的程序代码中多出了一个有关窗口绘图的OnPaint()函数,VC+游戏编程游戏的编程技术,这样可以在OnPaint()函数中编写程序代码void gameFrame:OnPaint()CPaintDC dc(this);oldFont=dc.SelectObject(,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,例:线段绘制、绘制填充的区域(画刷实例祥见C+绘图介绍-new.ppt),,第三节 地图的创建与显示 一、图像的加载和显示 1.图形文件格式:BMP、GIF、JPEG、TIF。其中BMP是Windows平台的标准图像格式。BMP图像,又名位图图
12、像(bitmap),这种格式像一张地图一样,记录目标图像上每个像素点的颜色值。2.加载位图文件:步骤一:将位图加载到内存DC中步骤二:将内存DC中的内容绘制到要显示位图的 DC中。见位图程序。,VC+游戏编程游戏的编程技术,3.两个函数:(1)加载位图LoadImage()HANDLE LoadImage(HINSTANCE hinst,/包含位图实体的handle LPCTSTR lpszName,/位图来源 UINT uType;/加载位图的类型 int cxDesired,/位图的宽度 int cyDesired,/位图的高度 UINT fuLoad/加载位图的方式);当位图加载到内存D
13、C后,只要把内存DC中的内容贴到显示位图的DC中即可。只要利用CDC:BitBlt函数皆可以完成这个操作。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,(2)绘制位图 BitBlt()BOOL BitBlt int x,/贴到目的地左上角点的x坐标 int y,/贴到目的地左上角点的y坐标 int nWidth,/贴到目的地的宽度 int nHeight,/贴到目的地的高度 CDC*pSrcDC,/存储来源位图的DC int xSrc,/源位图左上角点的x坐标 int ySrc,/源位图左上角点的y坐标 DWORD dwRop/Raster运算值;,VC+游戏编程游戏的编程技术
14、,例如语句:dc-BitBlt(0,0,500,400,mdc,200,100,raster)这里可以假设dc是代表操作窗口的DC,mdc是存储位图来源的内存DC,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,Raster值:BLACKNESS:将位图转换为黑色DSTINVERT:将目的DC做NOT运算MERGECOPY:将选择的画刷与位图做AND运算MERGEPAINT:先将位图做NOT运算,再与目的 DC做OR 运算NOTSRCCOPY:将位图做NOT运算NOTSRCERASE:先将位图与目的DC做OR运算,再将其 做NOT运算PATCOPY:将
15、选择的画刷贴到目的DCPATINVERT:将目的DC与选择的画刷做XOR运算PATPAINT:先将位图做NOT运算,再与画刷做OR运算,最后再与目的DC做 OR运算SRCAND:先将位图与目的DC做AND运算SRCCOPY:将位图贴到目的DCSRCERASE:先将目的DC做NOT运算,再位图做AND运算SRCINVERT:将位图与目的DC做XOR运算SRCPAINT:将位图与目的DC做OR运算WHITENESS:将位图转换为白色,VC+游戏编程游戏的编程技术,二、地图的绘制1.固定地图,VC+游戏编程游戏的编程技术,2.菱形地图(斜角地图贴图)用小图拼凑实现大地图,斜角地图即有立体感,是一种常
16、用的二维画面上表现三维场景的技术(三国风云),VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,(1)地图的拓扑结构 将每张小图的长宽设置为64x32像素,则要贴上10 x15张小图,可以下图计算:将上述方块地图编号:,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,图块左上角的帖图坐标计算公式如下:左上角的X坐标=xstart+行编号*w/2-列编号*w/2 左上角的y坐标=ystart+列编号*h/2 行编号*h/2 xstart,ystart分别代表第一张图块左上角贴图的坐标位置,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技
17、术,TransparentBlt实现透明 函数功能:该函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(bit_block)转换,并将结果置于目标设备环境。函数原型:BOOL TransparentBlt(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,UINT crTransparent);,VC+游戏编程游戏的编程技术,参数:hdcDe
18、st:指向目标设备环境的句柄。nXOriginDest:指定目标矩形左上角的X轴坐标 nYOriginDest:指定目标矩形左上角的Y轴坐标,nWidthDest:指定目标矩形的宽度。nHeightDest:指定目标矩形高度的句柄。hdcsrc:指向源设备环境的句柄。nXOriginSrc:指定源矩形(左上角)的X轴坐标 nYOriginsrc:指定源矩形(左上角)的Y轴坐标 nWidthSrc:指定源矩形的宽度。nHeightSrc:指定源矩形的高度。crTransparent:源位图中的RGB值当作透明颜色。返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FA
19、LSE。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,透明色(又称关键色),指的是图像传送中不会被传送的区域的颜色。比如说我们先在一个纯绿色的背景上画了一个人物,把这幅画调入一个页面,再将纯绿色设为这个页面的透明色。以后当我们进行图像传送时,只需指定传送范围为一个包括了人物的矩形,DirectDraw将只会把不规则的人物传到新的页面上而不会把纯绿色的背景一起传送。当然,人物本身不能包含纯绿色,否则就不能完整地传送了。一个页面在同一时刻只能有一种透明色,设置透明色的方法是 DDSetColorKey(页面名,RGB(红,绿,蓝);例如DDSetColorKey(lpDDSMap,
20、RGB(255,0,255);,VC+游戏编程游戏的编程技术,障碍物贴图,3.单一背景卷动技术(滚屏地图)单一背景卷动技术就是只有一张地图,随着时间的推移而在窗口中慢慢移动位置,这一技术是利用在窗口中连续贴上背景所产生的效果。如下图,由左上至右下的几个黑框,就是操作窗口在每个不同时间所显示的部分地图。只要设定一个定时器,按从左上至右下的顺序在窗口中重绘所显示的部分地图就可以产生卷动的效果。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,4.多重背景卷动技术(多层次地图)多重背景卷动就是有多幅背景图,而这些背景图的卷动速度都不相同。如开车时,窗外背景变化最快的依次是车旁的树木,然后
21、是天空的云朵,最后才是远方的太阳。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,第四节 动画技术 动画和电影一样,都是将差异很小的图像一幅幅显示。由于人眼的视觉暂留现象,看上去就像图像动了起来。比如在RPG中,我们要实现主角从(x1,y1)移动到(x2,y2)处,我们可用如下代码:while(主角不在(x2,y2)在主角(x,y)处恢复背景;在(x+dx,y+dy)处重绘主角;x=x+dx;y=y+dy;,VC+游戏编程游戏的编程技术,当主角很小时,上面方法是可行的,但主角稍大,就会出现闪烁现象。闪烁的原因不是因为你的CPU和GPU不够快,而同样是因为视觉暂留。解决的方法是双缓
22、冲技术。即构造两个屏幕缓冲区,一个表示当前屏幕,一个在后台表示下一帧的屏幕。在后台缓冲区上画好下一帧后,一次性送到前台上去,这样就不会出现闪烁现象了。其过程可以描述为:while(主角不在(x2,y2)在后台缓冲恢复背景;在后台缓冲(x+dx,y+dy)处恢主角;将后台缓冲送到前台;x=x+dx;y=y+dy;以上过程在Mode X下可用VGA的寄存器置位来实现,在DirectX中可用Flip或Blt实现。Mode X是实模式下的编程方式,以前DOS下的游戏经常使用。,VC+游戏编程游戏的编程技术,游戏中的动画按其呈现方式可分为两种:直接播放方式:这种方式经常被用来播放游戏的片头和片尾,如AV
23、I和MPEG媒体文件。连续贴图方式:利用连续贴图的成像技术来制作动画效果即精灵动画。所谓“精灵”就是指一个或一组位图图像被合成到背景图像上,并产生运动的效果。相对于屏幕而言,“精灵”通常是很小的,当今的图形硬件可以很快地处理精灵动画,使得场景中的很多“精灵”可以同时运动。,一、定时器的运用 定时器(Timer)每隔一段时间就发出一个WM_TIMER消息,当程序接收到这个消息时,便可以决定接下来作哪些事情。通常用在控制动画显示的速度上。1.建立定时器 UINT SetTimer HWND hWnd/窗口句柄 UINT nIDEvent/计数器编号 UINT uElapse/时间间隔 TIMEPR
24、OC lpTimerFunc/回调函数,VC+游戏编程游戏的编程技术,第二个参数是计时器的编号,是唯一的,在同一窗口可以设定多个不同的编号,例如:SetTimer(1,100,NULL);SetTimer(2,200,NULL);第三个参数时间间隔为千分之一秒为单位,如果设为1000,则每隔1秒发出一个WM_TIMER消息第四个参数是设定定时器发出消息时所要执行的回调函数。如果不使用,这个参数可以设为NULL,并在窗口的OnTimer()函数中定义所要执行的程序代码。下面的代码表示建立一个编号为1,时间间隔为0.5秒,且不使用回调函数的定时器:SetTimer(NULL,1,500,NULL)
25、;,VC+游戏编程游戏的编程技术,2.删除定时器 定时器建立后,它会一直依照我们设定的时间间隔发出WM_TIMER消息,因此我们要停止这个定时器,就要使用下面的函数:KillTimer(int nIDEvent);其参数就是我们要停止的定时器编号。例1 使用单个定时器显示动画例2 使用多个定时器显示动画,VC+游戏编程游戏的编程技术,3.利用回调函数显示动画 回调函数通常用在有多个定时器情况下,分别用来设置各个定时器发出WM_TIMER消息时所要执行的程。Sttatic void CALLBACK TimeProc(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二维 游戏 编程 技术
链接地址:https://www.31ppt.com/p-5065337.html