ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:263.60KB ,
资源ID:8861780      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8861780.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Visual C++游戏开发笔记之十一 基础动画显示四 排序贴图.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Visual C++游戏开发笔记之十一 基础动画显示四 排序贴图.docx

1、Visual C+游戏开发笔记之十一 基础动画显示四 排序贴图【Visual C+】游戏开发笔记之十一 基础动画显示(四) 排序贴图本系列文章由zhmxy555编写,转载请注明出处。作者:毛星云邮箱:happylifemxy欢迎邮件交流编程心得“排序贴图”是源自于物体远近呈现的一种贴图概念。回忆我们之前笔记的贴图思想,先进行距离比较远的物体的贴图操作,然后再进行近距离物体的贴图操作,一旦定出贴图的顺序之后就无法再改变了。然而这样的作法在画面上物体会彼此遮掩的情况下就会不适用。也许会出现后面的物体反而遮住了前面的物体的这种不协调的画面。为了避免这种因为贴图顺序而固定而产生的错误画面,必须在每一次

2、窗口重新显示时动态地重新决定画面上每一个物体的贴图顺序。那么,如何动态决定贴图顺序呢?我们可以采用排序的方式。为了演示排序如何运用在贴图中,我们举一个例子。假设现在有10只要进行贴图的小牛图案,先把它存在一个数组之中,从2D平面的远近角度来看,Y轴坐标比较小的是比较远的物体。如果我们以小牛的Y轴坐标(要排序的值被我们称作键值)来对小牛数组由小到大进行排序,最后会使得Y轴坐标小的小牛排在数组的前面,而进行画面贴图时则由数组由小到大一个个进行处理,这样便可实现“远的物体先贴图“的目的了。这里我们使用气泡排序(BubbleSort)作为我们的排序法,因为此方法有程序代码简单,排序效率中等,属于稳定(

3、stable)排序法的特点。这里的稳定排序法的特性,会使得Y轴坐标相同的物体,不必再去考虑它X坐标上的排序。下面我们贴出以C/C+写出的气泡排序法的代码,对”pop “数组的各数据成员的Y值为键值来排序,输出的参数为”n“表示要排序的数组大小:cppview plaincopyprint?1. voidBubSort(intn)2. 3. inti,j;4. boolf;5. poptmp;6. 7. for(i=0;in-1;i+)8. 9. f=false;10. for(j=0;jn-i-1;j+)11. 12. if(popj+1.ypopj.y)13. /进行数组元素的交换14. t

4、mp=popj+1;15. popj+1=popj;16. popj=tmp;17. f=true;18. 19. 20. if(!f)/无交换操作则结束循环21. break;22. 23. 各种排序法为C/C+中比较核心的知识点,还不太熟悉的朋友,可以参看各种C+,数据结构的教程进行深入学习。在这里我就不多做介绍了。接下来,我们来利用一个范例来演示气泡排序法在画面上贴图的运用,让动画能呈现出接近真实的远近层次效果。这个范例比较有趣,会产生多只恐龙随机跑动,每次进行画面贴图前先完成排序操作,并对恐龙跑动进行贴图坐标的修正,呈现出比较顺畅真实的动画来。废话这里就不多说了,直接上已经详细注释的代

5、码(这回的代码量就有些大了,不过我专门注释得更详细了些,其实它比之前的代码还更好懂):cppview plaincopyprint?1. #includestdafx.h2. #include3. 4. /定义一个结构体5. structdragon/定义dragon结构,代表画面上的恐龙,其结构成员x和y为贴图坐标,dir为目前恐龙的移动方向6. 7. intx,y;8. intdir;9. ;10. 11. /定义常数12. constintdraNum=12;/定义常数draNum,代表程序在画面上要出现的恐龙数目,在此设定为12个13. /全局变量定义14. HINSTANCEhIns

