版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目五:陨石撞飞机
平面游戏设计第14、15、16周完成2010/06/04主讲:徐永广cs_star@163.com辅导:黄荔实验内容安排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运行结果二、分析
关键知识点:VisualC++6.0中位图操作,Bitmap类的应用,键盘响应(消息WM_KEYDOWN)处理函数,定时器。初步实验步骤分析1.在VisualC++中新建一个工程,命名为Plane。1)工程类型为:MFCAppWizard[exe]。2)在MFCAppWizard-Step1对话框中设置应用程序的类型,选择单文档结构,其余可以采用默认选项,建立一个单文档工程文件,即得到一个应用程序框架文件,并在项目工作区窗口打开生成的应用程序的项目。2.添加资源:陨石位图、飞机位图。1)在ResourceView资源视图选项卡中,插入或添加新的资源Resource,如图1所示:
2)在InsertResource(插入资源)对话框中选择Bitmap(位图)选项,单击New(新建)按钮,如图2所示:
该位图的ID默认为IDB_BITMAP1.3)在ResourceView资源视图选项卡中①飞机制作:双击IDB_BITMAP1选项,打开资源编辑器中的位图编辑器,设计一个飞机位图文件,如下图所示。②陨石制作:用前面相同方法,在ResourceView资源视图选项卡中,新建(或添加)几个位图,用于设计几个(3~5个)不同的陨石位图文件(每个陨石用一幅图像文件),各个位图的ID默认为IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4、IDB_BITMAP5。3.对飞机的处理1)在PlaneView.h中添加:一个CBitmap类型的变量m_plane;两个int类型变量mx,my表示飞机的坐标;一个绘制飞机图形的函数voidDrawPlane();//函数原型声明,实现可放在PlaneView.cpp中。voidDrawPlane(CDC*pDC);以上数据成员均为public属性。2.位图显示分两步:先将图形加载到内存中,再将内存中的图形显示到屏幕上。通过,在PlaneView.cpp中自行添加一个函数来实现。voidCPlaneView::DrawPlane(CDC*pDC){CDCMemDC;MemDC.CreateCompatibleDC(pDC);
BITMAPbm;m_plane.GetObject(sizeof(BITMAP),&bm);
CBitmapMemBitmap;MemBitmap.CreateCompatibleBitmap(pDC,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_BITMAP1);OnDraw函数:
DrawPlane(pDC);//调用绘制飞机函数4.添加键盘响应处理函数(OnkeyDown)添加函数,使飞机能随用户按下的上下左右方向键而移动。方法:1)在菜单中选择View->ClassWizard,选中CPlaneView类,在MessageMaps选项卡中的Messages栏目选择WM_KEYDOWN消息,双击该项,系统自动生成onKeyDown消息处理函数,如图示:2)在PlaneView.cpp文件中,在系统自动产生的函数框架里添加如下所示代码:到此,编译链接运行程序得到可执行文件Plane.exe,产生如图示的效果,这时用上下左右箭头就可以移动飞机了。试一试!添加的代码 CClientDCClientDC(this); RECTrect; BITMAPbm; m_plane.GetObject(sizeof(BITMAP),&bm); rect.left=mx; rect.top=my; rect.right=rect.left+bm.bmWidth; rect.bottom=rect.top+bm.bmHeight; CBrushbrush(GetSysColor(COLOR_WINDOW));//擦去原来的飞机图像 ClientDC.FillRect(&rect,&brush);
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(&ClientDC);//重新绘制飞机图像下面开始制作下落的陨石1.制作几张(3~5)不同的陨石位图文件,方法同上(与制作飞机位图文件一样)。将这3~5块陨石图像的ID分别命名为:IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4、IDB_BITMAP5、IDB_BITMAP6等等。如图示:2.在PlaneView.h文件中添加处理陨石的数据成员与函数成员的代码:同飞机位图一样,如:添加代码//Attributespublic://声明陨石位图的成员变量为CBitmap类型的变量CBitmapm_stone1,m_stone2,m_stone3,m_stone4,m_stone5;//声明陨石的坐标变量为int类型:intnstone1x,nstone1y;intnstone2x,nstone2y;intnstone3x,nstone3y;intnstone4x,nstone4y;intnstone5x,nstone5y;//Operationspublic://声明绘制陨石的函数原型:voidDrawStone1(CDC*pDC);voidDrawStone2(CDC*pDC);voidDrawStone3(CDC*pDC);voidDrawStone4(CDC*pDC);voidDrawStone5(CDC*pDC);3.在PlaneView.cpp文件中,修改构造函数CPlaneView::CPlaneView()//添加初始化操作代码:
nstone1x=rand()%500;//x方向随机数0~499nstone1y=10;m_stone1.LoadBitmap(IDB_BITMAP2);nstone2x=rand()%500;//x方向随机数0~499nstone2y=10;m_stone2.LoadBitmap(IDB_BITMAP3);nstone3x=rand()%500;//x方向随机数0~499nstone3y=10;m_stone3.LoadBitmap(IDB_BITMAP4);nstone4x=rand()%500;//x方向随机数0~499nstone4y=10;m_stone4.LoadBitmap(IDB_BITMAP5);nstone5x=rand()%500;//x方向随机数0~499nstone5y=10;m_stone5.LoadBitmap(IDB_BITMAP6);4.实现自定义的绘制陨石的函数DrawStone1方法如下:voidCPlaneView::DrawStone1(CDC*pDC){CDCMemDC;MemDC.CreateCompatibleDC(pDC);
BITMAPbm1;m_stone1.GetObject(sizeof(BITMAP),&bm1);
CBitmapMemBitmap;MemBitmap.CreateCompatibleBitmap(pDC,bm1.bmWidth,bm1.bmHeight);
CBitmap*pOldBitmap;pOldBitmap=(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|ClassWizard菜单项,在MFCClassWizard中,选择CPlaneView类,在MessageMaps选项卡中的Messages栏目选择WM_TIMER、WM_CREATE消息,分别双击该项,由系统自动生成该对应的消息函数。如图示:
2)在CPlaneView类的OnTimer函数和OnCreate函数中添加相应的代码,使陨石产生下落的效果。在OnCreate函数中添加:SetTimer(1,200,NULL);//定时器在OnTimer函数中添加: CClientDCClientDC(this); RECTClientRect; GetClientRect(&ClientRect); RECTrect1,rect2,rect3,rect4,rect5; BITMAPbm; m_stone1.GetObject(sizeof(BITMAP),&bm); CBrushbrush(GetSysColor(COLOR_WINDOW));
intn=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(&rect1,&brush); nstone1y=nstone1y+10;//陨石1下落的速度 if(nstone1y>ClientRect.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(&rect2,&brush); nstone2y=nstone2y+13; if(nstone2y>ClientRect.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=nstone3y+15; if(nstone3y>ClientRect.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(nstone4y>ClientRect.bottom) {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(nstone5y>ClientRect.bottom) {nstone5y=0; nstone5x=rand()%ClientRect.right; } if(n>3) {n=0;} DrawStone1(&ClientDC); DrawStone2(&ClientDC); DrawStone3(&ClientDC);DrawStone4(&ClientDC);DrawStone5(&ClientDC);最后编译连接运行,测试是否达到要求的效果。测试与练习、思考事实上,目前本程序设计,只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度原材料采购合同标的质量保证2篇
- 有机化无水硫酸钙晶须改性沥青机理研究
- 合同模板系列分公司设立及承包经营合同
- 专业排烟管道安装合同合同范本
- 售后服务合同范本 2篇
- 工程安装项目社会责任与公益合同20243篇
- 在合同中提现补充协议书(2篇)
- 外企货物销售合同(2篇)
- 买卖手摩托车合同
- 2024年度教育培训与认证合同(标的:专业技能培训)2篇
- 合肥2024年安徽合肥肥西县总工会招聘社会化工会工作者4人笔试历年典型考题及考点剖析附带答案详解
- 校服供货服务方案
- 120院前急救岗前培训
- 合肥市大东门的规划方案
- 第五章排球大单元教学设计课时教学设计人教版初中体育与健康七年级全一册
- 发展生涯报告
- 2024年1-全年时事政治试题及答案汇编-时事一点通、半月谈
- 《美术画展海报设计》课件
- 物理化学基本原理
- 二次函数的应用(最值问题)说课稿
- 设计行业设计安全培训
评论
0/150
提交评论