《第二章 二维游戏的编程技术.ppt》由会员分享,可在线阅读,更多相关《第二章 二维游戏的编程技术.ppt(140页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、VC+游戏编程第二章 二维游戏的编程技术 第一节第一节 二维游戏的基本流程和架构二维游戏的基本流程和架构1.二维游戏的基本功能:二维游戏的基本功能:交互和输出交互和输出u交互部分:根据用户的操作,改变游戏的各种数据,以反交互部分:根据用户的操作,改变游戏的各种数据,以反映游戏的当前状态。映游戏的当前状态。u输出:处理游戏运行中的各种数据,在输出设备上体现游输出:处理游戏运行中的各种数据,在输出设备上体现游戏的内容,包括游戏画面、游戏音效、游戏提示等。戏的内容,包括游戏画面、游戏音效、游戏提示等。这两个部件的执行由调度模块指挥,简单的调度模这两个部件的执行由调度模块指挥,简单的调度模块是一个块是
2、一个do-while循环,串行执行:交互循环,串行执行:交互输出输出再输再输出出再渲染再渲染。当然也可以将两个部件分成不同的线程,。当然也可以将两个部件分成不同的线程,并行执行。并行执行。VC+游戏编程游戏的编程技术2.实现二维游戏框架,需要做下面的几个工作:实现二维游戏框架,需要做下面的几个工作:u实现游戏地图的加载和编辑操作实现游戏地图的加载和编辑操作u图像的半透明技术图像的半透明技术u精灵动画技术精灵动画技术:采用连续帖图方式产生动画效果采用连续帖图方式产生动画效果u碰撞检测碰撞检测VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术第二节第二节 VC+基本绘图技巧基本绘图技巧一、为
3、什么使用一、为什么使用VC+来设计游戏来设计游戏1.优异的运行速度优异的运行速度:2.直接访问内存(直接访问内存(VB间接访问)间接访问)-双刃剑双刃剑3.(VC+)+MFC数据库数据库 架构架构4.(VC+)+Windows API 架构架构二、与其他函数库的结合二、与其他函数库的结合1.DirecX SDK2.OpenGLVC+游戏编程游戏的编程技术三、游戏舞台的坐标系统游戏舞台的坐标系统1.屏幕区、窗口、客户区屏幕区、窗口、客户区 屏幕区的大小视用户计算机所设置的分辨率而定,如:屏幕区的大小视用户计算机所设置的分辨率而定,如:1024x768VC+游戏编程游戏的编程技术2.坐标点与坐标转
4、换坐标点与坐标转换 以屏幕左上角为原点,屏幕上的任何位置都可以用一个坐标表示,以屏幕左上角为原点,屏幕上的任何位置都可以用一个坐标表示,我们称为屏幕坐标。当程序中调用某些以坐标点为实参的函数时,都我们称为屏幕坐标。当程序中调用某些以坐标点为实参的函数时,都要传递相应的屏幕坐标,如果我们只知道该点在客户区中的位置,则要传递相应的屏幕坐标,如果我们只知道该点在客户区中的位置,则必须先将它转换为屏幕坐标。转换方法是调用必须先将它转换为屏幕坐标。转换方法是调用ClientToScreen函函数,反之调用数,反之调用ScreebToClientVC+游戏编程游戏的编程技术四、四、MFC(Microsof
5、t Foundation Class)绘绘图类图类1.MFC的的GDI类类 GDI(Graphic Device Interface)意为)意为“图形设备接口图形设备接口”。Windows的架构不允许使用者直接存取的架构不允许使用者直接存取VGA显卡上的内存,所以显卡上的内存,所以在在MFC中提供了图形设备接口类,用来让使用者显示数据。中提供了图形设备接口类,用来让使用者显示数据。上图表示上图表示GDI类都是从类都是从CGdiObject继承而来,这些类必须在配合设备继承而来,这些类必须在配合设备上下文(上下文(DC,Device Context)来使用。这些)来使用。这些GDI类的用途如下:
6、类的用途如下:VC+游戏编程游戏的编程技术CBimap:该类封装了一个:该类封装了一个GDI位图,提供一个操作位图位图,提供一个操作位图的接口的接口CBrush:该类封装了一个:该类封装了一个GDI画刷,可被选择为设备描述画刷,可被选择为设备描述表的当前画刷,画笔为图形中填满样式表的当前画刷,画笔为图形中填满样式CFont:该类封装了一种:该类封装了一种GDI字体,可被选择为设备描述字体,可被选择为设备描述表的当前字体表的当前字体Cpalette:该类封装了一个:该类封装了一个GDI调色板,可作应用程序和调色板,可作应用程序和一色彩输出设备如显示器之间的接口一色彩输出设备如显示器之间的接口CP
7、en:该类封装了一种:该类封装了一种GDI画笔,可被选择为设备描述的画笔,可被选择为设备描述的当前画笔,画笔为图形外框样式当前画笔,画笔为图形外框样式CRgn:该类封装了一:该类封装了一GDI域,用于操作窗口内的椭圆域或域,用于操作窗口内的椭圆域或多边形域。该类一般与多边形域。该类一般与CDC类的裁剪成员一起使用类的裁剪成员一起使用VC+游戏编程游戏的编程技术2.MFC的的CDC类类DC(Device Context,设备上下文),设备上下文)可以将其想象成一个图形绘制的区域。可以将其想象成一个图形绘制的区域。当要在屏幕上绘图时,应用程序就必须先当要在屏幕上绘图时,应用程序就必须先取得取得“屏
8、幕的屏幕的DC”才可以进行绘图;当使才可以进行绘图;当使用者要操作其窗口绘图时,就必须先取得用者要操作其窗口绘图时,就必须先取得“操作窗口的操作窗口的DC”,然后再把要绘制的图,然后再把要绘制的图形放到各个形放到各个DC中,这时在该中,这时在该DC所代表的所代表的区域中,就会显示所绘制的图形区域中,就会显示所绘制的图形。VC+游戏编程游戏的编程技术 MFC把各种不同的把各种不同的DC类包装在类包装在CDC类类中,并提供了许多与绘图有关的函数。中,并提供了许多与绘图有关的函数。VC+游戏编程游戏的编程技术CClientDC:代表操作窗口的:代表操作窗口的DC,可用于在快速,可用于在快速响应鼠标事
9、件时进行绘画响应鼠标事件时进行绘画CMetaFileDC:Windows元文件的设备环境类,元文件的设备环境类,Windows元文件包含一个图形设备接口元文件包含一个图形设备接口(GDI)命令序列,该序列可被重新执行而创建)命令序列,该序列可被重新执行而创建一幅图像一幅图像CPaintDC:响应:响应MN_PAINT消息的消息的DC,是显,是显示设备环境类,用于窗口中的示设备环境类,用于窗口中的OnPaint成员和视成员和视图图OnDraw成员函数中,自动调用成员函数中,自动调用BeginPaint进行构造,调用进行构造,调用EndPaint进行析构。进行析构。CWindowsDC:代表整个屏
10、幕的:代表整个屏幕的DC,即整个窗,即整个窗口的显示设备环境类,包括客户区和框架区。口的显示设备环境类,包括客户区和框架区。VC+游戏编程游戏的编程技术五、构建游戏窗口五、构建游戏窗口1.设置设置VC+应用程序中的头文件应用程序中的头文件VC+游戏编程游戏的编程技术 这样就不用担心这样就不用担心VC+会出现编译程序找不到会出现编译程序找不到DirectX的的.h和和.lib的头文件错误的头文件错误VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术2.建立程序项目建立程序项目使用使用VC+中的中的File|New命令建立新项目并按下面步骤操作:命令建立新项目并按下面步骤操作:可以使用可以使
11、用VC+的的MFC架构开发架构开发应用程序,它可应用程序,它可以帮助你套入许以帮助你套入许多默认的窗口、多默认的窗口、对话框、菜单等对话框、菜单等基本组件,这些基本组件,这些组件在设计游戏组件在设计游戏时基本用不上,时基本用不上,因此只要建立一因此只要建立一个单纯的个单纯的Win32应用程序项目即应用程序项目即可。可。VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术 建立新项目后,接着在建立新项目后,接着在Header Files中新增中新增一个名为一个名为stdafx.h的头文件,方法如下:的头文件,方法如下:VC+游戏编程游戏的编程技术 在项目中加入此文
12、件后,就打开它并加以编辑。在这个程在项目中加入此文件后,就打开它并加以编辑。在这个程序中,所要引用的头文件都是在序中,所要引用的头文件都是在stdafx.h中设定。中设定。VC+游戏编程游戏的编程技术下面建立这个项目所属的资源文件下面建立这个项目所属的资源文件VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术 最后,还要为这个新项目设定使用的最后,还要为这个新项目设定使用的MFC函函数库,方法如下数库,方法如下VC+游戏编
13、程游戏的编程技术完成了设置完成了设置MFC之后,就可以建立应用程序窗口了之后,就可以建立应用程序窗口了VC+游戏编程游戏的编程技术应用程序与窗口应用程序与窗口 下面我们建立一个信息窗口来展示程序的功能,下面我们建立一个信息窗口来展示程序的功能,即建立一个应用程序对象以及窗口对象。即建立一个应用程序对象以及窗口对象。VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术 这样,这样,VC+便会自动为这个项目建立一个便会自动为这个项目建立一个gameFrame类类。双。双击击gameFrame.h,即可看到它的内容,即可看到它的内容。VC+游戏编程游戏的编程技术下面我们再建一个下面我们再建一个C
14、lass类,并将其命名为类,并将其命名为gameAppVC+游戏编程游戏的编程技术 gameApp Class建立完后,先在建立完后,先在gameApp.h中声中声明明MFC的初始函数,内容如下:的初始函数,内容如下:VC+游戏编程游戏的编程技术 然后在然后在gameApp.cpp中建立函数的实体:中建立函数的实体:VC+游戏编程游戏的编程技术最后建立一个基本的最后建立一个基本的Windows窗口,在窗口,在gameFrame.cpp中加入如下程序代码:中加入如下程序代码:这段程序建立了一个名称为这段程序建立了一个名称为“绘图窗口绘图窗口”的窗口,的窗口,MFC的的Create()函数会帮你完
15、成所有建立窗口时遇到的函数函数会帮你完成所有建立窗口时遇到的函数调用动作。调用动作。VC+游戏编程游戏的编程技术运行结果:VC+游戏编程游戏的编程技术 在在gameFrame.cpp中可以加入窗口控中可以加入窗口控制命令,程序代码如下:制命令,程序代码如下:width=dc.GetDeviceCaps(HORZRES);height=dc.GetDeviceCaps(VERTRES);GetWindowRect(&rect);width=(width-(rect.right-rect.left)/2;height=(height-(rect.bottom-rect.top)/2;MoveWin
16、dow(width,height,(rect.right-rect.left),(rect.bottom-rect.top),true);这样可以将窗口放置在屏幕的正中。这样可以将窗口放置在屏幕的正中。VC+游戏编程游戏的编程技术六、六、MFC绘图类绘图类-从项目建立绘图成员函数从项目建立绘图成员函数 执行执行VC+中的中的View|Class Wizard,打开,打开MFC Class Wizard对话框对话框VC+游戏编程游戏的编程技术 这时在项目的程序代码中多出了一个有关窗口绘图的这时在项目的程序代码中多出了一个有关窗口绘图的OnPaint()函数函数VC+游戏编程游戏的编程技术这样可以
17、在这样可以在OnPaint()函数中编写程序代码()函数中编写程序代码void gameFrame:OnPaint()CPaintDC dc(this);oldFont=dc.SelectObject(&newFont);dc.SetTextColor(RGB(0,0,255);dc.TextOut(30,60,绘制文字绘制文字);dc.SelectObject(oldFont);在在gameFrame:gameFrame()之前声明新字体对象与旧字体指针之前声明新字体对象与旧字体指针:CFont newFont,*oldFont;在在gameFrame()中建立中建立Cfont类对象类对象n
18、ewFontnewFont.CreateFont(100,50,50,0,100,TRUE,TRUE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,楷体楷体);VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术例:线段绘制、绘制填充的区域例:线段绘制、绘制填充的区域(画刷实例祥见画刷实例祥见C+绘图介绍绘图介绍-new.ppt),第三节第三节 地图的创建与显示地图的创建与显示 一、图像的加载和显示一、图像的加载和显示 1.图形文件格式
19、:图形文件格式:BMP、GIF、JPEG、TIF。其。其中中BMP是是Windows平台的标准图像格式。平台的标准图像格式。BMP图像,又名位图图像(图像,又名位图图像(bitmap),这种格式像一),这种格式像一张地图一样,记录目标图像上每个像素点的颜色值。张地图一样,记录目标图像上每个像素点的颜色值。2.加载位图文件:加载位图文件:步骤一:将位图加载到内存步骤一:将位图加载到内存DC中中步骤二:将内存步骤二:将内存DC中的内容绘制到要显示位图的中的内容绘制到要显示位图的 DC中。见位图程序。中。见位图程序。VC+游戏编程游戏的编程技术3.两个函数:两个函数:(1)加载位图加载位图LoadI
20、mage()()HANDLE LoadImage(HINSTANCE hinst,/包含位图实体的包含位图实体的handle LPCTSTR lpszName,/位图来源位图来源 UINT uType;/加载位图的类型加载位图的类型 int cxDesired,/位图的宽度位图的宽度 int cyDesired,/位图的高度位图的高度 UINT fuLoad /加载位图的方式加载位图的方式 );当位图加载到内存当位图加载到内存DC后,只要把内存后,只要把内存DC中的内容贴中的内容贴到显示位图的到显示位图的DC中即可。只要利用中即可。只要利用CDC:BitBlt函数皆函数皆可以完成这个操作。可以
21、完成这个操作。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 /
22、Raster运算值运算值 ;VC+游戏编程游戏的编程技术例如语句:例如语句:dc-BitBlt(0,0,500,400,mdc,200,100,raster)这里可以假设这里可以假设dc是代表操作窗口的是代表操作窗口的DC,mdc是存储位图是存储位图来源的内存来源的内存DCVC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术Raster值:BLACKNESS:将位图转换为黑色DSTINVERT:将目的DC做NOT运算MERGECOPY:将选择的画刷与位图做AND运算MERGEPAINT:先将位图做NOT运算,再与目的 DC做OR 运算NOTSRCCOPY:将位图
23、做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+游戏
24、编程游戏的编程技术2.菱形地图菱形地图(斜角地图贴图斜角地图贴图)用小图拼凑实现大地图,斜角地图即有立体感,是一用小图拼凑实现大地图,斜角地图即有立体感,是一种常用的二维画面上表现三维场景的技术种常用的二维画面上表现三维场景的技术(三国风云三国风云)VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术(1)地图的拓扑结构地图的拓扑结构 将每张小图的长宽设置为将每张小图的长宽设置为64x32像素,则要贴上像素,则要贴上10 x15张小图,可以下图计算:张小图,可以下图计算:将上述方块地图编号:将上述方块地图编号:0123456789101112131415161718192021222324
25、252627VC+游戏编程游戏的编程技术 VC+游戏编程游戏的编程技术图块左上角的帖图坐标计算公式如下:图块左上角的帖图坐标计算公式如下:左上角的左上角的X坐标坐标=xstart+行编号行编号*w/2-列编号列编号*w/2 左上角的左上角的y坐标坐标=ystart+列编号列编号*h/2 行编号行编号*h/2 xstart,ystart分别代表第一张图块左上角贴图的坐标位置分别代表第一张图块左上角贴图的坐标位置VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术TransparentBlt实现透明实现透明 函数功能:该函数对指定的源设备环境中的矩形区域像素的函数功
26、能:该函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(颜色数据进行位块(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+游戏编程游戏的编程技术参数:
27、参数:hdcDest:指向目标设备环境的句柄。:指向目标设备环境的句柄。nXOriginDest:指定目标矩形左上角的:指定目标矩形左上角的X轴坐标轴坐标 nYOriginDest:指定目标矩形左上角的:指定目标矩形左上角的Y轴坐标,轴坐标,nWidthDest:指定目标矩形的宽度。:指定目标矩形的宽度。nHeightDest:指定目标矩形高度的句柄。:指定目标矩形高度的句柄。hdcsrc:指向源设备环境的句柄。:指向源设备环境的句柄。nXOriginSrc:指定源矩形(左上角)的:指定源矩形(左上角)的X轴坐标轴坐标 nYOriginsrc:指定源矩形(左上角)的:指定源矩形(左上角)的Y轴
28、坐标轴坐标 nWidthSrc:指定源矩形的宽度。指定源矩形的宽度。nHeightSrc:指定源矩形的高度。:指定源矩形的高度。crTransparent:源位图中的:源位图中的RGB值当作透明颜色。值当作透明颜色。返回值:如果函数执行成功,那么返回值为返回值:如果函数执行成功,那么返回值为TRUE;如果;如果函数执行失败,那么返回值为函数执行失败,那么返回值为FALSE。VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术透明色透明色(又称关键色又称关键色),指的是图像传送中不会被传送的区域的颜色。比,指的是图像传送中不会被传送的区域的颜色。比如说我们先在一个纯绿色的背景上画了一个人物,
29、把这幅画调入一个页如说我们先在一个纯绿色的背景上画了一个人物,把这幅画调入一个页面,再将纯绿色设为这个页面的透明色。以后当我们进行图像传送时,面,再将纯绿色设为这个页面的透明色。以后当我们进行图像传送时,只需指定传送范围为一个包括了人物的矩形,只需指定传送范围为一个包括了人物的矩形,DirectDraw将只会把不将只会把不规则的人物传到新的页面上而不会把纯绿色的背景一起传送。当然,人规则的人物传到新的页面上而不会把纯绿色的背景一起传送。当然,人物本身不能包含纯绿色,否则就不能完整地传送了。物本身不能包含纯绿色,否则就不能完整地传送了。一个页面在同一时刻只能有一种透明色,设置透明色的方法是一个页
30、面在同一时刻只能有一种透明色,设置透明色的方法是 DDSetColorKey(页面名页面名,RGB(红红,绿绿,蓝蓝);例如例如DDSetColorKey(lpDDSMap,RGB(255,0,255);VC+游戏编程游戏的编程技术障碍物贴图3.单一背景卷动技术(滚屏地图)单一背景卷动技术(滚屏地图)单一背景卷动技术就是只有一张地图,随着时间的推单一背景卷动技术就是只有一张地图,随着时间的推移而在窗口中慢慢移动位置,这一技术是利用在窗口中连移而在窗口中慢慢移动位置,这一技术是利用在窗口中连续贴上背景所产生的效果。如下图,由左上至右下的几个续贴上背景所产生的效果。如下图,由左上至右下的几个黑框,
31、就是操作窗口在每个不同时间所显示的部分地图。黑框,就是操作窗口在每个不同时间所显示的部分地图。只要设定一个定时器,按从左上至右下的顺序在窗口中重只要设定一个定时器,按从左上至右下的顺序在窗口中重绘所显示的部分地图就可以产生卷动的效果。绘所显示的部分地图就可以产生卷动的效果。VC+游戏编程游戏的编程技术完整地图屏幕可见区域VC+游戏编程游戏的编程技术4.多重背景卷动技术多重背景卷动技术(多层次地图多层次地图)多重背景卷动就是有多幅背景图,而这些背景图的卷动多重背景卷动就是有多幅背景图,而这些背景图的卷动速度都不相同。如开车时,窗外背景变化最快的依次是车速度都不相同。如开车时,窗外背景变化最快的依
32、次是车旁的树木,然后是天空的云朵,最后才是远方的太阳。旁的树木,然后是天空的云朵,最后才是远方的太阳。VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术第四节第四节 动画技术动画技术 动画和电影一样,都是将差异很小的图像一幅幅显动画和电影一样,都是将差异很小的图像一幅幅显示。由于人眼的视觉暂留现象,看上去就像图像动了起示。由于人眼的视觉暂留现象,看上去就像图像动了起来。比如在来。比如在RPG中,我们要实现主角从中,我们要实现主角从(x1,y1)移动到移动到(x2,y2)处,我们可用如下代码处,我们可用如下代码:while(主角不在(x2,y2)在主角(x,y)处恢复背景;在(x+dx,y
33、+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的寄存器置位来实现,在Direc
34、tX中可用Flip或Blt实现。Mode X是实模式下的编程方式,以前DOS下的游戏经常使用。VC+游戏编程游戏的编程技术游戏中的动画按其呈现方式可分为两种:游戏中的动画按其呈现方式可分为两种:1.直接播放方式:这种方式经常被用来播放游戏的直接播放方式:这种方式经常被用来播放游戏的片头和片尾,如片头和片尾,如AVI和和MPEG媒体文件。媒体文件。2.连续贴图方式:利用连续贴图的成像技术来制作连续贴图方式:利用连续贴图的成像技术来制作动画效果动画效果即精灵动画。所谓即精灵动画。所谓“精灵精灵”就是指就是指一个或一组位图图像被合成到背景图像上,并产一个或一组位图图像被合成到背景图像上,并产生运动的
35、效果。相对于屏幕而言,生运动的效果。相对于屏幕而言,“精灵精灵”通常通常是很小的,当今的图形硬件可以很快地处理精灵是很小的,当今的图形硬件可以很快地处理精灵动画,使得场景中的很多动画,使得场景中的很多“精灵精灵”可以同时运动。可以同时运动。一、定时器的运用一、定时器的运用 定时器(定时器(Timer)每隔一段时间就发出一个)每隔一段时间就发出一个WM_TIMER消息,当程序接收到这个消息时,消息,当程序接收到这个消息时,便可以决定接下来作哪些事情。通常用在控制便可以决定接下来作哪些事情。通常用在控制动画显示的速度上。动画显示的速度上。1.建立定时器建立定时器 UINT SetTimer HWN
36、D hWnd /窗口句柄窗口句柄 UINT nIDEvent /计数器编号计数器编号 UINT uElapse /时间间隔时间间隔 TIMEPROC lpTimerFunc /回调函数回调函数 VC+游戏编程游戏的编程技术 第二个参数是计时器的编号,是唯一的,在同一窗口可第二个参数是计时器的编号,是唯一的,在同一窗口可以设定多个不同的编号,例如:以设定多个不同的编号,例如:SetTimer(1,100,NULL);SetTimer(2,200,NULL);第三个参数时间间隔为千分之一秒为单位,如果设为第三个参数时间间隔为千分之一秒为单位,如果设为1000,则每隔,则每隔1秒发出一个秒发出一个W
37、M_TIMER消息消息第四个参数是设定定时器发出消息时所要执行的回调函数。第四个参数是设定定时器发出消息时所要执行的回调函数。如果不使用,这个参数可以设为如果不使用,这个参数可以设为NULL,并在窗口的,并在窗口的OnTimer()函数中定义所要执行的程序代码。函数中定义所要执行的程序代码。下面的代码表示建立一个编号为下面的代码表示建立一个编号为1,时间间隔为,时间间隔为0.5秒,秒,且不使用回调函数的定时器:且不使用回调函数的定时器:SetTimer(NULL,1,500,NULL);VC+游戏编程游戏的编程技术2.删除定时器删除定时器 定时器建立后,它会一直依照我们设定的时定时器建立后,它
38、会一直依照我们设定的时间间隔发出间间隔发出WM_TIMER消息,因此我们要停止消息,因此我们要停止这个定时器,就要使用下面的函数:这个定时器,就要使用下面的函数:KillTimer(int nIDEvent);其参数就是我们要停止的定时器编号。其参数就是我们要停止的定时器编号。例例1 使用单个定时器显示动画使用单个定时器显示动画例例2 使用多个定时器显示动画使用多个定时器显示动画VC+游戏编程游戏的编程技术3.利用回调函数显示动画利用回调函数显示动画 回调函数通常用在有多个定时器情况下,分别用来回调函数通常用在有多个定时器情况下,分别用来设置各个定时器发出设置各个定时器发出WM_TIMER消息
39、时所要执行的程。消息时所要执行的程。Sttatic void CALLBACK TimeProc(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime)hWnd:定时器窗口的句柄;定时器窗口的句柄;nMsg:WN_TIMER消息;消息;nIDEvent:定时器编号;:定时器编号;dwTime:启用定时器后所经过的时间,以千分之一秒为单位:启用定时器后所经过的时间,以千分之一秒为单位VC+游戏编程游戏的编程技术二、镂空动画技巧二、镂空动画技巧 镂空图就是将图片中的一部分显示在另一张镂空图就是将图片中的一部分显示在另一张背景图上,而且出去图中不需要显示的部分
40、。背景图上,而且出去图中不需要显示的部分。(第五节)(第五节)三、半透明动画技术三、半透明动画技术 当一幅图显示在另一幅图上时,透过上面的当一幅图显示在另一幅图上时,透过上面的图能够看到下面的图,如上面的图显示的是玻璃图能够看到下面的图,如上面的图显示的是玻璃材质的物体,这时就要用到透明技术。(第六节)材质的物体,这时就要用到透明技术。(第六节)VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术第五节第五节 镂空图的制作镂空图的制作 镂空图就是将图片中的一部分显示在另一张背景图上,而且除去镂空图就是将图片中的一部分显示在另一张背景图上,而且除去图中不需要显示的部分(这部分必须是白色或黑色
41、)。图中不需要显示的部分(这部分必须是白色或黑色)。现有两幅图,左为背景图,右为需要贴到背景上的图。现有两幅图,左为背景图,右为需要贴到背景上的图。将右图显示到左图上,需要去掉边缘的黑色。将右图显示到左图上,需要去掉边缘的黑色。VC+游戏编程游戏的编程技术 镂空图制作原理镂空图制作原理左边图为人物称之为原始图,要镂空的部分为黑色,左边图为人物称之为原始图,要镂空的部分为黑色,右边只有黑色和白色,称之为蒙版或叫做掩码图。右边只有黑色和白色,称之为蒙版或叫做掩码图。VC+游戏编程游戏的编程技术镂空图的制作原理:镂空图的制作原理:由由C语言里的位运算,我们知道,任何颜色语言里的位运算,我们知道,任何
42、颜色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,不变;
43、白色按位,不变;白色按位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(2
44、10,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,/源位图左上角点的源位图左上角点
45、的y坐标坐标 DWORD dwRop /Raster运算值运算值 ;产生镂空图的步骤如下:产生镂空图的步骤如下:步骤一:使用步骤一:使用BitBlt函数将蒙版与背景做函数将蒙版与背景做AND运算,贴到运算,贴到目的地目的地DC中。这时我们看到的是将蒙版放在背景上的效中。这时我们看到的是将蒙版放在背景上的效果。果。VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术步骤二:再以要镂空的图与上面一步生成的背景图步骤二:再以要镂空的图与上面一步生成的背景图做做OR运算,贴到目的地运算,贴到目的地DC中。中。VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术dc.
46、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+游戏编程游戏的编程技术第六节第六节 半透明效果(
47、和透明的区别)半透明效果(和透明的区别)在二维游戏中,常常需要将多幅图重叠显示,在二维游戏中,常常需要将多幅图重叠显示,但又不完全遮盖,只是就要用到但又不完全遮盖,只是就要用到“半透明技术半透明技术”。在进行半透明处理之前,需要为各个图像。在进行半透明处理之前,需要为各个图像指定透明度(一般只对顶层的物体指定),规指定透明度(一般只对顶层的物体指定),规定定100%的透明度表示完全透明,的透明度表示完全透明,0%表示完表示完全不透明。实际应用中的透明度用全不透明。实际应用中的透明度用Alpha表示。表示。假设现在要把一幅图假设现在要把一幅图A以以40%的透明度覆的透明度覆盖在背景图盖在背景图B
48、上,操作步骤如下:上,操作步骤如下:VC+游戏编程游戏的编程技术步骤:步骤:1.取出位图取出位图A的各个像素点的数据,将各个像素点的各个像素点的数据,将各个像素点的的RGB值分别乘以(值分别乘以(1-40%),然后将它放),然后将它放入到一个内存数组中。入到一个内存数组中。2.取出背景图与位图重叠部分的像素点,并将各个取出背景图与位图重叠部分的像素点,并将各个像素点的像素点的RGB值分别乘以值分别乘以40%,然后再将其放,然后再将其放入另一个内存数组中。入另一个内存数组中。3.将产生的两个数组相加。将产生的两个数组相加。透明度计算公式:透明度计算公式:半透明图色彩半透明图色彩=源图像色彩源图像
49、色彩(1-(1-透明度透明度)+)+背景图像色彩背景图像色彩透明度透明度位图像素的颜色结构位图像素的颜色结构:下图是一张下图是一张10*510*5像素的位图结构像素的位图结构VC+游戏编程游戏的编程技术在上图中,每个像素中的在上图中,每个像素中的RGB值是以值是以BGR的顺序存储,的顺序存储,每个像素下面的数字是程序读出色彩值后,该色彩值存放每个像素下面的数字是程序读出色彩值后,该色彩值存放于数组的元素索引值。现有两幅图如下,左为源图,右为于数组的元素索引值。现有两幅图如下,左为源图,右为背景图。背景图。VC+游戏编程游戏的编程技术上面上面3幅图的透明度分别为幅图的透明度分别为0.4,0.2,
50、0.8VC+游戏编程游戏的编程技术VC+游戏编程游戏的编程技术第七节第七节 物理动作设计物理动作设计一、物体移动一、物体移动1.匀速移动匀速移动 V=Vx+Vy Vx,Vy分别表示分别表示X,Y方向上的速度方向上的速度2.变速运动变速运动 V=Vo+at t可以在定时器中设置可以在定时器中设置 Vx=Vxo+ax Vy=Vyo+ay ax,ay分别为分别为x,y方向的加速度方向的加速度3.磨擦力及其模拟磨擦力及其模拟4.下落与弹跳下落与弹跳 Vy=Vyo+gtdc.BitBlt(xlast,170,100,100,mdc,0,0,WHITENESS);/在上次贴图的区域贴上白色,覆盖上一次贴图