二维游戏的编程技术.ppt
VC+游戏编程,第二章 二维游戏的编程技术,第一节 二维游戏的基本流程和架构1.二维游戏的基本功能:交互和输出交互部分:根据用户的操作,改变游戏的各种数据,以反映游戏的当前状态。输出:处理游戏运行中的各种数据,在输出设备上体现游戏的内容,包括游戏画面、游戏音效、游戏提示等。这两个部件的执行由调度模块指挥,简单的调度模块是一个do-while循环,串行执行:交互输出再输出再渲染。当然也可以将两个部件分成不同的线程,并行执行。,VC+游戏编程游戏的编程技术,2.实现二维游戏框架,需要做下面的几个工作:实现游戏地图的加载和编辑操作图像的半透明技术精灵动画技术:采用连续帖图方式产生动画效果碰撞检测,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,第二节 VC+基本绘图技巧一、为什么使用VC+来设计游戏1.优异的运行速度:2.直接访问内存(VB间接访问)-双刃剑3.(VC+)+MFC数据库 架构4.(VC+)+Windows API 架构二、与其他函数库的结合1.DirecX SDK2.OpenGL,VC+游戏编程游戏的编程技术,三、游戏舞台的坐标系统1.屏幕区、窗口、客户区 屏幕区的大小视用户计算机所设置的分辨率而定,如:1024x768,VC+游戏编程游戏的编程技术,2.坐标点与坐标转换 以屏幕左上角为原点,屏幕上的任何位置都可以用一个坐标表示,我们称为屏幕坐标。当程序中调用某些以坐标点为实参的函数时,都要传递相应的屏幕坐标,如果我们只知道该点在客户区中的位置,则必须先将它转换为屏幕坐标。转换方法是调用ClientToScreen函数,反之调用ScreebToClient,VC+游戏编程游戏的编程技术,四、MFC(Microsoft Foundation Class)绘图类1.MFC的GDI类 GDI(Graphic Device Interface)意为“图形设备接口”。Windows的架构不允许使用者直接存取VGA显卡上的内存,所以在MFC中提供了图形设备接口类,用来让使用者显示数据。上图表示GDI类都是从CGdiObject继承而来,这些类必须在配合设备上下文(DC,Device Context)来使用。这些GDI类的用途如下:,VC+游戏编程游戏的编程技术,CBimap:该类封装了一个GDI位图,提供一个操作位图的接口CBrush:该类封装了一个GDI画刷,可被选择为设备描述表的当前画刷,画笔为图形中填满样式CFont:该类封装了一种GDI字体,可被选择为设备描述表的当前字体Cpalette:该类封装了一个GDI调色板,可作应用程序和一色彩输出设备如显示器之间的接口CPen:该类封装了一种GDI画笔,可被选择为设备描述的当前画笔,画笔为图形外框样式CRgn:该类封装了一GDI域,用于操作窗口内的椭圆域或多边形域。该类一般与CDC类的裁剪成员一起使用,VC+游戏编程游戏的编程技术,2.MFC的CDC类DC(Device Context,设备上下文)可以将其想象成一个图形绘制的区域。当要在屏幕上绘图时,应用程序就必须先取得“屏幕的DC”才可以进行绘图;当使用者要操作其窗口绘图时,就必须先取得“操作窗口的DC”,然后再把要绘制的图形放到各个DC中,这时在该DC所代表的区域中,就会显示所绘制的图形。,VC+游戏编程游戏的编程技术,MFC把各种不同的DC类包装在CDC类中,并提供了许多与绘图有关的函数。,VC+游戏编程游戏的编程技术,CClientDC:代表操作窗口的DC,可用于在快速响应鼠标事件时进行绘画CMetaFileDC:Windows元文件的设备环境类,Windows元文件包含一个图形设备接口(GDI)命令序列,该序列可被重新执行而创建一幅图像CPaintDC:响应MN_PAINT消息的DC,是显示设备环境类,用于窗口中的OnPaint成员和视图OnDraw成员函数中,自动调用BeginPaint进行构造,调用EndPaint进行析构。CWindowsDC:代表整个屏幕的DC,即整个窗口的显示设备环境类,包括客户区和框架区。,VC+游戏编程游戏的编程技术,五、构建游戏窗口1.设置VC+应用程序中的头文件,VC+游戏编程游戏的编程技术,这样就不用担心VC+会出现编译程序找不到DirectX的.h和.lib的头文件错误,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,2.建立程序项目使用VC+中的File|New命令建立新项目并按下面步骤操作:,可以使用VC+的MFC架构开发应用程序,它可以帮助你套入许多默认的窗口、对话框、菜单等基本组件,这些组件在设计游戏时基本用不上,因此只要建立一个单纯的Win32应用程序项目即可。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,建立新项目后,接着在Header Files中新增一个名为stdafx.h的头文件,方法如下:,VC+游戏编程游戏的编程技术,在项目中加入此文件后,就打开它并加以编辑。在这个程序中,所要引用的头文件都是在stdafx.h中设定。,VC+游戏编程游戏的编程技术,下面建立这个项目所属的资源文件,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,最后,还要为这个新项目设定使用的MFC函数库,方法如下,VC+游戏编程游戏的编程技术,完成了设置MFC之后,就可以建立应用程序窗口了,VC+游戏编程游戏的编程技术,应用程序与窗口 下面我们建立一个信息窗口来展示程序的功能,即建立一个应用程序对象以及窗口对象。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,这样,VC+便会自动为这个项目建立一个gameFrame类。双击gameFrame.h,即可看到它的内容。,VC+游戏编程游戏的编程技术,下面我们再建一个Class类,并将其命名为gameApp,VC+游戏编程游戏的编程技术,gameApp Class建立完后,先在gameApp.h中声明MFC的初始函数,内容如下:,VC+游戏编程游戏的编程技术,然后在gameApp.cpp中建立函数的实体:,VC+游戏编程游戏的编程技术,最后建立一个基本的Windows窗口,在gameFrame.cpp中加入如下程序代码:这段程序建立了一个名称为“绘图窗口”的窗口,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+游戏编程游戏的编程技术,这时在项目的程序代码中多出了一个有关窗口绘图的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图像,又名位图图像(bitmap),这种格式像一张地图一样,记录目标图像上每个像素点的颜色值。2.加载位图文件:步骤一:将位图加载到内存DC中步骤二:将内存DC中的内容绘制到要显示位图的 DC中。见位图程序。,VC+游戏编程游戏的编程技术,3.两个函数:(1)加载位图LoadImage()HANDLE LoadImage(HINSTANCE hinst,/包含位图实体的handle LPCTSTR lpszName,/位图来源 UINT uType;/加载位图的类型 int cxDesired,/位图的宽度 int cyDesired,/位图的高度 UINT fuLoad/加载位图的方式);当位图加载到内存DC后,只要把内存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+游戏编程游戏的编程技术,例如语句: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:将选择的画刷贴到目的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.菱形地图(斜角地图贴图)用小图拼凑实现大地图,斜角地图即有立体感,是一种常用的二维画面上表现三维场景的技术(三国风云),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+游戏编程游戏的编程技术,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+游戏编程游戏的编程技术,参数:hdcDest:指向目标设备环境的句柄。nXOriginDest:指定目标矩形左上角的X轴坐标 nYOriginDest:指定目标矩形左上角的Y轴坐标,nWidthDest:指定目标矩形的宽度。nHeightDest:指定目标矩形高度的句柄。hdcsrc:指向源设备环境的句柄。nXOriginSrc:指定源矩形(左上角)的X轴坐标 nYOriginsrc:指定源矩形(左上角)的Y轴坐标 nWidthSrc:指定源矩形的宽度。nHeightSrc:指定源矩形的高度。crTransparent:源位图中的RGB值当作透明颜色。返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,透明色(又称关键色),指的是图像传送中不会被传送的区域的颜色。比如说我们先在一个纯绿色的背景上画了一个人物,把这幅画调入一个页面,再将纯绿色设为这个页面的透明色。以后当我们进行图像传送时,只需指定传送范围为一个包括了人物的矩形,DirectDraw将只会把不规则的人物传到新的页面上而不会把纯绿色的背景一起传送。当然,人物本身不能包含纯绿色,否则就不能完整地传送了。一个页面在同一时刻只能有一种透明色,设置透明色的方法是 DDSetColorKey(页面名,RGB(红,绿,蓝);例如DDSetColorKey(lpDDSMap,RGB(255,0,255);,VC+游戏编程游戏的编程技术,障碍物贴图,3.单一背景卷动技术(滚屏地图)单一背景卷动技术就是只有一张地图,随着时间的推移而在窗口中慢慢移动位置,这一技术是利用在窗口中连续贴上背景所产生的效果。如下图,由左上至右下的几个黑框,就是操作窗口在每个不同时间所显示的部分地图。只要设定一个定时器,按从左上至右下的顺序在窗口中重绘所显示的部分地图就可以产生卷动的效果。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,4.多重背景卷动技术(多层次地图)多重背景卷动就是有多幅背景图,而这些背景图的卷动速度都不相同。如开车时,窗外背景变化最快的依次是车旁的树木,然后是天空的云朵,最后才是远方的太阳。,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不够快,而同样是因为视觉暂留。解决的方法是双缓冲技术。即构造两个屏幕缓冲区,一个表示当前屏幕,一个在后台表示下一帧的屏幕。在后台缓冲区上画好下一帧后,一次性送到前台上去,这样就不会出现闪烁现象了。其过程可以描述为:while(主角不在(x2,y2)在后台缓冲恢复背景;在后台缓冲(x+dx,y+dy)处恢主角;将后台缓冲送到前台;x=x+dx;y=y+dy;以上过程在Mode X下可用VGA的寄存器置位来实现,在DirectX中可用Flip或Blt实现。Mode X是实模式下的编程方式,以前DOS下的游戏经常使用。,VC+游戏编程游戏的编程技术,游戏中的动画按其呈现方式可分为两种:直接播放方式:这种方式经常被用来播放游戏的片头和片尾,如AVI和MPEG媒体文件。连续贴图方式:利用连续贴图的成像技术来制作动画效果即精灵动画。所谓“精灵”就是指一个或一组位图图像被合成到背景图像上,并产生运动的效果。相对于屏幕而言,“精灵”通常是很小的,当今的图形硬件可以很快地处理精灵动画,使得场景中的很多“精灵”可以同时运动。,一、定时器的运用 定时器(Timer)每隔一段时间就发出一个WM_TIMER消息,当程序接收到这个消息时,便可以决定接下来作哪些事情。通常用在控制动画显示的速度上。1.建立定时器 UINT SetTimer HWND hWnd/窗口句柄 UINT nIDEvent/计数器编号 UINT uElapse/时间间隔 TIMEPROC lpTimerFunc/回调函数,VC+游戏编程游戏的编程技术,第二个参数是计时器的编号,是唯一的,在同一窗口可以设定多个不同的编号,例如:SetTimer(1,100,NULL);SetTimer(2,200,NULL);第三个参数时间间隔为千分之一秒为单位,如果设为1000,则每隔1秒发出一个WM_TIMER消息第四个参数是设定定时器发出消息时所要执行的回调函数。如果不使用,这个参数可以设为NULL,并在窗口的OnTimer()函数中定义所要执行的程序代码。下面的代码表示建立一个编号为1,时间间隔为0.5秒,且不使用回调函数的定时器:SetTimer(NULL,1,500,NULL);,VC+游戏编程游戏的编程技术,2.删除定时器 定时器建立后,它会一直依照我们设定的时间间隔发出WM_TIMER消息,因此我们要停止这个定时器,就要使用下面的函数:KillTimer(int nIDEvent);其参数就是我们要停止的定时器编号。例1 使用单个定时器显示动画例2 使用多个定时器显示动画,VC+游戏编程游戏的编程技术,3.利用回调函数显示动画 回调函数通常用在有多个定时器情况下,分别用来设置各个定时器发出WM_TIMER消息时所要执行的程。Sttatic void CALLBACK TimeProc(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime)hWnd:定时器窗口的句柄;nMsg:WN_TIMER消息;nIDEvent:定时器编号;dwTime:启用定时器后所经过的时间,以千分之一秒为单位,VC+游戏编程游戏的编程技术,二、镂空动画技巧 镂空图就是将图片中的一部分显示在另一张背景图上,而且出去图中不需要显示的部分。(第五节)三、半透明动画技术 当一幅图显示在另一幅图上时,透过上面的图能够看到下面的图,如上面的图显示的是玻璃材质的物体,这时就要用到透明技术。(第六节),VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,第五节 镂空图的制作 镂空图就是将图片中的一部分显示在另一张背景图上,而且除去图中不需要显示的部分(这部分必须是白色或黑色)。,现有两幅图,左为背景图,右为需要贴到背景上的图。将右图显示到左图上,需要去掉边缘的黑色。,VC+游戏编程游戏的编程技术,镂空图制作原理左边图为人物称之为原始图,要镂空的部分为黑色,右边只有黑色和白色,称之为蒙版或叫做掩码图。,VC+游戏编程游戏的编程技术,镂空图的制作原理:由C语言里的位运算,我们知道,任何颜色RBG值和黑色按位AND,得到的仍是黑色,和白色按位AND,结果不变。即:0 0 0 0 0 0 0 0 蒙版中的黑色部分 AND)1 0 1 0 1 0 1 0 背景图色彩 0 0 0 0 0 0 0 0 最后变成黑色 1 1 1 1 1 1 1 1 蒙版中的白色部分 AND)1 0 1 0 1 0 1 0 背景图色彩 1 0 1 0 1 0 1 0 最后还是背景颜色,VC+游戏编程游戏的编程技术,同样,任何颜色和黑色按位OR,不变;白色按位OR,得到白色。即:1 0 1 0 1 0 1 0 人物图案颜色 OR)0 0 0 0 0 0 0 0 背景中变成黑色的部分 1 0 1 0 1 0 1 0 最后黑色的部分变成人物图案 0 0 0 0 0 0 0 0 人物图案四周的黑色部分OR)1 0 1 0 1 0 1 0 背景图色彩 1 0 1 0 1 0 1 0 最后还是背景颜色使用BitBlt函数中的Raster参数既可以完成上面的运算dc-BitBlt(210,213,198,113,mdc,0,0,raster),VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,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运算值;,产生镂空图的步骤如下:步骤一:使用BitBlt函数将蒙版与背景做AND运算,贴到目的地DC中。这时我们看到的是将蒙版放在背景上的效果。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,步骤二:再以要镂空的图与上面一步生成的背景图做OR运算,贴到目的地DC中。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,dc.BitBlt(0,0,right,bottom,mdc,0,0,SRCCOPY);/贴背景图dc.BitBlt(350,150,104,154,mdc,104,0,SRCAND);/与背景图做AND运算dc.BitBlt(350,150,104,154,mdc,0,0,SRCPAINT);/与上一幅图做OR运算,VC+游戏编程游戏的编程技术,注意的问题:1.对要镂空的对象,必须要制作它对应的蒙版2.蒙版的大小尺寸必须和原图一致,VC+游戏编程游戏的编程技术,第六节 半透明效果(和透明的区别)在二维游戏中,常常需要将多幅图重叠显示,但又不完全遮盖,只是就要用到“半透明技术”。在进行半透明处理之前,需要为各个图像指定透明度(一般只对顶层的物体指定),规定100%的透明度表示完全透明,0%表示完全不透明。实际应用中的透明度用Alpha表示。假设现在要把一幅图A以40%的透明度覆盖在背景图B上,操作步骤如下:,VC+游戏编程游戏的编程技术,步骤:取出位图A的各个像素点的数据,将各个像素点的RGB值分别乘以(1-40%),然后将它放入到一个内存数组中。取出背景图与位图重叠部分的像素点,并将各个像素点的RGB值分别乘以40%,然后再将其放入另一个内存数组中。将产生的两个数组相加。透明度计算公式:半透明图色彩=源图像色彩(1-透明度)+背景图像色彩透明度,位图像素的颜色结构:下图是一张10*5像素的位图结构,VC+游戏编程游戏的编程技术,在上图中,每个像素中的RGB值是以BGR的顺序存储,每个像素下面的数字是程序读出色彩值后,该色彩值存放于数组的元素索引值。现有两幅图如下,左为源图,右为背景图。,VC+游戏编程游戏的编程技术,上面3幅图的透明度分别为0.4,0.2,0.8,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,第七节 物理动作设计一、物体移动匀速移动 V=Vx+Vy Vx,Vy分别表示X,Y方向上的速度变速运动 V=Vo+at t可以在定时器中设置 Vx=Vxo+ax Vy=Vyo+ay ax,ay分别为x,y方向的加速度磨擦力及其模拟下落与弹跳 Vy=Vyo+gtdc.BitBlt(xlast,170,100,100,mdc,0,0,WHITENESS);/在上次贴图的区域贴上白色,覆盖上一次贴图的图案,二、物体间的碰撞 对物体的碰撞检测包括:人物与物体碰撞、物体与物体碰撞、人物与人物碰撞等。常见的碰撞检测一般有:范围检测、碰撞点检测和颜色检测。通过范围(区域)检测碰撞:这种方法适用于可取的其范围大小的规则几何图形,如下图:,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,2.碰撞点检测 这种方法也是范围(区域)检测的一种,不同的是用碰撞点来代替碰撞区域。一般是在两个运动的物体中的一个物体上设置碰撞点,另一个物体上设置检测区域,运行时逐个判断碰撞点是否在检测区域中。,VC+游戏编程游戏的编程技术,3.通过颜色检测碰撞 这种方法较为精确,但是相对也较为耗时。如图,我们要检测汽车和树林的碰撞(或是遮盖)就要为树林做一张掩码图将树林的主体颜色用黑色填充。产生汽车驶入树林后面的效果采用先在背景上贴上汽车的图像,然后再在上面用镂空图技术贴上树林;然后判断汽车图像在树林中的相对位置,方法是将汽车图像上的点和掩码图上相应位置的点按位AND,检查结果中是否有黑色(RGB值为0)存在,这是因为任何颜色的RGB值与黑色图像做AND 运算,将得到黑色。如果预先排除汽车图像中原本的黑色部分以及汽车图像中的白色部分,那么黑色点的出现就表明发生了碰撞。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,例:颜色检测,前景图,暗图,VC+游戏编程游戏的编程技术,取出车子图所有象素点的颜色,取出目前车子图所在位置区域中所有暗图像点的颜色,检查运算结果是否有黑色,若出像黑色则表示发生碰撞,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,DC名称 说明mdc 用来做镂空处理mdc1 用来读取位图对象mdc2 存放汽车所在位置区域中暗图的影像,三、粒子的应用 粒子指颗粒状的物体,如雪花、一块炸弹碎片、一颗沙子、烟雾中的微粒等,许多粒子组合起来就形成了我们现实生活中所看到的各种物理现象。使用粒子,首先要了解粒子的用途和属性,然后再定义出一个合适的粒子类型。如我们定义一个雪花粒子:Struct snow int x;/雪花所在的x坐标 int y;/雪花所在的y坐标 BOOL exist;/雪花是否存在例:雪花纷飞。在这个例子中,雪花不断出现并缓缓落下,直到达到雪花的上限(本例中为50)便不再增加。当雪花落到地面上时,就重新设置雪花的显示位置为窗口的上方,以产生雪花消失与新的雪花出现的效果。本例中OnTimer函数是整个程序的重点。,VC+游戏编程游戏的编程技术,爆炸碎片(火球)粒子:Struct fireball int x;/火球所在位置的x坐标 int y;/火球所在位置的y坐标 int vx;/火球在x方向速度 int vy;/火球在y方向速度 int lasted;/火球存在时间 BOOL exist;/记录火球是否存在,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,第八节 管理程序中的消息一、键盘消息下表表示MFC中键盘输入消息的处理方式消息 说明WM_KEYDOWN 按下键盘按键所发出的消息 WM_KEYUP 松开按键所发出的消息WM_CHAR 按下键盘按键所发出的消息,并转换为对应的字符,在MFC中,其消息是以一组虚键(virtual Key)来判断按下或松开键盘上的按键动作,上面三种消息中WM_KEYDOWN、WM_KEYUP不区分输入按键的大小写,而WM_CHAR则会将使用者按下按键的虚键转换成字母,且具有分辨字母大小写功能。这三种消息的消息处理函数的格式比较类似,以WM_KEYDOWN消息的处理函数OnKeyDown为例:void canvas Frame:OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)/判断并处理按键消息程序代码CFrameWnd:OnKeyDown(nChar,nRepCnt,nFlags);,VC+游戏编程游戏的编程技术,第一个参数nCha是按键的虚键,这些虚键都以VK_开头,下表列出几个常用按键的虚键虚键 说明 十六进制VK_ESCAPE Esc 键 0 x1B VK_LEFT 左箭头键 0 x25VK_UP 上箭头键 0 x26VK_RIGHT 右箭头键 0 x27VK_DOWN 下箭头键 0 x28VK_INSERT Insert 键 0 x2DVK_DELETE Delete 键 0 x2EVK_SPACE 空格键 0 x20VK_SHIFT Shift 键 0 x10VK_CONTROL Ctrl 键 0 x11VK_BACK Backspace 键 0 x08,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,二、鼠标消息处理鼠标输入消息:消息 说明WM_LBUTTONDBLCLK 双击按鼠标左键消息WM_LBUTTONDOWN 按下鼠标左键消息WM_LBUTTONUP 松开鼠标左键消息WM_RBUTTONDBLCLK 双击按鼠标右键消息WM_RBUTTONDOWN 按下鼠标右键消息WM_RBUTTONUP 松开鼠标右键消息WM_MOUSEACTIVATE 鼠标移动消息WM_MOUSEMOVE 鼠标滚轮转动消息,鼠标按键消息(左键)void canvasFrame:OnLBUTTONDBLCLK(UINT nFlags,CPoint point)/处理鼠标消息程序代码CFrameWnd:OnLBUTTONDBLCLK(nFlags,point);,VC+游戏编程游戏的编程技术,第一个参数nFlags代表消息发生时是否有其它按键被按下,nFlags的参数值说明如下:参数值 说明MK_CONTROL 按下Ctrl 键MK_SHIFT 按下Shift 键MK_LBUTTON 按下鼠标左 键MK_MBUTTON 按下鼠标中键MK_RBUTTON 按下鼠标右键 第二个参数 Point表示传入目前鼠标指针所在的坐标位置,point.x为其在x轴上的位置,point.y为其在y轴上的位置。,VC+游戏编程游戏的编程技术,鼠标移动消息void canvasFrame:OnMouseMove(UINT nFlags,CPoint point)/处理鼠标移动消息程序代码CFrameWnd:OnMouseMove(nFlags,point);参数nFlags与Point所代表的意义同上。,VC+游戏编程游戏的编程技术,鼠标滚轮消息void canvasFrame:OnMouseWhell(UINT nFlags,short zDelta,CPoint pt)/处理鼠标滚轮消息程序代码 CFrameWnd:OnMouseWhell(nFlags,Delta,pt);nFlags同样代表消息发生时是否有其它按键被按下;如果参数zDalta返回的值为120,表示滚轮向前滚动,-120表示向后滚动;参数pt是代表鼠标指针所在的坐标点。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,第九节 人工智能应用一、移动型人工智能 移动型人工智能主要包括三类:固定模式移动、追逐移动、躲避移动。固定模式移动 在程序里,我们给物体定义一个移动路径公式,物体就会按照这个公式来移动,这种方式就属于固定模式的移动。固定模式移动的设计重点在于为游戏中每一类移动路径类似的对象建立一个共享移动路径的结构,由此共享结构所声明的对象则拥有类似的移动方式,但通过设置不同的初始值,这些物体的移动路径就会有所不同。,2.追逐移动 追逐移动最常见的情况是计算机怪物追逐玩家,算法如下:if(怪物X玩家X)怪物X-;else 怪物X+;if(怪物Y玩家Y)怪物Y-;else 怪物Y+;,VC+游戏编程游戏的编程技术,对上面的算法作如下修改:if(怪物HP200)/生命值大于200时才追 p=rand()%3;if(p!=1)/余数不为1时进行追逐 if(怪物X玩家X)怪物X-;else 怪物X+;If(怪物Y玩家Y)怪物Y-;else 怪物Y+;else 怪物HP+=5;/怪物不动,休息补血,VC+游戏编程游戏的编程技术,3.躲避移动if(怪物X玩家X)怪物X+;else 怪物X-;if(怪物Y玩家Y)怪物Y+;else 怪物Y-;,VC+游戏编程游戏的编程技术,二、行为型人工智能 行为型AI的基本原理是物体会随着不同的情况而改变,并作出一些特有的行为动作,而这些物体可以包含游戏中的主角、怪物,或四周环境中的物品。物体的动作行为 在游戏中加入AI,要预先想好一些可能会发生的状况和物体所要执行的动作,并利用if语句来让物体根据各种情况产生相应的行为。例如以一盏灯为例,它的行为只有两种:亮与不亮,但是使亮或不亮的情况有多种,如:停电了、电灯坏了、没按开关等等。考虑到这些情况后,我们就可以利用if语句来赋予一盏灯相应的行为型AI了。我们有如下算法:,VC+游戏编程游戏的编程技术,if(停电)灯不亮else if(灯坏了)灯不亮 else if(没按开关)灯不亮 else 灯亮,VC+游戏编程游戏的编程技术,假设一只怪物有以下几种行为:普通攻击 施放攻击魔法使劲全力攻击补血逃跑我们可以编写如下算法,VC+游戏编程游戏的编程技术,if(生命值100)if(rand()%9)实施魔法攻击(1/10的几率使用魔法攻击)else 实施普通攻击else swich(rand()%5)case 0:普通攻击 break;case 1:魔法攻击 break;case 2:使尽全力攻击 break;case 3:补血 break;case 4:逃跑 if(rand()%2=0)(1/2几率成功)逃跑成功;else 逃跑失败 break;,VC+游戏编程游戏的编程技术,2.路径查找 以迷宫为例,设计路径查找时必须赋予物体一些走迷宫的法则,如:前面的路走过就往没有走过的地方走等,这些法则必须可以让物体探索迷宫中的每一块区域来找到出口,若走迷宫的法则定得不完整,那么物体可能在一个地方兜圈子,永远也找不到出口。在迷宫程序中,定义一个二维数组maze88用于存储整个迷宫状态,如下图所示:并设置入口的元素值为3,入口的元素值为2,墙的元素值为1,通路的元素值为0。代表入口的数组元素maze10。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,程序中使用一个双向链表来记录小球所走过的路径,结构声明如下:struct listint m;int n;struct list*next;struct list*back;typedef struct list node;typedef node*pointer;数组pass88用来记录迷宫中的格子是否已走过,当小球走向没有走过的格子时,这一格就会被加到链表中,当小球走到其上下左右都有墙或都已走过时,就必须倒退,而每倒退一格就表示那一个是错误的路,因此要将其从链表中删除。直到走出迷宫,链表中的每一个节点便是正确的行进路线。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,走迷宫规则:步骤1:先试着往下走,如果下一格有墙或走过,则试着往右走;步骤2:如果右一格有墙或走过,则试着往左走;步骤3:如果左一格有墙或走过,则试着往上走;步骤4:如果上一格有墙或走过,则表示上下左右都没有未走过的路,这时必须回退,即回到上一个节点的位置,并删除目前的节点。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,OnTimer(UINT nIDEvent)Go()Search()OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags),VC+游戏编程游戏的编程技术,3.策略型人工智能 策略型人工智能是所有AI中最复杂的一种,常见的是棋盘类游戏就是这种策略的典范。这类游戏通常是由计算机根据目前的情况分析计算机所有可走棋步和可能获胜的几率,并计算玩家走棋步和至胜的几率,最后选择一个最佳走法。,VC+游戏编程游戏的编程技术,VC+游戏编程游戏的编程技术,(1)计算所有获胜组合:60+60+2x(6+(5+4+3+2+1)x2)=192,VC+游戏编程游戏的编程技术,(2)定义数组 设左图的排列为192种获胜方式中的第8种,那么初始化ptable时数组元素的值设置如下:ptable008=falseptable018=false ptable218=true ptable328=true