MFC_陨石撞飞机实验报告
飞机大战MFC实验报告

实训报告飞机大战游戏设计与开发目录1. 概述 (4)2. 相关技术 (4)2.1 透明贴图技术 (4)2.2 CObList链表 (4)2.3获取矩形区域函数 (4)2.4弹出对话框函数 (5)2.5字体的个性化输出函数 (5)2.6设置定时器 (5)2.7双缓冲技术 (5)2.8 内存释放技术 (6)2.9对话框中添加动态按钮 (6)2.10检测方向键按下 (6)3. 需求分析(用结构化方法或面向对象方法给出系统的主要需求模型) (6)3.1功能需求分析 (6)3.2 数据需求分析 (7)3.3 行为需求分析 (7)3.4 其他需求 (8)4. 总体设计与详细设计 (8)4.1 系统模块划分 (9)4.2 主要功能模块 (10)4.3 扩展功能设计思路 (10)5. 编码实现 (11)5.1游戏初始创建 (11)5.2定时器 (11)5.3背景及游戏开始、结束界面绘制函数 (11)5.4键盘控制函数 (12)5.5游戏对象进行碰撞测试和碰撞销毁 (13)5.6创建动态按钮(开始游戏、游戏规则) (13)5.6重新开始游戏代码 (14)5.7设置游戏难度代码 (14)5.8游戏结束时释放资源函数 (15)5.9调整对话框大小函数 (15)5.10开始界面背景绘制函数 (15)5.11选择下一关卡以及选择完成后的执行代码 (16)6.测试情况说明。
(17)6.1主要模块测试情况(白盒) (17)6.11各游戏对象碰撞检测爆炸模块测试 (17)6.12战机导弹的方向速度模块测试 (17)6.13文字显示,游戏结束和关卡进入模块测试 (18)6.14设置游戏难度和重新开始模块测试 (18)6.2 主要功能测试情况(黑盒) (18)6.21各游戏对象碰撞检测爆炸模块测试 (18)6.22敌机子弹导弹的方向速度模块测试 (19)6.23文字显示,游戏结束和关卡进入模块测试 (19)6.24设置游戏难度和重新开始模块测试 (19)7. 实训中遇到的主要问题及解决方法 (19)8. 实训收获与体会 (20)1. 概述本次实训主要是做一个基于windows的飞机大战单机版游戏,其实现的主要功能为:控制战机对象的移动,敌机对象的随机出现和发射子弹,实现游戏对象的爆炸特效,文字提示功能和界面背景切换特效,其主要是遵循开发者规定的游戏规则进行游戏闯关。
陨石飞机

