飞机大战实训报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1程序设计综合实践报告姓名学号班级项目名称飞机大战实习地点实习时间11.22—12.4实习成绩指导教师签字信息科学与工程学院2015年12月04日2目录1概述··························32相关技术························33需求分析························73.1功能需求分析·····················73.2数据需求分析·····················83.3行为需求分析·····················83.4其他需求·······················94总体设计与详细设计···················104.1系统模块划分·····················104.2主要功能模块·····················104.3扩展功能设计思路···················124.4软件结构设计体会···················135编码实现························136测试情况说明······················196.1战机移动及子弹发射模块测试···············196.2爆炸模块测试·····················197.实训中遇到的主要问题及解决方法············208.实训收获与体会····················219.济南参观体会·····················2131.概述这次实训主要做的项目是飞机大战,主要实现的功能包括:战机敌机BOSS可以发射导弹,其中战机发射导弹通过键盘上的空格键发射,敌机的导弹通过判断与战机的距离来自动发射,BOSS的导弹是一直产生的,对战机进行扫射。战机导弹与敌机相撞,战机与敌机相撞,敌机导弹与战机相撞,战机导弹与BOSS相撞,战机与BOSS相撞都能实现爆炸效果。战机通过方向键控制自由移动且不飞出程序边界,战机具有一定的初始左右上下移动的速度,玩家可以设置战机的速度控制战机的移动。敌机可根据随机函数随机产生,且屏幕的上下方飞入,大Boss可以随着战机移动,或者是实现自己的移动,客机从屏幕的右方向左移动,客机上载着小人,战机攻打客机可以打死小人,小人将从客机上坠落。战机具有吃生命值的功能,游戏过程中会随机往下掉落生命值,战机吃了之后,生命值会上升。战机具有一定的大招,使用大招时战机可以发射导弹,但是其他的不能来攻打战机,战机可以通过使用大招来进行破关。游戏背景可以移动,这样战机相对于背景来说是相对运动的,结束界面包括游戏胜利的界面和失败的界面。游戏有各个关卡的划分,实现达到一定的条件可以实现升级,最后到达一定程度游戏结束。添加游戏的无敌模式,即战机具有无限的生命打不死,可以持续玩。添加游戏gameover之后可以按键重玩的功能。在游戏界面输出当前游戏进行信息,包括当前得分、战机生命值、敌机生命值、大Boss的生命值、当前关卡,以及当前的游戏模式。2.相关技术2.1定时器的使用Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。本程序中使用多个定时器,分别控制不同的功能。在MFC的API函数中使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。同时使用完成后要在OnDestroy中使用KillTimer()将定时器进行删除,否则会有内存的泄露导致程序运行时速度会越来越慢在OnInitialUpdate()函数中设置this-SetTimer(10,100,0);//背景图片的产生在OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)函数中设置this-SetTimer(1,10,0);//飞机的//飞机导弹的//客机的移动4this-SetTimer(2,60,0);//敌机的产生//敌机的移动,敌机与战机挨近时敌机产生炸弹//BOSS的产生//敌机的导弹this-SetTimer(3,50,0);//敌机与战机爆炸//生命值与战机相撞//战机与飞机导弹相撞爆炸//BOSS与飞机导弹相撞//敌机的导弹与战机相撞this-SetTimer(4,100,0);//生命值的产生//生命值的移动//BOSS导弹的移动2.2双缓冲技术双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。CBitmapMemBitmap;CDCMemDC;//在view中定义一个位图对象在view中定义的CDC*pDC都可以用&hMemDC来进行替换添加WM_ERASEBKGND响应函数,并清除响应函数BOOLOnEraseBkgnd(CDC*pDC){//returnCDialog::OnEraseBkgnd(pDC);returnFALSE;}在绘图完成后的清理MemBitmap.DeleteObject();MemDC.DeleteDC();2.3获取窗口大小利用this-GetClientRect(&rect1);函数取得屏幕窗口的大小,这样在程序运行时窗口才会正常的尺寸,否则战机可以处于窗口的外面,两一方面设置战机移动的条件限制战机使其不能一处当前窗口尺寸的范围,通过比较当前战机的位置与屏幕的位置进行比较CRectrect;CPlanepl1;满足pl1.pos.y=rect1.top战机才可以向上移动pl1.pos.y=rect1.Height()-战机的高度战机才可以向下移动pl1.pos.x=rect1.left战机才可以往左移动pl1.pos.x=rect1.Width()-战机的宽度战机才可以往右移动52.4透明贴图技术透明贴图并不是真正意义上的透明,而是图像不需要显示的部分显示出的颜色是当前对话框的背景色,也就是说把图像不需要显示的颜色当成背景色,显示的部分作为前景色,透明就是把背景换成对话框背景。绘制透明位图是指在绘制位图时只绘制除了指定颜色外的其余部分,而指定的颜色就被称为“透明色”。通过将位图的背景色指定成“透明色”,在绘制时不绘制带“透明色”的这部分背景,仅绘制图像,这样就可以将图像透明地绘制到窗口上。先在PS中或者是其他的可以进行抠图的软件中将所需要的图片抠出来,在资源视图中添加上然后图片展示时使用BOOLBitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,DWORDdwRop);来进行确认图片的位置将图片的背景色改成透明色,或者是利用TransparentBlt(intx,inty,intnWidth,intnHeight,&memDC,0,0,intnWidth,intnHeight,RGB(0,0,0));来进行实现。TransparentBlt()函数从指定源设备上下文中的矩形区域中像素的色彩信息转化为目标设备上下文中。TransparentBlt()函数在Windows98/Windows2000以上版本运行,系统中需要包含Msimg32.dll,使用时可以链接Msimg32.lib。消除图片背景还可以CImageList类中的Draw()函数,该函数最后一个参数设置为ILD_TRANSPARENT,这样就可以在绘制图片时轻松消去图片背景。2.5MFC类库的使用MFC,是一个微软公司提供的类库,以c++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。在界面开发方面,MFC提供对消息循环的封装,使用消息映射来避免虚函数的开销。MFC也提供常用WINDOWS通用控件的封装类。MFC的主要优点是可以用面向对象的方法来调用WindowsAPI,以及应用程序开发的边界。MFC将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。同时,在VisualC++内部也内建了很多对MFC的例如类向导这样的支持以减少软件开发的时间,使用类向导可以生成从HelloWorld这样的简单程序到活动文档这样的复杂程序。MFC的消息映射机制也避免了使用性能较低的庞大虚函数表。在本程序主要使用了Object类。62.6COblist链表MFC类库中提供了丰富的CObList类的成员函数,此程序主要用到的成员函数如下:(1)构造函数,为CObject指针构造一个空的列表。(2)AddHead()在列表头添加一个或一列新元素。在操作前该列表可以为空。返回新插入元素的POSITION值。(3)GetHead(),访问链表首部,返回列表中的首元素(列表不能为空)。(4)GetNext(),返回列表中尾元素的位置。(5)GetHeadPosition(),返回列表中首元素的位置。返回用于循环或使用对象指针获取的POSITION值,如果列表为空,那么返回NULL。(6)RemoveAt(),从列表中删除指定位置的元素。(7)RemoveAll(),删除列表中所有的元素。2.7CImageList链表CImageList类提供Windows普通图象列表控件的功能。CImageList主要是用于设置两个爆炸的类中,主要使用的函数如下:(1)Create()如果成功,则返回非零值,否则为0。需要两步构造一个CImageList。首先调用构造函数,然后调用Create,创建图象列表并附加给CImageList对象。(2)Add()如果成功,则为第一个新图象的基于零的索引,否则为-1。调用此函数来添加一个或多个图象或图标到图象列表中。(3)Draw(CDC*pdc,intnImage,POINTpt,UINTnStyle);返回值:如果成功,则返回非零值,否则为0。说明:调用此函数绘制在拖放操作中正在被拖动的图象。2.8CRect获得矩形区域IntersertRect(LPCRECTlpRect1,LPCRECTlpRect2);此函数使CRect等于两个现有矩形的交。交是同时包含在两个现有矩形中的最大矩形,如果两个源矩形是否有重合的部分。如果有不为空,则返回非零值;否则,返回02.9添加背景实现当前游戏界面背景的动态化添加了一个Beijing的类,所有的图片都放在这个类中,包括游戏的开始图片,结束图片,gameover的图片以及胜利的图片,在使用时调用这个类中的各类draw函数boolCBeijing::drawbj(CDC*pDC,CRectrect)7boolCBeijing::drawksbj(CDC*pDC,CRectrect)boolCBeijing::drawjsbj(CDC*pDC,CRectrect)boolCBeijing::drawwin(CDC*pDC,CRectrect)2.10静态数据成员的使用静态数据成员的使用,同时要进行声明如在CEnemy类中staticCImageListimglist;staticboolloadimage(void);声明CImageListCEnemy::imglist;2.11程序运行窗口添加对话列表设置速度在资源视图中插入Dialog在工具箱中添加所有的输入框,在Menu菜单中设置,利用右键中的添加事件处理程序进行添加编辑,消息类型是command类列表选择view类3.需求分析(用面向对象方法给出系统的主要需求模型,略写)3.1功能需求分析1、战机可根据方向键控制自由移动且不飞出程序边

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功