当前位置:文档之家› MFC_陨石撞飞机实验报告

MFC_陨石撞飞机实验报告

.. ... .一、题目陨石撞飞机综合性实验二、中文摘要用MFC设计一个陨石撞飞机的平面游戏:陨石不断地向下落,飞机通过上下左右键移动以躲避陨石。

当陨石碰撞了飞机时,显示提示对话框,及飞机爆炸图像。

确定后在碰撞位置重新开始游戏。

三次碰撞后显示提示对话框,游戏结束。

三、关键词MFC、Bitmap、timer、键盘响应(WM_KEYDOWN)四、前言此程序大多代码出自参考资料,一小部分代码为搜索资料并加工完成,其功能尚有不完善之处。

五、软件开发过程(一)、新建MFC APPWizard[exe]单文档工程文件在Visual C++中新建一个工程,命名为Plane。

工程类型为:MFC AppWizard[exe]。

在MFC AppWizard-Step1对话框中设置应用程序的类型,建立一个单文档工程文件,得到一个应用程序框架文件。

(二)、添加资源:、飞机位图、陨石位图、爆炸位图。

在[插入]-[资源…]选择Bitmap选项,单击[新建]即可。

绘出一个飞机,ID 为(IDB_BITMAP1)、五个陨石(IDB_BITMAP2~IDB_BITMAP6)和一个炸弹位..专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分图(IDB_BITMAP7),如下图。

飞机位图陨石位图爆炸位图(三)、在planeView.h头文件中声明所需变量和函数CBitmap m_plane; //声明一个CBitmap类型的飞机变量m_plane int mx,my;//表示飞机坐标CBitmap m_bump; //爆炸位图变量int mpx,mpy;//表示爆炸位图的坐标int t; //爆炸次数//声明陨石位图的成员变量为CBitmap类型的变量CBitmap m_stone1,m_stone2,m_stone3,m_stone4,m_stone5;//声明陨石的坐标变量为int类型:int nstone1x,nstone1y;int nstone2x,nstone2y;int nstone3x,nstone3y;专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分int nstone4x,nstone4y;int nstone5x,nstone5y;再声明函数成员void CPlanView::DrawPlane(CDC *pDC);//飞机位图函数void CPlanView::Drawbump(CDC *pDC); //爆炸位图函数// 声明绘制陨石的函数原型:void DrawStone1(CDC *pDC);void DrawStone2(CDC *pDC);void DrawStone3(CDC *pDC);void DrawStone4(CDC *pDC);void DrawStone5(CDC *pDC);以上成员(数据成员、成员函数)均为public属性(四)在planview.cpp文件中添加函数1)、修改构造函数mx=100; my=100; t=0; //赋初值m_plane.LoadBitmap(IDB_BITMAP1); //飞机位图调用专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分m_bomb.LoadBitmap(IDB_BITMAP7); //爆炸位图调用//添加陨石初始化操作代码,随机产生nstone1x=rand()%500; // 陨石1 x方向随机数0~499 nstone1y=10;m_stone1.LoadBitmap(IDB_BITMAP2);nstone2x=rand()%500; // 陨石2 x方向随机数0~499 nstone2y=10;m_stone2.LoadBitmap(IDB_BITMAP3);nstone3x=rand()%500; // 陨石3 x方向随机数0~499 nstone3y=10;m_stone3.LoadBitmap(IDB_BITMAP4);nstone4x=rand()%500; // 陨石4 x方向随机数0~499 nstone4y=10;m_stone4.LoadBitmap(IDB_BITMAP5);专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分nstone5x=rand()%500; // 陨石5 x方向随机数0~499 nstone5y=10;m_stone5.LoadBitmap(IDB_BITMAP6);2)、修改ondraw()函数添加DrawPlane(pDC); //调用绘制飞机函数3)、添加DrawPlane()和Drawbump()函数void CPlaneView::DrawPlane(CDC *pDC){CDC MemDC;MemDC.CreateCompatibleDC(pDC);BITMAP bm;m_plane.GetObject(sizeof(BITMAP),&bm);CBitmap MemBitmap;专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分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);}Drawbump()函数如上类似。

4)添加键盘响应处理函数(OnkeyDown)①添加函数,使飞机能随用户按下的上下左右方向键而移动。

在菜单中选择View->ClassWizard,选中CPlaneView类,在Message Maps选项卡中的Messages栏目选择WM_KEYDOWN消息,双击该项,系统自动生成onKeyDown 消息处理函数.专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分②在PlaneView.cpp文件中,在系统自动产生的函数框架里添加如下所示代码: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) //按键盘上的向上键"↑"{my=my-8;}if(nChar==VK_LEFT) //按键盘上的向上键"←"{mx=mx-8;}if(nChar==VK_RIGHT) //按键盘上的向上键"→"专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分{mx=mx+8;}if(nChar==VK_DOWN) //按键盘上的向上键"↓"{my=my+8;}DrawPlane(&ClientDC); //重新绘制飞机图像CView::OnKeyDown(nChar, nRepCnt, nFlags);5)添加自定义的绘制陨石的函数DrawStone1void CPlaneView::DrawStone1(CDC *pDC){CDC MemDC;MemDC.CreateCompatibleDC(pDC);BITMAP bm1;m_stone1.GetObject(sizeof(BITMAP),&bm1);CBitmap MemBitmap;专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分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,SRC COPY);MemDC.SelectObject(pOldBitmap);}其余函数DrawStone2、DrawStone3、DrawStone4、DrawStone5,类似如上的函数写法6)为了实现陨石的自动下落运动,需要添加定时器函数来控制。

