超详细版陨石撞飞机课件_第1页
超详细版陨石撞飞机课件_第2页
超详细版陨石撞飞机课件_第3页
超详细版陨石撞飞机课件_第4页
超详细版陨石撞飞机课件_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、项目五:陨石撞飞机平面游戏设计第14、15、16周完成2010/06/04主讲:徐永广徐永广cs_辅导:黄荔黄荔实验内容安排实验内容安排 4个基础性实验个基础性实验,1个综合性实验个综合性实验 基础回顾(基础回顾(6学时)学时)+3 =9 实验项目实验项目1(A) 类与对象(类与对象(6学时)学时) 实验项目实验项目1(B) 继承与派生(继承与派生(3学时)学时)+3 =6 实验项目实验项目2 多态性(多态性(3学时)学时) 实验项目实验项目3 小小图书馆(小小图书馆(9学时)学时)-3 =6 实验项目实验项目4 简单计算器(简单计算器(9学时)学时) 实验项目实验项目5 陨石撞飞机(陨石撞飞

2、机(12学时)学时)-3 =9项目五:陨石撞飞机一、实验目标与要求一、实验目标与要求 设计一个陨石撞飞机的平面游戏:陨设计一个陨石撞飞机的平面游戏:陨石不断地向下落,飞机通过上下左右石不断地向下落,飞机通过上下左右键移动以躲避陨石。如图键移动以躲避陨石。如图2_1所示。所示。 图2_1 运行结果 二、分析二、分析 关键知识点: Visual C+6.0中位图操作,Bitmap类的应用,键盘响应(消息WM_KEYDOWN)处理函数,定时器。初步实验步骤分析 1. 在Visual C+中新建一个工程,命名为Plane。 1)工程类型为: MFC AppWizardexe。 2)在MFC AppWi

3、zard-Step1对话框中设置应用程序的类型,选择单文档结构,其余可以采用默认选项,建立一个单文档工程文件,即得到一个应用程序框架文件,并在项目工作区窗口打开生成的应用程序的项目。 2. 添加资源:陨石位图、飞机位图。 1)在ResourceView资源视图选项卡中,插入或添加新的资源Resource,如图1所示: 2)在Insert Resource(插入资源) 对话框中选择Bitmap(位图)选项,单击New(新建)按钮,如图2所示: 该位图的ID默认为IDB_BITMAP1. 3)在ResourceView资源视图选项卡中飞机制作: 双击IDB_BITMAP1选项,打开资源编辑器中的位

4、图编辑器,设计一个飞机位图文件,如下图所示。陨石制作: 用前面相同方法,在ResourceView资源视图选项卡中,新建(或添加)几个位图,用于设计几个(35个)不同的陨石位图文件(每个陨石用一幅图像文件),各个位图的ID默认为IDB_BITMAP2、 IDB_BITMAP3、 IDB_BITMAP4、 IDB_BITMAP5。 3.对飞机的处理 1)在PlaneView.h 中添加: 一个CBitmap类型的变量m_plane; 两个int 类型变量mx,my 表示飞机的坐标; 一个绘制飞机图形的函数void DrawPlane(); /函数原型声明,实现可放在PlaneView.cpp中。