平面游戏一陨石撞飞机一、目标与要求设计一个陨石撞飞机的平面游戏:陨石不断地向下落,飞机通过上下左右键移动以躲避陨石。
如图所示。
二、工具/准备工作在开始实验前,应回顾或复习的相关内容。
需要一台主算机,其中安装有Visual C++ 6.0集成开发环境软件。
三、分析知识点:Visual C++6.0中位图操作,Cbitmap类的应用,键盘响应(消息WM_KEYDOWN)处理函数,定时器。
四、步骤1.在VC++中新建一个工程文件,命名为plane,下一步选择单文档结构,其余采用默认选项,建立一个单文档工程文件。
添加新的Resource。
如下图所示。
在Insert Resource对话框中选择Bitmap选项,单击New按钮,如图所示。
该位图的ID 默认为IDB_BITMAP1。
2.在ResourceView选项卡中双击IDB_BITMAP1I选项,打开位图编辑器,设计飞机图像,如下图所示。
3.同样地可设计3个陨石图像,如下图所示。
4.在类CplaneView的声明中增加如下的数据成员:class CPlaneView : public CView{protected: // create from serialization onlyCPlaneView();DECLARE_DYNCREA TE(CPlaneView)// Attributespublic:CPlaneDoc* GetDocument();CBitmap m_plane; // 飞机CBitmap m_stone1, m_stone2, m_stone3; // 陨石int planex, planey; // 飞机坐标int stone1x, stone1y; // 陨石1坐标int stone2x, stone2y; // 陨石2坐标int stone3x, stone3y; // 陨石3坐标// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CPlaneView)public:virtual void OnDraw(CDC* pDC); // overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);//}}AFX_VIRTUAL// Implementationpublic:virtual ~CPlaneView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// Generated message map functionsprotected://{{AFX_MSG(CPlaneView)afx_msg int OnCreate(LPCREA TESTRUCT lpCreateStruct);afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);//}}AFX_MSGDECLARE_MESSAGE_MAP()private:void DrawBitmap(CDC *pDC, CBitmap &oBitmap, int oldx, int oldy, int newx, int newy);};5.在CplaneView类的构造函数CPlaneView()与OnDraw(CDC* pDC)各成员函数中分别添加下列语句(自行添加的语句),其他的函数保持不变。
撞机事件分析报告

撞机事件分析报告概述撞机事件是指飞机在空中、地面或其他建筑物上发生撞击的事故。
这种事故通常会导致严重的伤亡和财产损失。
撞机事件的发生原因多种多样,包括飞行员错误、机械故障、恶劣天气等因素。
本报告旨在对撞机事件进行综合分析,以便更好地理解这类事故的原因和影响。
数据统计与分析根据从各国飞行安全管理机构以及国际航空运输协会收集的数据统计,撞机事故在全球范围内时有发生。
2019年全球范围内共发生撞机事件190起,其中造成了2759人死亡。
这些数据表明撞机事故对人员安全和财产造成了重大损失。
撞机事件的常见原因撞机事件的发生往往有多个因素的共同作用。
以下是一些常见的撞机事件原因:1.飞行员错误:飞行员的失误是导致撞机事件最常见的原因之一。
包括飞行员疲劳、飞行员健康状况不佳、飞行员注意力不集中等问题。
2.飞机机械故障:飞机机械故障也会导致撞机事件。
例如,引擎故障、电子系统故障等会影响飞行安全的因素。
3.恶劣天气:恶劣的天气条件对飞行安全有着重要影响。
强风、大雨、低云等气象条件会限制飞行员的视野和操作能力,增加了撞机风险。
4.空管错误:空中交通管制系统的错误也可能导致撞机事件的发生。
例如,航线规划错误、飞机间距控制不当等。
5.机场设施问题:机场的设施问题也可能成为撞机事件的一个因素。
例如,导航设施故障、跑道维护不当等。
撞机事件的影响撞机事件对个人、社会和经济都会造成严重的影响。
1.人员伤亡:撞机事件通常会导致大量人员伤亡。
这不仅对伤者和他们的家人造成了巨大的痛苦,也给医疗机构和救援队伍增加了巨大的负担。
2.经济损失:撞机事件对相关行业和企业造成了严重的经济损失。
航空公司因此遭受重大的财务损失,机场和旅游业也受到了冲击。
3.影响信心:撞机事件可能使公众对航空安全产生质疑,削弱乘客的信心。
这可能导致航空公司的业务受到影响,乘客选择其他交通工具。
预防措施为了减少撞机事件的发生,各国飞行安全管理机构和航空公司可以采取以下预防措施:1.飞行员培训:加强飞行员的培训和考核,提高他们的技术水平和意识。
陨石下落实验自我反思报告

陨石下落实验自我反思报告
尊敬的老师:
我最近进行了一次关于陨石下落的实验,在此向您提交我的实验报告和自我反思。
实验概述:
我使用了一个小型的充氮气球 (直径为 50 厘米,高为 70 厘米),将陨石 (重约 500 克) 从二楼投掷到气球中,然后观察陨石在
气球中的下落情况。
我使用了一台摄像机来记录陨石的下落过程。
实验结果:
在实验中,陨石在进入气球后迅速膨胀,并在气球中上下波动。
最终,陨石在气球中稳定下来,并保持了一段时间。
在这段时间里,陨石不断地发出微弱的爆炸声,并在气球中留下了一些痕迹。
实验反思:
通过这次实验,我认识到陨石下落的过程非常复杂,需要考虑多种因素,如陨石的大小、密度、形状、重量、空气阻力等。
在本次实验中,我虽然使用了充氮气球来减少陨石与空气的接触,但仍然无法完全避免陨石与气球的接触,这可能会影响陨石的下落情况。
我还发现,陨石在气球中的下落情况与在地面上的下落情况不同。
在气球中,陨石受到的空气阻力和浮力较大,这可能会影响陨石的速度和轨迹。
因此,在进行陨石下落的实验时,需要考虑这些因素。
结论:
通过这次实验,我了解了陨石下落的复杂性,并认识到了实验需
要考虑的因素。
我将进一步研究陨石下落的规律,并尝试通过实验来验证和证明某些理论。
MFC_陨石撞飞机实验报告

专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分一、题目陨石撞飞机综合性实验二、中文摘要用MFC设计一个陨石撞飞机的平面游戏:陨石不断地向下落,飞机通过上下左右键移动以躲避陨石。
当陨石碰撞了飞机时,显示提示对话框,及飞机爆炸图像。
确定后在碰撞位置重新开始游戏。
三次碰撞后显示提示对话框,游戏结束。
三、关键词MFC、Bitmap、timer、键盘响应(WM_KEYDOWN)四、前言此程序大多代码出自参考资料,一小部分代码为搜索资料并加工完成,其功能尚有不完善之处。
五、软件开发过程(一)、新建MFC APPWizard[exe]单文档工程文件在Visual C++中新建一个工程,命名为Plane。
工程类型为:MFC AppWizard[exe]。
在MFC AppWizard-Step1对话框中设置应用程序的类型,建立一个单文档工程文件,得到一个应用程序框架文件。
(二)、添加资源:、飞机位图、陨石位图、爆炸位图。
专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分在[插入]-[资源…]选择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;专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分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); //飞机位图调用专业软件工程年级、班级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);nstone5x=rand()%500; // 陨石5 x方向随机数0~499 nstone5y=10;m_stone5.LoadBitmap(IDB_BITMAP6);专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分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);专业软件工程年级、班级09级8班课程名称计算机综合性实验实验项目陨石撞飞机实验时间2010 年 6 月20 日实验指导老师黄荔实验评分pDC->BitBlt(mx,my,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);MemDC.SelectObject(pOldBitmap);}Drawbump()函数如上类似。
陨石撞飞机游戏实验步骤