①选View|ClassWizard菜单项,在MFC ClassWizard中,选择CPlaneView类,在Message Maps选项卡中的Messages栏目选择WM_TIMER、WM_CREATE消息,分别双击该项,由系统自动生成该对应的消息函数。

专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分②在OnCreate函数中添加:SetTimer(1,200,NULL);//定时器③在OnTimer函数中添加CClientDC ClientDC(this);RECT ClientRect;GetClientRect(&ClientRect);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;专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分ClientDC.FillRect(&rect1,&brush);nstone1y=nstone1y+10; // 陨石1 下落的速度if(nstone1y>ClientRect.bottom){nstone1y=0;nstone1x=rand()%ClientRect.right; // 陨石落下的位置随机产生}陨石2至陨石5类似if(n>3){n=0;}DrawStone1(&ClientDC);DrawStone2(&ClientDC);DrawStone3(&ClientDC);DrawStone4(&ClientDC);DrawStone5(&ClientDC);CView::OnTimer(nIDEvent);7)接着添加陨石撞上飞机时弹出提示的函数专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分if(t<3) //判断死亡次数{if(nstone1x>=mx-30 && nstone1x<=mx+20 && nstone1y>=my-30 && nstone1y<=my+20) //判断爆炸条件{mpx=mx;mpy=my;Drawbump(&ClientDC); //显示爆炸位图KillTimer(1); //停止计时器MessageBox("死亡!"); //提示框显示死亡nstone1y=0;nstone1x=rand()%ClientRect.right; //重新产生被撞陨石SetTimer(1,200,NULL); //开始计时器t++;}}else{t=0;专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分mpx=mx;mpy=my;Drawbump(&ClientDC);MessageBox("Game Over!Press OK to restar!","Notice"); //超过3次死亡显示Game Over}if(t<3) //判断死亡次数{if(nstone2x>=mx-30 && nstone2x<=mx+20 && nstone2y>=my-30 && nstone2y<=my+20) //判断爆炸条件{mpx=mx;mpy=my;Drawbump(&ClientDC); //显示爆炸位图KillTimer(1); //停止计时器MessageBox("死亡!"); //提示框显示死亡nstone2y=0;nstone2x=rand()%ClientRect.right; //重新产生被撞陨石SetTimer(1,200,NULL); //开始计时器专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分t++;}}else{t=0;mpx=mx;mpy=my;Drawbump(&ClientDC);MessageBox("Game Over!Press OK to restar!","Notice"); //超过3次死亡显示Game Over}if(t<3) //判断死亡次数{if(nstone3x>=mx-30 && nstone3x<=mx+20 && nstone3y>=my-30 && nstone3y<=my+20) //判断爆炸条件{mpx=mx;mpy=my;专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分Drawbump(&ClientDC); //显示爆炸位图KillTimer(1); //停止计时器MessageBox("死亡!"); //提示框显示死亡nstone3y=0;nstone3x=rand()%ClientRect.right; //重新产生被撞陨石SetTimer(1,200,NULL); //开始计时器t++;}}else{t=0;mpx=mx;mpy=my;Drawbump(&ClientDC);MessageBox("Game Over!Press OK to restar!","Notice"); //超过3次死亡显示Game Over专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分}if(t<3) //判断死亡次数{if(nstone4x>=mx-30 && nstone4x<=mx+20 && nstone4y>=my-30 && nstone4y<=my+20) //判断爆炸条件{mpx=mx;mpy=my;Drawbump(&ClientDC); //显示爆炸位图KillTimer(1); //停止计时器MessageBox("死亡!"); //提示框显示死亡nstone4y=0;nstone4x=rand()%ClientRect.right; //重新产生被撞陨石SetTimer(1,200,NULL); //开始计时器t++;}}else{专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分t=0;mpx=mx;mpy=my;Drawbump(&ClientDC);MessageBox("Game Over!Press OK to restar!","Notice"); //超过3次死亡显示Game Over}if(t<3) //判断死亡次数{if(nstone5x>=mx-30 && nstone5x<=mx+20 && nstone5y>=my-30 && nstone5y<=my+20) //判断爆炸条件{mpx=mx;mpy=my;Drawbump(&ClientDC); //显示爆炸位图KillTimer(1); //停止计时器MessageBox("死亡!"); //提示框显示死亡nstone5y=0;nstone5x=rand()%ClientRect.right; //重新产生被撞陨石专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分SetTimer(1,200,NULL); //开始计时器t++;}}else{t=0;mpx=mx;mpy=my;Drawbump(&ClientDC);MessageBox("Game Over!Press OK to restar!","Notice"); //超过3次死亡显示Game Over}程序结束六、系统测试情况基本完成实验要求,飞机可以键盘响应上下左右移动,撞上陨石有提示并能调出爆炸位图,超过三次碰撞提示游戏结束。

相关主题