首页 Visual C++ 游戏开发编程愤怒的小鸟

Visual C++ 游戏开发编程愤怒的小鸟

举报
开通vip

Visual C++ 游戏开发编程愤怒的小鸟我们可以毫不夸张的说,在当今的任意一款成功的3D游戏引擎中,物理建模都是非常核心的部分。比如当今最高水平的、大名鼎鼎的引擎UnrealEngine3(虚幻3),比如国产第一单机游戏《仙剑奇侠传》四代与五代采用的引擎Renderware,都有着健壮而强大的代码负责着引擎内部完善的物理建模。  为了设计出立足实际,联系现实的游戏,为了我们研发出能有与现实物理现象大体相同的游戏效果,以致给玩家一个身临其境的游戏体验,我们必须进行合适的物理建模。  其实吧,在任何一款成功的游戏中,有关物理的代码都占着很大的比重,所以在开发...

Visual C++ 游戏开发编程愤怒的小鸟
我们可以毫不夸张的说,在当今的任意一款成功的3D游戏引擎中,物理建模都是非常核心的部分。比如当今最高水平的、大名鼎鼎的引擎UnrealEngine3(虚幻3),比如国产第一单机游戏《仙剑奇侠传》四代与五代采用的引擎Renderware,都有着健壮而强大的代码负责着引擎内部完善的物理建模。  为了 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 出立足实际,联系现实的游戏,为了我们研发出能有与现实物理现象大体相同的游戏效果,以致给玩家一个身临其境的游戏体验,我们必须进行合适的物理建模。  其实吧,在任何一款成功的游戏中,有关物理的代码都占着很大的比重,所以在开发游戏过程中,进行优秀的物理建模是非常必要的。  在之后会推出的几节关于游戏物理建模的文章里,我们会介绍一些最基本的物理模型,这些内容暂时不包含微积分的知识,不会超出高中物理的范围,非常的通俗易懂。  但恰恰通过这些看似简单的模型,我们可以毫不费力地亲手编写出属于自己的2D或3D游戏。  至于你信不信,反正浅墨是信了,呵呵。  关于本节的知识点,是匀速与加速运动,他们在游戏领域里运用可谓非常的广泛。  譬如Dota里每个英雄都是以一个固定的速度进行匀速运动的,比如灵魂守卫TerroBlade的初始移动速度就为310,装备鞋子之后就会更快(当然我们这里没考虑英雄被技能和物品减速时的速度),如果是吃了加速神符或者狼人变身之后就是以522的极速进行匀速运动了。又比如《极品飞车》系列涉及到的跑车匀速,变速行驶的问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 。又如愤怒的小鸟,我们可以把里面每只小鸟的运动轨迹看做斜抛运动,将其速度按X与Y轴进行分解处理,在鸟飞翔的途中轨迹的运算,运用的就是本节的知识。(重力加速度会在之后的文章里讲解)  本节依旧先是基础知识的讲解,再附上一个demo供大家巩固提高。  一、基础知识讲解  1.匀速运动  通常情况下,一个会移动的物体都是具有“速度”的,这个速度我们可以进行正交分解,看做各个方向上“速度分量”的合成。  这里我们设一个物体的移动速度为V,x方向的速度分量为Vx,y方向上的速度分量为Vy,那么我们可以用下图来 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示:  匀速运动实际上就是Vx与Vy保持恒定不变。  在设计2D平面上物体的匀速运动时,每次画面更新时,利用物体速度分量Vx与Vy的值来计算下次物体出现的位置,产生物体移动的效果,这样的原理实现方式我们可以表示为:  下次X轴坐标=在X轴上的速度分量+当前X轴坐标  下次Y轴坐标=在Y轴上的速度分量+当前Y轴坐标  2.加速运动  加速运动就是具有加速度的运动,它的速度会随着时间而改变。  公式我们可以表示如下:  V=Vo+at  这是高中物理运动学里最基本的公式了~其中,V为当前速度,V0为初速度,a为加速度,t为物体从速度为V0时记起的时间  那么同样将此速度分解,我们得到:  Vx=Vxo+axt  Vy=Vyo+ayt  我们设时间间隔t=1  则我们可以推算出加入加速度之后,物体下一刻所在的位置:  Sx=Sxo+Vx*1  Sy=Syo+Vy*1  将这两个公式运用到我们的代码里面就可以实现加速运动的模拟了。  这些知识都是非常基础的,实现方式都非常的简单,但是还有颇多细节,希望好学的你能多思考,多挖掘。  二、在一个完整的demo中将知识融会贯通  了解了基本运动学的原理之后,下面我们就来一起看下这节笔记里面的demo,在实例中将本节知识融会贯通。  这节的demo是一个匀速运动,碰到窗口边缘时就进行反弹的“愤怒的小鸟”,非常的可爱。  浅墨感觉学完这节后大家就可以自己实现win7里的那个”多彩气泡“的屏幕保护程序,有兴趣的朋友可以试着写写看,调用一些WindowsAPI函数就来了。  好了,我们依旧贴出详细注释的源代码~[cpp]viewplaincopyprint?  #include"stdafx.h"  #include  //全局变量声明  HINSTANCEhInst;  HBITMAPbg,bird;  HDChdc,mdc,bufdc;  HWNDhWnd;  DWORDtPre,tNow,tCheck;  RECTrect;//定义一个RECT结构体,用于储存内部窗口区域的坐标  intx=50,y=50,vx=15,vy=15;//x与y是小鸟在窗口中的贴图坐标,vx与vy为小鸟在x与y轴运动的速度分量  //全局函数声明  ATOMMyRegisterClass(HINSTANCEhInstance);  BOOLInitInstance(HINSTANCE,int);  LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);  voidMyPaint(HDChdc);  //****WinMain函数,程序入口点函数**************************************  intAPIENTRYWinMain(HINSTANCEhInstance,  HINSTANCEhPrevInstance,  LPSTRlpCmdLine,  intnCmdShow)  {  MSGmsg;  MyRegisterClass(hInstance);  //初始化  if(!InitInstance(hInstance,nCmdShow))  {  returnFALSE;  }  //消息循环  GetMessage(&msg,NULL,NULL,NULL);//初始化msg  while(msg.message!=WM_QUIT)  {  if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))  {  TranslateMessage(&msg);  DispatchMessage(&msg);  }  else  {  tNow=GetTickCount();  if(tNow-tPre>=40)  MyPaint(hdc);  }  }  returnmsg.wParam;  }  //****设计一个窗口类,类似填空题,使用窗口结构体*********************  ATOMMyRegisterClass(HINSTANCEhInstance)  {  WNDCLASSEXwcex;  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=LoadCursor(NULL,IDC_ARROW);  wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);  wcex.lpszMenuName=NULL;  wcex.lpszClassName="canvas";  wcex.hIconSm=NULL;  returnRegisterClassEx(&wcex);  }  //****初始化函数*************************************  //加载位图资源并取得内部窗口区域信息  BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)  {  HBITMAPbmp;  hInst=hInstance;  hWnd=CreateWindow("canvas","浅墨的窗口",WS_OVERLAPPEDWINDOW,  CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);  if(!hWnd)  {  returnFALSE;  }  MoveWindow(hWnd,10,10,600,450,true);  ShowWindow(hWnd,nCmdShow);  UpdateWindow(hWnd);  hdc=GetDC(hWnd);  mdc=CreateCompatibleDC(hdc);  bufdc=CreateCompatibleDC(hdc);  bmp=CreateCompatibleBitmap(hdc,640,480);  SelectObject(mdc,bmp);  bg=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);  bird=(HBITMAP)LoadImage(NULL,"angrybird.bmp",IMAGE_BITMAP,120,60,LR_LOADFROMFILE);  GetClientRect(hWnd,&rect);//取得内部窗口区域的大小  MyPaint(hdc);  returnTRUE;  }  //****自定义绘图函数*********************************  //1.进行窗口贴图  //2.计算小鸟贴图坐标并判断小鸟是否碰到窗口边沿  voidMyPaint(HDChdc)  {  SelectObject(bufdc,bg);  BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);  SelectObject(bufdc,bird);  BitBlt(mdc,x,y,60,60,bufdc,60,0,SRCAND);  BitBlt(mdc,x,y,60,60,bufdc,0,0,SRCPAINT);  BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);  //计算X轴贴图坐标与速度  x+=vx;  if(x<=0)  {  x=0;  vx=-vx;  }  elseif(x>=rect.right-60)  {  x=rect.right-60;  vx=-vx;  }  //计算Y轴贴图坐标与速度  y+=vy;  if(y<=0)  {  y=0;  vy=-vy;  }  elseif(y>=rect.bottom-60)  {  y=rect.bottom-60;  vy=-vy;  }  tPre=GetTickCount();//记录此次绘图时间  }  ////****消息处理函数***********************************  LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)  {  switch(message)  {  caseWM_KEYDOWN://按键消息  if(wParam==VK_ESCAPE)//按下【Esc】键  PostQuitMessage(0);  break;  caseWM_DESTROY://窗口结束消息  DeleteDC(mdc);  DeleteDC(bufdc);  DeleteObject(bg);  DeleteObject(bird);  ReleaseDC(hWnd,hdc);  PostQuitMessage(0);  break;  default://其他消息  returnDefWindowProc(hWnd,message,wParam,lParam);  }  return0;  }HYPERLINK"http://www.justlk.com"http://www.justlk.com
本文档为【Visual C++ 游戏开发编程愤怒的小鸟】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
中小学教育资料
暂无简介~
格式:doc
大小:84KB
软件:Word
页数:17
分类:金融/投资/证券
上传时间:2023-02-19
浏览量:14