
2023年MFC陨石撞飞机实验报告.doc
15页一、题目陨石撞飞机综合性实验二、中文摘要用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)和一个炸弹位图(IDB_BITMAP7),如下图飞机位图 陨石位图 爆炸位图 (三)、在planeView.h头文献中声明所需变量和函数CBitmap m_plane; //声明一个CBitmap类型的飞机变量m_planeint 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; 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); //飞机位图调用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); 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; 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消息解决函数.②在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) //按键盘上的向上键"→" {mx=mx+8;} if(nChar==VK_DOWN) //按键盘上的向上键"↓" {my=my+8;} DrawPlane(&ClientDC); //重新绘制飞机图像 CView::OnKeyDown(nChar, nRepCnt, nFlags);5)添加自定义的绘制陨石的函数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=(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,类似如上的函数写法6)为了实现陨石的自动下落运动,需要添加定期器函数来控制。
①选View|ClassWizard菜单项,在MFC ClassWizard中,选择CPlaneView类,在Message Maps选项卡中的Messages栏目选择WM_TIMER、WM_CREATE消息,分别双击该项,由系统自动生成该相应的消息函数②在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; ClientDC.FillRect(&rect1,&brush); nstone1y=nstone1y+10; // 陨石1 下落的速度 if(nstone1y>ClientRect.bottom) {nstone1y=0; nstone1x=rand()%ClientRect.right; // 陨石落下的位置随机产生 } 陨石2至陨石5类似 if(n>。
