【Visual C++】游戏开发笔记二十三 游戏基础物理建模(.pdf
《【Visual C++】游戏开发笔记二十三 游戏基础物理建模(.pdf》由会员分享,可在线阅读,更多相关《【Visual C++】游戏开发笔记二十三 游戏基础物理建模(.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【C+游戏编程】游戏开发梦想的集散地毛星云(浅墨)的专栏C+游戏编程】游戏开发梦想的集散地毛星云(浅墨)的专栏 愿尽以绵薄之力,薪火相传游戏开发的信仰与梦想,复兴国产单机游戏。愿尽以绵薄之力,薪火相传游戏开发的信仰与梦想,复兴国产单机游戏。【Visual C+】游戏开发笔记二十三 游戏基础物理建模(五)粒子系统模拟(二)Visual C+】游戏开发笔记二十三 游戏基础物理建模(五)粒子系统模拟(二)分类:【Visual C+】游戏开发【Visual C+】2012-05-28 04:15 25333人阅读 评论(56)收藏 举报 游戏c+nullimagetimerstruct 本系列文章由z
2、hmxy555(毛星云)编写,转载请注明出处。http:/ 邮箱: 期待着与志同道合的朋友们相互交流本节在笔记二十二的基础上继续讲解了例子系统的模拟与实际运用,着重讲解和分析了基于例子系统的一个“星光绽放demo”,最后盘点了史诗级游戏作品暗黑破坏神3上市首周所创下的传奇。一基础知识讲解 1.概念与思路 基本的粒子系统概念在笔记二十二中已经讲过了,还不太清楚的朋友请移步前篇:【Visual C+】游戏开发笔记二十二 游戏基础物理建模(四)粒子系统模拟(一)本节讲解的星光绽放demo相当于是一个模拟爆炸(或者说是烟花)特效的demo,浅墨认为这个特效拿出来讲解很多必要性,它可以为很多问题带来的思
3、路的火花。这个demo之中,绽放(爆炸)点为在窗口中由随机数产生的一个位置,绽放(爆炸)后,会出现很多星光以不同的速度向四方飞散而去,当粒子飞出窗口后或者超出时间后便会消失。每一次爆炸所出现的粒子全部消失后,便会重新出现绽放(爆炸)的画面,以产生不断绽放星光的效果。2.“星光”粒子的构造首先我们来看一下这次如何用结构体来构造出星光粒子:struct flystarint x;/星光所在的x坐标int y;/星光所在的y坐标int vx;/星光x方向的速度int vy;/星光y方向的速度int lasted;/星光存在的时间BOOL exist;/星光是否存在flystar50;6个成员分别为,
4、粒子坐标两个值,粒子方向两个值,持续时间lasted,和粒子是否存在的标识exist。13.核心代码讲解最重要的当然是我们的MyPaint()绘图函数:/全局变量声明HINSTANCE hInst;HBITMAP bg,star,mask;/用于贴图的三个HBITMAP变量HDChdc,mdc,bufdc;HWNDhWnd;RECTrect;int i,count;/定义count用于计数/*自定义绘图函数*/1.窗口贴图/2.实现星光绽放的效果void MyPaint(HDC hdc)/创建粒子if(count=0)/随机设置爆炸点intx=rand()%rect.right;inty=ra
5、nd()%rect.bottom;for(i=0;i50;i+)/产生星光粒子flystari.x=x;flystari.y=y;flystari.lasted=0;/设定该粒子存在的时间为零if(i%2=0)/按粒子编号i来决定粒子在哪个象限运动,且x,y方向的移动速度随机为115之间的一个值,由1+rand()%15来完成。flystari.vx=-(1+rand()%15);flystari.vy=-(1+rand()%15);if(i%2=1)flystari.vx=1+rand()%15;flystari.vy=1+rand()%15;if(i%4=2)flystari.vx=-(1
6、+rand()%15);flystari.vy=1+rand()%15;if(i%4=3)flystari.vx=1+rand()%15;flystari.vy=-(1+rand()%15);flystari.exist=true;/设定粒子存在count=50;/50个粒子由for循环设置完成后,我们将粒子数量设为50,代表目前有50颗星光/先在内存dc中贴上背景图片SelectObject(bufdc,bg);BitBlt(mdc,0,0,rect.right,rect.bottom,bufdc,0,0,SRCCOPY);for(i=0;i50;i+)if(flystari.exist)/
7、判断粒子是否还存在,若存在,则根据其坐标(flystari.x,flystari.y)进行贴图操作SelectObject(bufdc,mask);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCAND);SelectObject(bufdc,star);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCPAINT);/计算下一次贴图的坐标flystari.x+=flystari.vx;flystari.y+=flystari.vy;/在每进行一次贴图后,将粒子的存在时间累加1.fly
8、stari.lasted+;/进行条件判断,若某粒子跑出窗口区域一定的范围,则将该粒子设为不存在,且粒子数随之递减if(flystari.xrect.right|flystari.yrect.bottom|flystari.lasted50)flystari.exist=false;/删除星光粒子 2count-;/递减星光总数/将mdc中的全部内容贴到hdc中BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);相关的书写思路在代码注释中浅墨已经写得比较清晰了。这段代码的书写整体思路即:第一步,判断粒子是否创建,若星光数量count不为0,则直接跳到第四步进行相关贴
9、图操作。否则需按每步顺序完成粒子的初始化。第二步,随机设置绽放点。第三步,创建各个粒子(为结构体各属性赋值)。第四步,在内存dc上贴上背景图片。第五步,对各个粒子进行贴图操作并第六步,对某些值,如count,exist进行特殊的处理第七步,将mdc(内存dc)中的内容贴到hdc中,完成最后在屏幕上的显示。二、详细注释的源代码欣赏OK,讲解完成,现在我们就贴出详细注释的源代码:#include stdafx.h#include/全局变量声明HINSTANCE hInst;HBITMAP bg,star,mask;/用于贴图的三个HBITMAP变量HDChdc,mdc,bufdc;HWNDhWnd
10、;RECTrect;int i,count;/定义count用于计数struct flystarint x;/星光所在的x坐标int y;/星光所在的y坐标int vx;/星光x方向的速度int vy;/星光y方向的速度int lasted;/星光存在的时间BOOL exist;/星光是否存在flystar50;3/全局函数声明?ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE,int);LRESULT CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);voidMyPaint(
11、HDC hdc);/*WinMain函数,程序入口点函数*int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)MSG msg;MyRegisterClass(hInstance);/初始化if(!InitInstance(hInstance,nCmdShow)return FALSE;/消息循环 while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return
12、msg.wParam;/*设计一个窗口类,类似填空题,使用窗口结构体*ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSize=sizeof(WNDCLASSEX);wcex.style=CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=(WNDPROC)WndProc;wcex.cbClsExtra=0;wcex.cbWndExtra=0;wcex.hInstance=hInstance;wcex.hIcon=NULL;wcex.hCursor=NULL;wcex.hCursor=Lo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual C+ 【Visual C+】游戏开发笔记二十三 游戏基础物理建模 Visual 游戏 开发 笔记 十三 基础 物理 建模
限制150内