6、t;15. HBITMAPdraPic4,bg;/draPic4储存恐龙上下左右移动的连续图案,bg为存储背景图16. HDChdc,mdc,bufdc;17. HWNDhWnd;18. DWORDtPre,tNow;19. intpicNum;20. dragondradraNum;/按照draNum的值建立数组dra,产生画面上出现的恐龙。21. 22. 23. /全局函数声明24. ATOMMyRegisterClass(HINSTANCEhInstance);25. BOOLInitInstance(HINSTANCE,int);26. LRESULTCALLBACKWndProc(H

7、WND,UINT,WPARAM,LPARAM);27. voidMyPaint(HDChdc);28. 29. /*WinMain函数,程序入口点函数*30. intAPIENTRYWinMain(HINSTANCEhInstance,31. HINSTANCEhPrevInstance,32. LPSTRlpCmdLine,33. intnCmdShow)34. 35. MSGmsg;36. 37. MyRegisterClass(hInstance);38. 39. /初始化40. if(!InitInstance(hInstance,nCmdShow)41. 42. returnFALS

8、E;43. 44. GetMessage(&msg,NULL,NULL,NULL);/初始化msg45. /消息循环46. while(msg.message!=WM_QUIT)47. 48. if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)49. 50. TranslateMessage(&msg);51. DispatchMessage(&msg);52. 53. else54. 55. tNow=GetTickCount();56. if(tNow-tPre=100)57. MyPaint(hdc);58. 59. 60. 61. returnmsg.wPa

9、ram;62. 63. 64. /*设计一个窗口类,类似填空题,使用窗口结构体*65. ATOMMyRegisterClass(HINSTANCEhInstance)66. 67. WNDCLASSEXwcex;68. 69. wcex.cbSize=sizeof(WNDCLASSEX);70. wcex.style=CS_HREDRAW|CS_VREDRAW;71. wcex.lpfnWndProc=(WNDPROC)WndProc;72. wcex.cbClsExtra=0;73. wcex.cbWndExtra=0;74. wcex.hInstance=hInstance;75. wce

10、x.hIcon=NULL;76. wcex.hCursor=NULL;77. wcex.hCursor=LoadCursor(NULL,IDC_ARROW);78. wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);79. wcex.lpszMenuName=NULL;80. wcex.lpszClassName=canvas;81. wcex.hIconSm=NULL;82. 83. returnRegisterClassEx(&wcex);84. 85. 86. /*初始化函数*87. /加载位图并设定各初始值88. BOOLInitInstance(

11、HINSTANCEhInstance,intnCmdShow)89. 90. HBITMAPbmp;91. hInst=hInstance;92. inti;93. 94. hWnd=CreateWindow(canvas,绘图窗口,WS_OVERLAPPEDWINDOW,95. CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);96. 97. if(!hWnd)98. 99. returnFALSE;100. 101. 102. MoveWindow(hWnd,10,10,640,480,true);103. ShowWind

12、ow(hWnd,nCmdShow);104. UpdateWindow(hWnd);105. 106. hdc=GetDC(hWnd);107. mdc=CreateCompatibleDC(hdc);108. bufdc=CreateCompatibleDC(hdc);109. 110. bmp=CreateCompatibleBitmap(hdc,640,480);/建立一个空位图并放入mdc中111. SelectObject(mdc,bmp);112. 113. 114. /加载各张恐龙跑动图及背景图,这里以0,1,2,3来代表恐龙的上,下,左,右移动115. draPic0=(HBI

13、TMAP)LoadImage(NULL,dra0.bmp,IMAGE_BITMAP,528,188,LR_LOADFROMFILE);116. draPic1=(HBITMAP)LoadImage(NULL,dra1.bmp,IMAGE_BITMAP,544,164,LR_LOADFROMFILE);117. draPic2=(HBITMAP)LoadImage(NULL,dra2.bmp,IMAGE_BITMAP,760,198,LR_LOADFROMFILE);118. draPic3=(HBITMAP)LoadImage(NULL,dra3.bmp,IMAGE_BITMAP,760,19

14、8,LR_LOADFROMFILE);119. bg=(HBITMAP)LoadImage(NULL,bg.bmp,IMAGE_BITMAP,640,480,LR_LOADFROMFILE);120. 121. 122. /设定所有恐龙初始的贴图坐标都为(200,200),初始的移动方向都为向左。123. for(i=0;idraNum;i+)124. 125. drai.dir=3;/起始方向126. drai.x=200;/贴图的起始X坐标127. drai.y=200;/贴图的起始Y坐标128. 129. 130. MyPaint(hdc);131. 132. returnTRUE;13

15、3. 134. 135. /气泡排序136. voidBubSort(intn)137. 138. inti,j;139. boolf;140. dragontmp;141. 142. for(i=0;in-1;i+)143. 144. f=false;145. for(j=0;jn-i-1;j+)146. 147. if(draj+1.ydraj.y)148. 149. tmp=draj+1;150. draj+1=draj;151. draj=tmp;152. f=true;153. 154. 155. if(!f)156. break;157. 158. 159. 160. /*自定义绘

16、图函数*161. /1.对窗口中跑动的恐龙进行排序贴图162. /2.恐龙贴图坐标修正163. voidMyPaint(HDChdc)164. 165. intw,h,i;166. 167. if(picNum=8)168. picNum=0;169. 170. /在mdc中先贴上背景图171. SelectObject(bufdc,bg);172. BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);173. 174. BubSort(draNum);/贴上恐龙图之前调用BubSort()函数进行排序175. 176. 177. /下面这个for循环,按照目前

17、恐龙的移动方向drai.dir,选取对应的位图到bufdc中,并设定截切的大小。每一张要在窗口上出现的恐龙图案依次先在mdc上进行透明贴图的操作。178. for(i=0;idraNum;i+)179. 180. SelectObject(bufdc,draPicdrai.dir);181. switch(drai.dir)182. 183. case0:184. w=66;185. h=94;186. break;187. case1:188. w=68;189. h=82;190. break;191. case2:192. w=95;193. h=99;194. break;195. c

18、ase3:196. w=95;197. h=99;198. break;199. 200. BitBlt(mdc,drai.x,drai.y,w,h,bufdc,picNum*w,h,SRCAND);201. BitBlt(mdc,drai.x,drai.y,w,h,bufdc,picNum*w,0,SRCPAINT);202. 203. 204. /将最后画面显示在窗口中205. BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);206. 207. tPre=GetTickCount();/记录此次绘图时间208. picNum+;209. 210. 211.

19、/下面这个for循环,决定每一只恐龙下一次的移动方向及贴图坐标212. for(i=0;idraNum;i+)213. 214. switch(rand()%4)/随机数除以4的余数来决定下次移动方向,余数0,1,2,3分别代表上,下,左,右215. 216. /case0里面的代码,按照目前的移动方向来修正因为各个方向图案尺寸不一致而产生的贴图坐标误差,加入恐龙每次移动的单位量(上,下,左,右每次20个单位)而得到下次新的贴图坐标217. case0:/上218. switch(drai.dir)219. 220. case0:221. drai.y-=20;222. break;223.

20、case1:224. drai.x+=2;225. drai.y-=31;226. break;227. case2:228. drai.x+=14;229. drai.y-=20;230. break;231. case3:232. drai.x+=14;233. drai.y-=20;234. break;235. 236. /在计算出新的贴图坐标之后,还需判断此新的坐标会不会使得恐龙贴图超出窗口边界,若超出,则将该方向上的坐标设定为刚好等于临界值237. if(drai.y0)238. drai.y=0;239. drai.dir=0;240. break;241. /其他方向按照和上面相同的方法计算242. case1:/下243. switch(drai.dir)244. 245. case0:246. drai.x-=2;247. drai.y+=31;248. break;249.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1