5 在视图中显示飞机和位图
这涉及到视图窗口的绘制,要在 CPlaneView::OnDraw()函数中绘制。 //打开这个函数,在其中添加代码: CDC MEmDC; MEmDC.CreateCompatibleDC (pDC);
CDC MEmDC; //CDC类定义的是设备上下文对象的类, 处理与 窗口客户区对应的显示上下文的成员。通过 CDC对象的成员函数进行所有的绘图。 //MEmDC 必须为局部变量 MEmDC.CreateCompatibleDC (pDC); //产生与pDC指定设备兼容的设备上下文内存, 设备上下文内存包含显示表面的信息,它用于 在向实际的兼容设备表面发送图象之前在内存 中作好准备。
10 游戏功能扩展
(1)增加游戏难度 (2)统计游戏得分 (3)添加背景图片 (4)使图片透明
case VK_LEFT: if(m_RectPlane.left >area.left) m_RectPlane+=CSize(-10,0); break; case VK_RIGHT: if(m_RectPlane.right <area.right) m_RectPlane+=CSize(10,0); break; } InvalidateRect(m_RectPlane); CView::OnKeyDown(nChar, nRepCnt, nFlags); } 写完上面的代码,飞机就可以移动了。
//判断是否移出界外 if(m_RectStone[0].top>area.bottom) { srand((unsigned) time(NULL)); m_RectStone[0].left=0+rand()%(50+1); srand((unsigned) time(NULL)); m_RectStone[0].top=0+rand()%(100+1); m_RectStone[0]=CRect(m_RectStone[0].left,m_RectStone[0].top,m_Re ctStone[0].left+m_StoneW[0],m_RectStone[0].top+m_StoneH[0]); } }
c飞机大战实训报告附带码

