




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本节内容主要讲解了在GDI中粒子的运用,为后续DirectX中粒子系统的讲解提供一个初步的认识。一基础知识讲解1.基本概念粒子是一种微小的物体,在数学上通常用点来表示其模型。我们可以把粒子想象成颗粒状的物体,如雪花,雨滴,沙尘,烟雾等特殊的事物。又比如游戏中的怪物,晶体,材料,在需要的时候,也可以通过粒子来实现。俗话说“不积跬步,无以至千里,不积小流,何以成江海”,单个的粒子是比较平凡的存在,但是如果将大量的粒子聚到一起,就可以实现很多神奇的效果了。在C/C+中想要定义一个粒子是非常容易的。基本功扎实的朋友们肯定马上就可以想到,“结构体“是用来定义粒子类型的绝佳武器。原则上用“类”也可以实现,但是在这里采用“结构体”将更加合适。2.实现方法如下面的这个结构体snow便是用来定义“雪花”粒子的:1. structsnow2. 3. intx;/雪花的X坐标4. inty;/雪花的Y坐标5. BOOLexist;/雪花是否存在6. ;可以看出,上述结构体中有3个成员,分别是代表X坐标的x,代表Y坐标的y,与表示雪花是否存在的布尔型变量exist。定义完粒子的结构体后,便可以实例化一个粒子数组了。如果我们需要一个大小为50的snowfly数组,则可用一下两种方法来进行:在结构体的尾部加上我们需要实例化的对象1. structsnow2. 3. intx;/雪花的X坐标4. inty;/雪花的Y坐标5. BOOLexist;/雪花是否存在6. snowfly50;单独定义1. snowsnowfly50;定义完之后,就可以在这个粒子数组的基础上,用代码进行相关功能的实现了。以上就是粒子系统概念的一个简明扼要的讲解。而下面我们依旧是通过一个实例来巩固本节所学。二、详细注释的源代码欣赏在贴出全部的源代码之前,我们先把最关键的部分提出来先剖析一下,下面是本节实例的核心代码:1. /全局变量声明2. HINSTANCEhInst;3. HBITMAPbg,snow,mask;/用于贴图的三个HBITMAP变量4. HDChdc,mdc,bufdc;5. HWNDhWnd;6. RECTrect;7. inti,count;/定义count用于计数8. 9. /*自定义绘图函数*10. /1.窗口贴图11. /2.实现雪花纷飞的效果12. voidMyPaint(HDChdc)13. 14. 15. /创建粒子16. if(count50)/当粒子数小于50时,产生新的粒子,设定每个粒子的属性值17. 18. dropcount.x=rand()%rect.right;/将粒子的X坐标设为窗口中水平方向上的任意位置19. dropcount.y=0;/将每个粒子的Y坐标都设为0,即从窗口上沿往下落20. dropcount.exist=true;/设定粒子存在21. count+;/每产生一个粒子后进行累加计数22. 23. 24. 25. /贴上背景图到mdc中26. SelectObject(bufdc,bg);27. BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);28. 29. /首先判断粒子是否存在,若存在,进行透明贴图操作30. for(i=0;irect.bottom)47. 48. dropi.x=rand()%rect.right;49. dropi.y=0;50. 51. 52. 53. 54. 55. 56. /将mdc中的全部内容贴到hdc中57. BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);58. 59. MyPaint函数的书写思路是,先初始化每个粒子,这里是共50个粒子。然后贴上背景图到mdc中,再用循环将各个粒子也贴到mdc中,循环完成之后,再统一将mdc中的内容直接贴到hdc中。这样做的优点是比较直观,提高了贴图的效率。下面就贴出全部详细注释的源代码,供大家学习,需要在自己机器上运行并学习提高的朋友,请点击文章末尾处贴出的地址进行下载。源代码依旧是分为VC6.0和VS2010两个版本。这里贴出的是VC6.0版的:1. #includestdafx.h2. #include3. 4. /全局变量声明5. HINSTANCEhInst;6. HBITMAPbg,snow,mask;/用于贴图的三个HBITMAP变量7. HDChdc,mdc,bufdc;8. HWNDhWnd;9. RECTrect;10. inti,count;/定义count用于计数11. 12. 13. 14. 15. structsnow16. 17. intx;18. inty;19. BOOLexist;20. drop50;21. 22. 23. /全局函数声明24. ATOMMyRegisterClass(HINSTANCEhInstance);25. BOOLInitInstance(HINSTANCE,int);26. LRESULTCALLBACKWndProc(HWND,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. returnFALSE;43. 44. 45. 46. /消息循环47. while(GetMessage(&msg,NULL,0,0)48. 49. TranslateMessage(&msg);50. DispatchMessage(&msg);51. 52. 53. returnmsg.wParam;54. 55. 56. /*设计一个窗口类,类似填空题,使用窗口结构体*57. ATOMMyRegisterClass(HINSTANCEhInstance)58. 59. WNDCLASSEXwcex;60. 61. wcex.cbSize=sizeof(WNDCLASSEX);62. wcex.style=CS_HREDRAW|CS_VREDRAW;63. wcex.lpfnWndProc=(WNDPROC)WndProc;64. wcex.cbClsExtra=0;65. wcex.cbWndExtra=0;66. wcex.hInstance=hInstance;67. wcex.hIcon=NULL;68. wcex.hCursor=NULL;69. wcex.hCursor=LoadCursor(NULL,IDC_ARROW);70. wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);71. wcex.lpszMenuName=NULL;72. wcex.lpszClassName=maple;73. wcex.hIconSm=NULL;74. 75. returnRegisterClassEx(&wcex);76. 77. 78. /*初始化函数*79. /1.加载位图资源80. /2.取得内部窗口区域信息81. BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)82. 83. HBITMAPbmp;84. hInst=hInstance;85. 86. hWnd=CreateWindow(maple,浅墨的绘图窗口,WS_OVERLAPPEDWINDOW,87. CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);88. 89. if(!hWnd)90. 91. returnFALSE;92. 93. 94. MoveWindow(hWnd,10,10,600,450,true);95. ShowWindow(hWnd,nCmdShow);96. UpdateWindow(hWnd);97. 98. hdc=GetDC(hWnd);99. mdc=CreateCompatibleDC(hdc);100. 101. bufdc=CreateCompatibleDC(hdc);102. bmp=CreateCompatibleBitmap(hdc,640,480);103. 104. SelectObject(mdc,bmp);105. 106. 107. 108. 109. bg=(HBITMAP)LoadImage(NULL,bg.bmp,IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);110. snow=(HBITMAP)LoadImage(NULL,snow.bmp,IMAGE_BITMAP,20,20,LR_LOADFROMFILE);111. mask=(HBITMAP)LoadImage(NULL,mask.bmp,IMAGE_BITMAP,20,20,LR_LOADFROMFILE);112. GetClientRect(hWnd,&rect);113. 114. 115. 116. SetTimer(hWnd,1,0,NULL);117. 118. MyPaint(hdc);119. 120. returnTRUE;121. 122. 123. /*自定义绘图函数*124. /1.窗口贴图125. /2.实现雪花纷飞的效果126. voidMyPaint(HDChdc)127. 128. 129. /创建粒子130. if(count50)/当粒子数小于50时,产生新的粒子,设定每个粒子的属性值131. 132. dropcount.x=rand()%rect.right;/将粒子的X坐标设为窗口中水平方向上的任意位置133. dropcount.y=0;/将每个粒子的Y坐标都设为0,即从窗口上沿往下落134. dropcount.exist=true;/设定粒子存在135. count+;/每产生一个粒子后进行累加计数136. 137. 138. 139. /贴上背景图到mdc中140. SelectObject(bufdc,bg);141. BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);142. 143. /首先判断粒子是否存在,若存在,进行透明贴图操作144. for(i=0;irect.bottom)161. 162. dropi.x=rand()%rect.right;163. dropi.y=0;164. 165. 166. 167. 168. 169. 170. /将mdc中的全部内容贴到hdc中171. BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);172. 173. 174. 175. 176. 177. /*消息处理函数*178. LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)179. 180. switch(message)181. 182. caseWM_TIMER:/时间消息183. MyPaint(hdc);/在消息循环中加入处理WM_TIMER消息,当接收到此消息时便调用MyPaint()函数进行窗口绘图184. break;185. caseWM_KEYDOWN:/按键消息186. if(wParam=VK_ESCAPE)/按下【Esc】键187. PostQuitMessage(0);188. break;189. caseWM_DESTROY:/窗口结束消息190. DeleteDC(mdc);191. DeleteDC(bufdc);192. DeleteObject(bg);193. DeleteObject(snow);194. DeleteObject(mask);195. KillTimer(hWnd,1);/窗口结束时,删除所建立的定时器196. ReleaseDC(hWnd,hdc);197. PostQuitMessage(0);198. break;199. default:/其他消息200. returnDefWindowProc(hWnd,message,wParam,lParam);201. 202. return0;203. 下面是运行后的截图效果:可以看到窗口中有漫天飞舞的雪花,我们可以调节数组大小,及几处设定的数值的大小,来使雪花来得更猛烈些。这张背景
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业互联网平台数据清洗算法在智能仓储物流中的实践报告
- 江苏省扬州市宝应县2025-2026学年高三上学期期初检测语文试题(含答案)
- 公司合同法律风险防范管理制度
- 2025年湖南省永州市第十六中学八年级中考二模生物试题(含答案)
- 2024-2025学年湖南省永州市冷水滩区九年级(上)期末数学试卷(含答案)
- 信息技术应用能力测评题库
- 卫生院绩效考核措施
- 中国传统节日中秋节主题班会课件
- 巡视巡查课件
- 巡察干部培训课件
- AQ 1083-2011 煤矿建设安全规范 (正式版)
- FZ∕T 54007-2019 锦纶6弹力丝行业标准
- 2024年江苏省高中学业水平合格性考试数学试卷试题(答案详解1)
- DZ∕T 0148-2014 水文水井地质钻探规程(正式版)
- 膝痹病的中医治疗方案
- Know Before You Go:趣谈“一带一路”国家智慧树知到期末考试答案2024年
- 养老金融论文
- 无人机维修技术行业报告
- NPI工程师培训资料
- 2024年射频同轴电缆组件行业技术趋势分析
- 个人工资表表格
评论
0/150
提交评论