5、 void DrawPlane(CDC *pDC); 以上数据成员均为public 属性。2.位图显示分两步: 先将图形加载到内存中,再将内存中的图形显示到屏幕上。通过,在PlaneView.cpp中自行添加一个函数来实现。 void CPlaneView:DrawPlane(CDC *pDC) CDC MemDC; MemDC.CreateCompatibleDC(pDC); BITMAP bm; m_plane.GetObject(sizeof(BITMAP),&bm); CBitmap MemBitmap; MemBitmap.CreateCompatibleBitmap(pDC

6、,bm.bmWidth,bm.bmHeight); CBitmap *pOldBitmap; pOldBitmap=(CBitmap*)MemDC.SelectObject(&MemBitmap); MemDC.SelectObject(&m_plane); pDC-BitBlt(mx,my,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBitmap); 3.修改构造函数与OnDraw函数添加代码:构造函数:mx=100;my=100;m_plane.LoadBitmap(IDB_B

7、ITMAP1);OnDraw函数:DrawPlane(pDC); /调用绘制飞机函数4.添加键盘响应处理函数(OnkeyDown) 添加函数,使飞机能随用户按下的上下左右方向键而移动。 方法: 1)在菜单中选择View-ClassWizard,选中CPlaneView类,在Message Maps选项卡中的Messages栏目选择WM_KEYDOWN消息,双击该项,系统自动生成onKeyDown消息处理函数,如图示: 2)在PlaneView.cpp文件中,在系统自动产生的函数框架里添加如下所示代码: 到此,编译链接运行程序得到可执行文件Plane.exe,产生如图示的效果,这时用上下左右箭头

8、就可以移动飞机了。试一试!添加的代码CClientDC ClientDC(this);RECT rect;BITMAP bm;m_plane.GetObject(sizeof(BITMAP),&bm);rect.left=mx;rect.top=my;rect.right=rect.left+bm.bmWidth;rect.bottom=rect.top+bm.bmHeight;CBrush brush(GetSysColor(COLOR_WINDOW); / 擦去原来的飞机图像ClientDC.FillRect(&rect,&brush);if(nChar=VK_UP

9、) /按键盘上的向上键my=my-3;if(nChar=VK_LEFT) /按键盘上的向上键mx=mx-3;if(nChar=VK_RIGHT) /按键盘上的向上键mx=mx+3;if(nChar=VK_DOWN) /按键盘上的向上键my=my+3;DrawPlane(&ClientDC); /重新绘制飞机图像下面开始制作下落的陨石1. 制作几张(35)不同的陨石位图文件,方法同上(与制作飞机位图文件一样)。 将这35块陨石图像的ID分别命名为:IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4、IDB_BITMAP5、IDB_BITMAP6等等。 如图示:2. 在

10、PlaneView.h文件中添加处理陨石的数据成员与函数成员的代码: 同飞机位图一样,如:添加代码/Attributes public: /声明陨石位图的成员变量为CBitmap类型的变量 CBitmap m_stone1,m_stone2,m_stone3,m_stone4,m_stone5; /声明陨石的坐标变量为int类型: int nstone1x,nstone1y; int nstone2x,nstone2y; int nstone3x,nstone3y; int nstone4x,nstone4y; int nstone5x,nstone5y;/ Operationspublic:

11、 / 声明绘制陨石的函数原型: void DrawStone1(CDC *pDC); void DrawStone2(CDC *pDC); void DrawStone3(CDC *pDC); void DrawStone4(CDC *pDC); void DrawStone5(CDC *pDC);3.在PlaneView.cpp文件中,修改构造函数CPlaneView:CPlaneView()/添加初始化操作代码: nstone1x=rand()%500; / x方向随机数0499 nstone1y=10; m_stone1.LoadBitmap(IDB_BITMAP2); nstone2x

12、=rand()%500; / x方向随机数0499 nstone2y=10; m_stone2.LoadBitmap(IDB_BITMAP3); nstone3x=rand()%500; / x方向随机数0499 nstone3y=10; m_stone3.LoadBitmap(IDB_BITMAP4); nstone4x=rand()%500; / x方向随机数0499 nstone4y=10; m_stone4.LoadBitmap(IDB_BITMAP5); nstone5x=rand()%500; / x方向随机数0499 nstone5y=10; m_stone5.LoadBitma

13、p(IDB_BITMAP6);4. 实现自定义的绘制陨石的函数DrawStone1 方法如下: void CPlaneView:DrawStone1(CDC *pDC) CDC MemDC; MemDC.CreateCompatibleDC(pDC); BITMAP bm1; m_stone1.GetObject(sizeof(BITMAP),&bm1); CBitmap MemBitmap; MemBitmap.CreateCompatibleBitmap(pDC,bm1.bmWidth,bm1.bmHeight); CBitmap *pOldBitmap; pOldBitmap=(

14、CBitmap*)MemDC.SelectObject(&MemBitmap); MemDC.SelectObject(&m_stone1); pDC-BitBlt(nstone1x,nstone1y,bm1.bmWidth,bm1.bmHeight,&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBitmap); 其余函数DrawStone2、DrawStone3、DrawStone4、DrawStone5,类似如上的函数写法。 5. 为了实现陨石的自动下落运动,需要添加定时器函数来控制。 方法: 1) 选View|ClassW

