




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,游戏动画技巧,2,游戏动画,游戏中播放动画的方式: 直接播放视频文件,如片头动画 用连续贴图的方式实现动画效果,3,循环,游戏是以无限循环的方式不断地在游戏窗口 中进行窗口画面重绘的操作 即使画面没有任何变化,重绘的操作还是不断地进行, 一直到玩家选择结束游戏为止。,4,基础动画显示,5,掌握: 定时器使用 游戏循环在动画绘制的应用,6,定时器,定时器(Timer)可以每隔一段时间发出一个时间消息,程序一旦接收到这个消息,就可以决定接下来的运算。 这样的特性正好可以用来以固定的时间间隔显示图片,产生动画效果。 如何建立与使用定时器 ?,7,Windows API的SetTimer()函数可
2、为窗口建立一个定时器。 每隔一段时间就发出WM_TIMER消息。,8,定时器的建立,定时器是存在一个窗口之内的 UINT SetTimer ( HWND hWnd, /接收定时器消息的窗口 UINT nIDEvent, /定时器ID UINT uElapse,/时间间隔,毫秒 TIMERPROC lpTimerFunc /回调函数指针 );,这个代号在同一个窗口必须是唯一的,且值不为0 。,若此参数设为1000,则每间隔1秒发出一个WM_TIMER消息,设定由系统调用处理WM_TIMER消息的响应函数,如果不用响应函数处理WM_TIMER消息,则此参数应设为NULL。,9,例:建立定时器,Se
3、tTimer(hWnd, 1, 500, NULL); 没有指定消息响应函数,就需要在窗口函数中响应WM_TIMER处理定时器消息。 在窗口函数中如何响应定时器消息呢?,10,窗口WM_TIMER响应,LRESULT CALLBACK WndProc(HWND hWnd, .) / switch (message) case WM_TIMER: MyPaint(hdc); break; case WM_DESTROY:/ / ,11,删除定时器,定时器建立以后,就会一直按指定的时间间隔发送WM_TIMER消息。 如果需要停止这种行为,就用: BOOL KillTimer ( HWND hWnd
4、,/窗口句柄 UINT uIDEvent/定时器ID );,12,定时器动画例子,连续摆动的人物位图,13,定时器动画例子,BOOL InitInstance ( HINSTANCE hInstance, int nCmdShow) /.窗口建立 /加载位图 for(i=0;i7;i+) sprintf(filename,girl%d.bmp,i); girli = (HBITMAP)LoadImage( ); num = 0; SetTimer(hWnd,1,100,NULL); MyPaint(hdc); return TRUE; ,14,定时器动画例子,LRESULT CALLBACK
5、WndProc(HWND hWnd,.) int i; switch (message) case WM_TIMER:/ 定时器WM_TIMER消息 MyPaint(hdc); break; case WM_DESTROY: / 删除定时器 DeleteDC(mdc);ReleaseDC(hWnd,hdc); for(i=0;i7;i+) DeleteObject(girli); KillTimer(hWnd,1);PostQuitMessage(0); break; /,15,MyPaint (HDC hdc) if (num = 7) num = 0; SelectObject(mdc,g
6、irlnum); BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY); num+; ,16,定时器动画结果,SetTimer(hWnd, 1, 500, NULL); SetTimer(hWnd, 1, 1000, NULL); 演示并比较效果,17,定时器的优缺点,优点:简单方便。 缺点: (1)适合显示简易动画;小型的游戏。 (2)游戏本身需要显示顺畅的游戏画面,使玩家感觉不到延迟的状况。基本上游戏画面必须在一秒钟之内更新至少25次以上。 (3)这一时间之内程序:绘制、音效、数学物理的计算等操作。 (4)使用定时器的消息来驱动这些操作,往往达不到所要求的标准,
7、(5)产生画面显示不顺畅和游戏响应时间太长的情况,18,WM_TIMER做定时器精度不高,而且很难与游戏循环结合。 游戏循环速度很快,通常都是25fps以上 使用定时器,可能造成游戏画面响应不及时、不流畅。 解决方案?,19,游戏循环动画,20,循环动画,游戏循环是将原先程序中的消息循环加以修改。 判断其中的内容目前是否有要处理的消息? 如果有则进行处理, 否则按照设定的时间间隔来重绘画面。,21,构建一个游戏循环,while( msg.message!=WM_QUIT ) if( PeekMessage( ,22,代码分析,while当收到的消息不是WM_QUIT,则继续循环 PeekMes
8、sage函数检测目前是否有待处理的消息,有则处理消息,反之,进行游戏循环的处理 注意:不能用GetMessage,GetMessage取得WM_QUIT消息才返回0,其它时候是非零和-1(出错)。,23,如果消息队列里没有消息的时候不让Getmassage在Windows内部等待,就是说想充分利用程序的所有时间,就应该用peekmassage。 peekmessage是一个类似于Getmessage的函数,区别在于: 当消息队列里有消息的时候,Peekmessage取回消息,并在eax中返回非零值, 没有消息的时候它会直接返回,并在eax中返回零。,24,返回非零值的时候,程序检查消息是否是W
9、M_QUIT: 是则结束消息循环, 不是则用标准流程处理消息; 返回零的时候,表示是空闲时间,程序就可以做其他工作了, 但插入做其他工作的代码执行时间不能太长,以不超过10ms为好,否则会影响正常的消息处理,使窗口的反应看起来很迟钝. 如果必须处理很长时间的工作,那么应该将它们分成很多小部分处理,以便有足够频率用Peekmessage来检查消息.,25,peekmassage 比 Getmassage 多一个参数.这个参数表示在取回消息以后,对消息队列中的消息是否保留. 当这个参数是PM_REMOVE时,消息被取回的同时也被从消息队列里删除, 而用PM_NOREMOVE的时候,被取回的消息不会
10、从消息队列中删除,函数相当于偷看了这条消息.,26,TranslateMessage是用来把虚拟键消息转换为字符消息。这两个消息的附加参数(wParam和lParam)包含的是虚拟键代码和扫描码等信息,在程序中往往需要得到某个字符的ASCII码, TranslateMessage这个函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合转换为一条WM_CHAR消息 并将转换后的新消息投递到调用线程的消息队列中。 也就是说TranslateMessage会发现消息里是否有字符键的消息,如果有字符键的消息,就会产生WM_CHAR消息,如果没有就会产生什么消息。,27,DispatchMes
11、sage:该函数调度一个消息给窗口程序 GetTickCount函数:记录绘图时刻 由于游戏循环可以做到比定时器消息快,定时器消息时间间隔太短,会产生“堆叠”,就是连续几次时间间隔,只产生一个WM_TIMER消息,会对我们的处理产生影响,28,游戏循环动画例子,演示效果 尝试改变周期 注意游戏循环时间间隔的计算,29,游戏循环处理动画的优点,时间容易准确控制 不会丢失每一个处理流程 方便我们提高帧速率 但是:一旦计算机处理速度不能满足,处理不得当就会有游戏速度变慢的可能,30,解决方法:,游戏的逻辑运算中,时间标准以真实时间为准,比如程序已经运行到多少个Tick的时候就应该做什么动作;而不是游
12、戏循环循环了多少次做什么动作 这样解决的话,游戏运算不过来的时候,可以丢帧,但绝对不能降低游戏速度,造成难度的变化,31,透明动画,32,透明动画,透明动画是游戏中一定会用到的基本技巧。 通过图案的连续显示。 透明来产生背景图上的动画效果。,33,前景图和掩模图,恐龙的连续跑图,前提:在内存中创建DC。 在该DC上绘制完成后BitBlt到屏幕DC。 避免屏幕更新时的闪烁问题,34,单个恐龙动画例子,结合透明贴图和循环 如何结合?,35,void MyPaint(HDC hdc) if(num = 8) num = 0; SelectObject(bufdc,bg); /在mdc上贴背景图 Bi
13、tBlt(hdc,0,0,640,480,bufdc,0,0,SRCCOPY); SelectObject(bufdc,dra); /在mdc上进行精灵的透明处理 BitBlt(hdc,x,y,95,99,bufdc,num*95,99,SRCAND); BitBlt(hdc,x,y,95,99,bufdc,num*95,0,SRCPAINT); tPre = GetTickCount(); /记录绘图时刻 num+; x-=5; /计算下次贴图坐标 if(x=-95)x = 640; ,36,单个恐龙动画的结果,37,多个恐龙贴图,如果直接按照内存中的顺序贴图,精灵会有重叠的现象,彼此遮盖,
14、造成画面不正常。 解决?,38,动画显示问题,动画最基本的要求是画面要流畅且符合真实性。然而由于是利用贴图的方法来产生动画的,因此常会因一些小细节没注意到而使得动画的效果看起来不太自然。 贴图坐标修正。 排序贴图 。,39,贴图坐标修正,动画的制作需要多张连续的图片,如果这些连续图片的规格不一,那么进行贴图时就需要进行贴图坐标的修正,否则就可能产生动画晃动和不顺畅的情形。 避免图片规格不一致的错误发生的。 即使图片尺寸有误也会重新进行修正。,40,图片不规格,恐龙上下左右跑动的连续图片 按照精灵的前后关系排序:(先远后近),41,贴图坐标修正,原本面向左然后变成面向下。恐龙本身并没有移动。 程
15、序中先贴面向左的图案,再贴向下的图案,如果这两个贴图操作都使用相同左上角的贴图坐标。,42,贴图坐标修正,两次贴图,恐龙不过是做了个由左向下转的动作,但它的阴影所在位置竟然移动了,表明恐龙在这一个动作之间产生了移动。而这样的贴图方法会使得动画制作时产生误差。因此在这样的情况下,必须对贴图坐标进行修正,43,以阴影部分作为贴图的基准,在恐龙动作转而面向下时做贴图坐标的修正,使得第2次贴图时阴影部分能够与上一次重叠。(第2次贴图的左上角坐标与第1次相比稍微往右下方移动),这样的修正使得动画显示时视觉效果更好采用Y坐标排序,44,贴图坐标修正,贴图的方式:对于距离较远的物体先进行贴图操作,然后再进行
16、近距离物体的贴图操作,而一旦定出贴图的顺序之后就无法再改变了。 把两只恐龙做了编号。 先进行1号恐龙的贴图操作, 然后再进行2号恐龙的贴图操作。,45,贴图坐标修正的缺点,效果: 在前一秒的画面里,画面还很正常,可是到了后一秒的时候,画面却怪怪的。因为此时的2号恐龙远近跑到了1号恐龙的后面,但是贴图顺序还是先贴1号恐龙图案再贴2号恐龙图案,变成了后面的物体反而被遮掩住了前面的物体这种不协调的画面。,46,贴图坐标修正,47,贴图坐标修正,为了避免这种因为贴图顺序固定而产生的错误画面,必须在每一次窗口重新显示时动态重新决定画面上每一个物体的贴图顺序。 如何动态决定贴图顺序呢?,48,排序贴图,排
17、序如何运用在贴图中呢?,远的物体先贴图的原则,49,假设现在有10只要进行贴图的恐龙图案。先把它存在一个数组之中。 从2D平面的远近角度来看,Y轴坐标比较小(在窗口画面较上方)的是比较远的物体。以恐龙的Y轴坐标(在排序中称为键值)来对恐龙数组由小到大进行排序, 结果:最后会使得Y轴坐标小的恐龙排在数组的前面,而进行画面贴图时则由数组从小到大一个一个进行处理,遮掩便可实现“远的物体先贴图”的目的了。,50,气泡排序,要进行排序,首先必须决定所使用的排序法,这里所用的排序法为气泡排序 。,(1)程序代码简单。 (2)排序效果中等。 (3)属于稳定(stable)排序法,这个特性会 使得Y轴坐标相同
18、的物体,不必再去考虑它X 坐标上的排序。,51,气泡排序的步骤,从数组的最前面开始进行两两比较,当下一个元素值比前一个元素值大使则进行交换,使得大的元素往后移。 7, 5,2,1,3 5,7,2,1,3 5,2,7,1,3 5,2,1,7,3 5,2,1,3,7,52,这样不断进行比较,较大的元素会一直往后挪,最后数组中的最大元素便会排在数组的最后。 5,2,1,3,7 2,5,1,3,7 2,1,5,3,7 2,1,3,5,7,53,循环结束后,数组就变成了由小到大的排序顺序 2,1,3,5,7 1,2,3,5,7,54,多个恐龙贴图,按照精灵的前后关系排序 2D绘制可以直接采用Y坐标进行排
19、序 举例,以冒泡法进行排序,55,实现的效果,结果演示,56,背景动画的设计,57,背景动画的设计,背景动画的设计制作。背景动画的制作同样是利用连续贴图的原理。2D游戏中经常运用到的动态背景表现手法大致有: 单一背景滚动 循环背景动画 多层背景循环动画,58,单一背景滚动,利用一张相当大的背景图,当游戏进行的时候,随着画面任务的移动,背景的显示区域也跟着移动 方法:在每次背景画面更新时改变要显示到窗口上的区域就可以了。,59,单一背景滚动,60,单一背景滚动,在上面的这张背景图里,由左上到右下画了3个方框,代表要显示在窗口上的背景区域,程序只要按照左上到右下的顺序在窗口上连续显示这3个方框区域
20、,就会产生背景由左上往右下滚动的效果,61,LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) int nStep = 5; switch (message) case WM_KEYDOWN: switch (wParam) case VK_UP:【】 y -= nStep;if(y 660)y = 660;break;,62,case VK_LEFT: 【】 x -= nStep;if(x 910) x = 910;break; break; case WM_DESTROY: Dele
21、teDC(mdc); DeleteObject(map); ReleaseDC(hWnd,hdc); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); return 0;,63,效果演示: 以键盘,控制背景滚动,64,循环背景动画,65,原理,循环背景时不断进行背景图的裁切与拼接,然后显示在窗口上的一种背景画面循环滚动的效果 也称作 “卷轴”,66,如何利用同一张跟窗口大小相同的背景天空图案来产生背景由左向右循环滚动的动画效果的,67,从左向右滚动后,TickCoun
22、t=31205,TickCount=31705,68,由图中可以看出,窗口中背景图部分跟前一次相比已经往右移动了。在制作循环背景的过程中,是把超出窗口的部分贴到左边突出的窗口区域中,以便重新组合成一张刚好等于窗口大小的新背景图。,69,贴图步骤一,裁取背景图中将要在下一次绘制时超出画面的部分,贴到内存DC中,70,贴图步骤二,将剩余的部分按照移动方向后的位置贴到内存DC,71,贴图步骤三,将内存DC BitBlt到窗口中(右图),72,注意,绘制循环背景的背景图必须是上下无缝拼接和左右无缝拼接。 这样在绘制的时候才不会造成背景图的接缝不能对齐,73,循环背景示例,效果演示: 思考:怎样改成斜方
23、向移动?,74,多背景循环动画,75,目的和原理,制造一种透视的假相,使游戏画面更加逼真,需要近处的背景移动迅速而远处的物体移动缓慢。 多背景循环动画实质上也是多幅循环背景动画的叠加,在以贴图方式绘制多背景循环动画的时候,需要决定不同背景贴图的先后顺序以及滚动的速度,76,效果,77,实现,贴图顺序: 天空草地山峦房屋恐龙 滚动速度: 天空山峦草地=房屋,78,多背景循环动画例子,效果演示 x0 += 5; /设置天空背景切割宽度,运动速度 x1 += 8;/设置山峦背景切割宽度,运动速度 x2 += 12; /设置草地及房屋切割宽度,运动速度 改变背景滚动的速度,79,void MyPain
24、t(HDC hdc) /贴天空图 SelectObject(bufdc,bg0); BitBlt(mdc,0,0,x0,300,bufdc,640-x0,0,SRCCOPY); BitBlt(mdc,x0,0,640-x0,300,bufdc,0,0,SRCCOPY); /贴草地图 BitBlt(mdc,0,300,x2,180,bufdc,640-x2,300,SRCCOPY); BitBlt(mdc,x2,300,640-x2,180,bufdc,0,300,SRCCOPY);,80,/贴山峦并透明 SelectObject(bufdc,bg1); BitBlt(mdc,0,0,x1,300,bufdc,640-x1,300,SRCAND); BitBlt(mdc,x1,0,640-x1,300,bufdc,0,300,SRCAND); BitBlt(mdc,0,0,x1,300,bufdc,640-x1,0,SRCPAINT); BitBlt(mdc,x1,0,640-x1,300,bufdc,0,0,SRCPAINT);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西方政治制度对移民公民化的影响试题及答案
- 叉车全部考试题库及答案
- 2025年环境政策与地方实施考试题及答案
- 软件设计师考试团队项目展示与试题及答案
- 兔玩网java面试题及答案
- java程序员进bat面试题及答案
- 动画驾驶考试题及答案
- 人大哲学面试题及答案
- 华泰证券java面试题及答案
- 自我反思的抒情作文5篇
- 职业道德与法治 第13课《学会依法维权》第一框课件《依法理性维权》
- 邻近铁路营业线施工安全监测技术规程 (TB 10314-2021)
- 妇科常见病科普知识讲座
- 城市土壤主要类型及特点
- 宾馆财务安全管理制度
- 《康复护理学基础》期末考试复习题库(含答案)
- 宝钢武钢并购重组案例研究
- 胰岛素的种类及应用(共26张PPT)
- 眩晕诊疗方案总结优化
- 转让鱼塘股份合同范本
- 贵州省毕节地区金沙县2022-2023学年小学六年级数学毕业检测指导卷含答案
评论
0/150
提交评论