资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
项目五:陨石撞飞机 平面游戏设计 第14、15、16周完成 2010/06/04 主讲:徐永广 cs_star 辅导:黄荔 实验内容安排 4个基础性实验,1个综合性实验 基础回顾(6学时)+3 =9 实验项目1(A) 类与对象(6学时) 实验项目1(B) 继承与派生(3学时)+3 =6 实验项目2 多态性(3学时) 实验项目3 小小图书馆(9学时)-3 =6 实验项目4 简单计算器(9学时) 实验项目5 陨石撞飞机(12学时)-3 =9 项目五:陨石撞飞机 一、实验目标与要求 设计一个陨石撞飞机的平面游戏: 陨石不断地向下落,飞机通过上下左 右键移动以躲避陨石。如图2_1所示 。 图2_1 运行结果 二、分析 关键知识点: Visual C+6.0中位图操作,Bitmap类的应用 ,键盘响应(消息WM_KEYDOWN)处理函数,定 时器。 初步实验步骤分析 1. 在Visual C+中新建一个工程,命名 为Plane。 1)工程类型为: MFC AppWizardexe 。 2)在MFC AppWizard-Step1对话框中 设置应用程序的类型,选择单文档结构 ,其余可以采用默认选项,建立一个单 文档工程文件,即得到一个应用程序框 架文件,并在项目工作区窗口打开生成 的应用程序的项目。 2. 添加资源:陨石位图、飞机位图。 1)在ResourceView资源视图选项卡中, 插入或添加新的资源Resource,如图1所示: 2)在Insert Resource(插入资源) 对话框 中选择Bitmap(位图)选项,单击New(新 建)按钮,如图2所示: 该位图的ID默认为IDB_BITMAP1. 3)在ResourceView资源视图选项卡中 飞机制作: 双击IDB_BITMAP1选项,打开资源编辑器中的 位图编辑器,设计一个飞机位图文件,如下图所 示。 陨石制作: 用前面相同方法,在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中。 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), CBitmap MemBitmap; MemBitmap.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight); CBitmap *pOldBitmap; pOldBitmap=(CBitmap*)MemDC.SelectObject( MemDC.SelectObject( pDC- BitBlt(mx,my,bm.bmWidth,bm.bmHeight, MemDC.SelectObject(pOldBitmap); 3.修改构造函数与OnDraw函数 添加代码: 构造函数: mx=100; my=100; m_plane.LoadBitmap(IDB_BITMAP1); OnDraw函数: DrawPlane(pDC); /调用绘制飞机函数 4.添加键盘响应处理函数(OnkeyDown) 添加函数,使飞机能随用户按下的上下左右方向键 而移动。 方法: 1)在菜单中选择View-ClassWizard,选中 CPlaneView类,在Message Maps选项卡中的 Messages栏目选择WM_KEYDOWN消息, 双击该项,系统自动生成onKeyDown消息处理函数 ,如图示: 2)在PlaneView.cpp文件中,在系统自动产生的 函数框架里添加如下所示代码: 到此,编译链接运行程序得到可执行文件Plane.exe,产生 如图示的效果,这时用上下左右箭头就可以移动飞机了。 试一试! 添加的代码 CClientDC ClientDC(this); RECT rect; BITMAP bm; m_plane.GetObject(sizeof(BITMAP), 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( if(nChar=VK_UP) /按键盘上的向上键“ 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( /重新绘制飞机图像 下面开始制作下落的陨石 1. 制作几张(35)不同的陨石位图文件,方法 同上(与制作飞机位图文件一样)。 将这35块陨石图像的ID分别命名为: IDB_BITMAP2、IDB_BITMAP3、 IDB_BITMAP4、IDB_BITMAP5、 IDB_BITMAP6等等。 如图示: 2. 在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; / Operations public: / 声明绘制陨石的函数原型: 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=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.LoadBitmap(IDB_BITMAP6); 4. 实现自定义的绘制陨石的函数DrawStone1 方法如下: void CPlaneView:DrawStone1(CDC *pDC) CDC MemDC; MemDC.CreateCompatibleDC(pDC); BITMAP bm1; m_stone1.GetObject(sizeof(BITMAP), CBitmap MemBitmap; MemBitmap.CreateCompatibleBitmap(pDC,bm1.bmWidth,bm1.bmHeight); CBitmap *pOldBitmap; pOldBitmap=(CBitmap*)MemDC.SelectObject( MemDC.SelectObject( pDC- BitBlt(nstone1x,nstone1y,bm1.bmWidth,bm1.bmHeight, MemDC.SelectObject(pOldBitmap); 其余函数DrawStone2、DrawStone3、DrawStone4、DrawStone5,类似如上的函数 写法。 5. 为了实现陨石的自动下落运动,需要添 加定时器函数来控制。 方法: 1) 选View|ClassWizard菜单项,在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( RECT rect1,rect2,rect3,rect4,rect5; BITMAP bm; m_stone1.GetObject(sizeof(BITMAP), 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.FillRect( 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.t
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号