目录1. 概述 (3)1.1 实训项目简介 (3)1.2 实训功能说明 (3)1.2.1 基本功能 (3)1.2.2 附加功能 (3)2. 相关技术 (4)2.1 Windows定时器技术 (4)2.2 透明贴图实现技术 (4)2.3 CObList链表 (5)2.4获取矩形区域 (6)2.5使用AfxMessageBox显示游戏过程中的提示信息 (7)2.6内存释放 (7)2.7 CImageList处理爆炸效果 (7)2.8对话框的应用 (8)3. 总体设计与详细设计 (8)3.1 系统模块划分 (8)3.2 主要功能模块 (9)3.2.1 系统对象类图 (9)3.2.2 系统主程序活动图 (10)3.2.3 系统部分流程图 (11)4. 编码实现 (13)4.1 绘制游戏背景位图程序 (13)4.2 飞机大战游戏对象的绘制程序 (14)4.3 飞机大战游戏对象战机位置的动态控制 (18)4.4 飞机大战游戏对象之间的碰撞实现 (21)4.5 游戏界面输出当前信息 (22)5. 项目程序测试 (24)5.1战机移动及子弹发射模块测试 (24)5.2 敌机及炸弹模块测试 (20)5.3 爆炸模块测试 (20)6. 实训中遇到的主要问题及解决方法 (25)7. 实训体会 (25)1. 概述1.1 实训项目简介本次实训项目是做一个飞机大战的游戏,应用MFC编程,完成一个界面简洁流畅、游戏方式简单,玩起来易于上手的桌面游戏。
该飞机大战项目运用的主要技术即是MFC编程中的一些函数、链表思想以及贴图技术。
1.2 实训功能说明1.2.1 基本功能(1)设置一个战机具有一定的速度,通过键盘,方向键可控制战机的位置,空格键发射子弹。
(2)界面中敌机出现的位置,以及敌机炸弹的发射均为随机的,敌机与敌机炸弹均具有一定的速度,且随着关卡难度的增大,数量和速度均增加。
(3)对于随机产生的敌机和敌机炸弹,若超过矩形区域,则释放该对象。
陨石撞击模拟实验记录数据

陨石撞击模拟实验记录数据实验名称:陨石撞击实验实验目的:研究陨石撞击对地壳变形的影响实验设备:冲击投射器、钢球、靶板、高速相机、位移传感器、压力传感器实验流程:1.设置冲击投射器,将钢球固定在冲击投射器上。
2.将靶板放置在冲击投射器下方,调整靶板高度以使其与钢球的轨迹重合。
3.调整冲击投射器的出射速度和角度,进行一次完整的实验。
4.使用高速相机记录撞击过程的图像。
5.使用位移传感器测量靶板的位移。
6.使用压力传感器测量撞击过程中的压力变化。
实验记录:实验编号:001冲击投射器出射速度:100m/s冲击投射器出射角度:45°钢球直径:10 cm靶板材料:岩石靶板厚度:20 cm实验结果:1. 高速相机记录的图像显示,钢球在撞击过程中形成了一个明显的碰撞坑。
碰撞坑的直径约为20 cm,深度约为10 cm。
2. 位移传感器测量到靶板在撞击过程中的最大位移为5 cm。
3.压力传感器测量到撞击过程中的最大压力为500MPa。
实验分析:根据实验结果可以看出,陨石的撞击对地壳会造成明显的变形。
在撞击过程中,钢球形成了一个碰撞坑,这表明地壳在撞击力下发生了塑性变形。
靶板的位移和撞击过程中的压力变化进一步证实了这一点。
结论:从实验结果可以得出结论,陨石撞击地球会对地壳造成明显的变形。
这种变形可能导致地壳断裂、火山喷发、地震等地质灾害的发生。
这些灾害可能对生物和环境产生重大影响,甚至导致生物的灭绝。
实验改进:在以后的实验中,可以改变撞击物的质量、速度和角度,以及靶板的材料和厚度,进一步研究陨石撞击对地壳的影响。
此外,可以结合数值模拟方法,对陨石撞击过程进行更加精细的研究,以提高实验的准确性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.. ... .一、题目陨石撞飞机综合性实验二、中文摘要用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}程序结束六、系统测试情况基本完成实验要求,飞机可以键盘响应上下左右移动,撞上陨石有提示并能调出爆炸位图,超过三次碰撞提示游戏结束。