15、izard菜单项,在MFC ClassWizard中,选择CPlaneView类,在Message Maps选项卡中的Messages栏目选择WM_TIMER、WM_CREATE消息, 分别双击该项,由系统自动生成该对应的消息函数。如图示: 2) 在CPlaneView类的OnTimer函数和OnCreate函数中添加相应的代码,使陨石产生下落的效果。 在OnCreate函数中添加:SetTimer(1,200,NULL);/定时器在OnTimer 函数中添加:CClientDC ClientDC(this);RECT ClientRect;GetClientRect(&ClientR

16、ect);RECT rect1,rect2,rect3,rect4,rect5;BITMAP bm;m_stone1.GetObject(sizeof(BITMAP),&bm);CBrush brush(GetSysColor(COLOR_WINDOW); int n=0,ns1,ns2,ns3,ns4,ns5;n+;ns1=nstone1x+n;rect1.left=ns1-20;rect1.top=nstone1y-20;rect1.right=rect1.left+bm.bmWidth;rect1.bottom=rect1.top+bm.bmHeight;ClientDC.Fil

17、lRect(&rect1,&brush);nstone1y=nstone1y+10; / 陨石1 下落的速度 if(nstone1yClientRect.bottom) nstone1y=0;nstone1x=rand()%ClientRect.right; / 陨石落下的位置随机产生ns2=nstone2x+n;rect2.left=ns2-20;rect2.top=nstone2y-20;rect2.right=rect2.left+bm.bmWidth+10;rect2.bottom=rect2.top+bm.bmHeight+10;ClientDC.FillRect(&

18、amp;rect2,&brush);nstone2y=nstone2y+13;if(nstone2yClientRect.bottom)nstone2y=0;nstone2x=rand()%ClientRect.right;ns3=nstone3x+n;rect3.left=ns3-20;rect3.top=nstone3y-20;rect3.right=rect3.left+bm.bmWidth+10;rect3.bottom=rect3.top+bm.bmHeight+10;ClientDC.FillRect(&rect3,&brush);nstone3y=nsto

19、ne3y+15;if(nstone3yClientRect.bottom)nstone3y=0;nstone3x=rand()%ClientRect.right;ns4=nstone4x+n;rect4.left=ns4-20;rect4.top=nstone4y-20;rect4.right=rect4.left+bm.bmWidth+10;rect4.bottom=rect4.top+bm.bmHeight+10;ClientDC.FillRect(&rect4,&brush);nstone4y=nstone4y+17;if(nstone4yClientRect.botto

20、m)nstone4y=0;nstone4x=rand()%ClientRect.right;ns5=nstone5x+n;rect5.left=ns5-20;rect5.top=nstone5y-20;rect5.right=rect5.left+bm.bmWidth+10;rect5.bottom=rect5.top+bm.bmHeight+10;ClientDC.FillRect(&rect5,&brush);nstone5y=nstone5y+19;if(nstone5yClientRect.bottom)nstone5y=0;nstone5x=rand()%ClientRect.right;if(n3)n=0;DrawStone1(&ClientDC);DrawStone2(&ClientDC);DrawStone3(&ClientDC); DrawStone4(&ClientDC); DrawSto

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论