飞机大战实践设计报告.docx
《飞机大战实践设计报告.docx》由会员分享,可在线阅读,更多相关《飞机大战实践设计报告.docx(37页珍藏版)》请在冰豆网上搜索。
![飞机大战实践设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/16/080fac2a-eed0-470b-ab43-40c2db607ddd/080fac2a-eed0-470b-ab43-40c2db607ddd1.gif)
飞机大战实践设计报告
程序设计综合实践报告
姓名
林宇强
学号
201301050415
班级
计算机科学与技术2013-4班
项目名称
飞机大战游戏设计与实现
实习地点
计算机实验室
实习时间
2015-12-9至2015-12-19
实习成绩
指导教师签字
信息科学与工程学院
2015年12月20日
1.概述
1.1项目简介
本次实训项目是做一个飞机大战的游戏,应用MFC编程,完成一个界面简洁流畅、游戏方式简单,玩起来易于上手的桌面游戏。
该飞机大战项目运用的主要技术即是MFC编程中的一些函数、链表思想以及贴图技术。
1.2实训功能说明
1.2.1基本功能
(1)通过键盘,方向键和ASWD键可控制战机的位置,空格键和鼠标左键发射子弹。
(2)界面中敌机出现的位置,以及敌机和Boss炸弹的发射均为随机的,敌机与敌机炸弹、Boss炸弹均具有一定的速度,且随着关卡难度的增大,数量和速度均随着关卡数增加而增加。
(3)对于随机产生的敌机和敌机炸弹,若超过矩形区域,则释放该对象。
(4)添加碰撞效果,包括战机子弹打中敌机爆炸、敌机炸弹打中战机爆炸、战机与敌机相撞爆炸、战机子弹与敌机炸弹相撞爆炸、战机子弹打中Boss、战机与Boss碰撞以及战机吃到血包七种碰撞效果。
且碰撞发生后子弹、炸弹、血包均消失,战机生命值减一,敌机和Boss生命值减少当前战机炮弹威力的生命值,若敌机或Boss生命值归零,则删除敌机或Boss。
(5)血包:
随着关卡游戏进程的进行,会出现一定量的血包供战机补给生命值,血包会在客户区矩形框内运动,10秒后消失;若战机在10秒内吃到血包,则会增加5点生命值知道生命值上限。
(6)每关中战机有三条命,每条命10点生命值,生命使用完后,会进入GameOver界面显示得分数,并提供重新开始游戏和退出功能。
(7)游戏提供10个关卡,每个关卡需要打死相应关卡的敌机数量才能进入Boss模式,打败Boss之后将会进入下一关。
10关通关后,显示通关界面,并提供重新开始游戏和退出游戏的功能选项。
(8)暂停功能:
游戏进行过程中按下Z键可进入暂停模式,再按Z则返回游戏。
(9)无敌模式:
游戏进行过程中按下Y键可进入无敌模式,再按Y则返回正常游戏。
该模式下战机生命值不会减少,可供测试使用。
(10)魔法值:
游戏进行过程中,战机魔法值会随着时间递增到上限10,魔法值供战机道具功能的使用,过一个关卡魔法值不清零。
(11)战机大招:
当战机魔法值为10满状态时,按下X键消耗所有魔法值可发动大招,对屏幕中的敌机进行清屏,Boss扣50点血量。
(12)防护罩:
当魔法值不为0时,按下C键可打开防护罩道具,该状态下战机处于无敌状态,不会损失生命值,但魔法值会随着防护罩开启慢慢降低。
(13)战机升级功能:
战机子弹单个威力为1,在魔法值不为0时,按下V键开启升级战机模式,战机图标变为动画,子弹威力变成两倍。
(若同时开启防护罩和战机升级,则魔法值递减速度翻倍)。
1.2.2附加功能
(1)为游戏界面每个关卡添加了滚动背景图片和背景音乐,并在敌机发送炮弹、战机发射子弹、战机击中敌机、敌机击中战机、战机敌机相撞、敌机战机子弹相撞、战机吃到血包、战机大招、战机升级、战机防护罩、游戏结束时均添加了音效。
(2)为美化游戏界面,采用了一部分全民飞机大战图标,并添加了爆炸动画和升级战机动画特效,背景音乐采用微信飞机大战背景音乐和相关特效音效。
(3)为游戏设置了不同的关卡,每个关卡难度不同,敌机与敌机炸弹的速度随着关卡增大而加快,进入第五关以后敌机从上下方均会随机出现,且随机发射炸弹。
(4)前五关卡敌机从上方飞出,速度一定,战机每打掉一架敌机则增加一分,当战机得分超过该关卡所需分数(和关卡数相关)则可进入Boss模式,打败Boss进入下一关;进入第六关以后,敌机分别从上下两方飞出。
随着关卡数增加,敌机数量增加,速度增快,敌机炮弹数量和速度也相应增加,进入Boss所需分数增加,Boss生命值和火力也随着关卡数的增加而增加,游戏难度陡然直升。
(5)游戏界面中显示当前状态下的关卡数、当前命数、当前得分、战机血条、战机魔法条、无敌模式提醒和战机道具提醒,Boss模式下还有Boss血条。
(6)增加了鼠标控制战机位置这一效果,战绩的位置随着鼠标的移动而移动,并且点击鼠标左键可使得战机发射子弹。
(7)进入游戏先进入欢迎界面,欢迎界面中显示游戏使用说明,点击鼠标左键和空格键开始游戏。
游戏过程中战机命数使用完、通关均有相应界面进行提醒,用户可选择重新开始游戏或退出游戏。
2.相关技术
2.1Windows定时器技术
Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。
程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。
本程序中使用多个定时器,分别控制不同的功能。
在MFC的API函数中使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。
2.2透明贴图实现技术
绘制透明位图的关键就是创建一个“掩码”位图(maskbitmap),这个“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。
在详细介绍实现过程之前先介绍下所使用的画图函数以及函数参数所代表的功能;整个绘制过程需要使用到BitBlt()函数。
整个功能的实现过程如下:
(1)创建一张大小与需要绘制图像相同的位图作为“掩码”位图;
(2)将新创建的“掩码”位图存储至掩码位图的设备描述表中;
(3)把位图设备描述表的背景设置成“透明色”,不需要显示的颜色;
(4)复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩码”位图设备描述表中存放的位图与位图设备描述表中的位图一样;
(5)把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对话框上;
(6)把“掩码”位图与这个时候对话框相应区域的背景进行逻辑与的操作;
(7)重复步骤5的操作,把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对话框上;
(8)最后把系统的画笔还给系统,删除使用过的GDIObject,释放非空的指针,最后把新建的设备描述表也删除。
2.3CObList链表
MFC类库中提供了丰富的CObList类的成员函数,此程序主要用到的成员函数如下:
(1)构造函数,为CObject指针构造一个空的列表。
(2)GetHead(),访问链表首部,返回列表中的首元素(列表不能为空)。
(3)AddTail(),在列表尾增加一个元素或另一个列表的所有元素。
(4)RemoveAll(),删除列表中所有的元素。
(5)GetNext(),返回列表中尾元素的位置。
(6)GetHeadPosition(),返回列表中首元素的位置。
(7)RemoveAt(),从列表中删除指定位置的元素。
(8)GetCount(),返回列表中的元素数。
在CPlaneGameView.h文件中声明各游戏对象与游戏对象链表:
(1)滚动背景模块
CScenescene;//游戏背景对象
CImageListstartIMG;欢迎界面图像列表
(2)各游戏对象
CMyPlane*myplane;
CEnemy*enemy;
CBoss*boss;
CBomb*bomb;
CBall*ball;
CExplosion*explosion;
CBlood*blood;
(3)存储游戏对象的对象链表
CObListenemyList;
CObListmeList;
CObListbombList;
CObListballList;
CObListexplosionList;
CObListbloodList;
(4)客户区窗口矩形(用来动态获取客户区矩形大小)
CRectrect;//窗口屏幕矩形
(5)游戏运行相关参数:
intspeed;//战机的速度,方向键控制
intmyLife;//为战机设置生命值
intlifeNum;//战机命条数
intmyScore;//战机的得分
intpassScore;//当前关卡得分数
intlifeCount;//血包产生控制参数
intmagicCount;//魔法值,控制能否发大招
intbossBlood;//Boss血量
intpassNum;//记录当前关卡
(6)游戏运行相关标志位
BOOLbloodExist;//标记屏幕中是否存在血包
intisPass;//是否通关的标志
intisPause;//是否暂停
BOOLisBoss;//标记是否进入Boss
BOOLbossLoaded;//标记Boss出场完成
BOOLisProtect;//标记是否开启防护罩
BOOLisUpdate;//标记战机是否升级
BOOLtest;//无敌模式标志位
BOOLisStop;//标记游戏停止
BOOLisStarted;//标记欢迎界面是否加载完成
2.4获取矩形区域
首先,使用CRect定义一个对象,然后使用GetClientRect(&对象名)函数,获取界面的矩形区域rect.Width()为矩形区域的宽度,rect.Height()为矩形区域的高度。
使用IntersectRect(&,&))函数来判断两个源矩形是否有重合的部分。
如果有不为空,则返回非零值;否则,返回0。
2.5内存释放
在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃。
及时的释放程序所占用的内存资源是非常重要的。
在程序中使用到的链表、刷子等占用内存资源的对象都要及时的删除。
DeleteBrush,List.removeall()等。
2.6CImageList处理爆炸效果
爆炸效果是连续的显示一系列的图片。
如果把每一张图片都显示出来的话,占用的时间是非常多的,必然后导致程序的可行性下降。
CImageList是一个“图象列表”是相同大小图象的集合,每个图象都可由其基于零的索引来参考。
可以用来存放爆炸效果的一张图片,使用Draw()函数来绘制在某拖拉操作中正被拖动的图象,即可通过Timer消息连续绘制出多张图片做成的爆炸效果。
3.总体设计与详细设计
3.1系统模块划分
该飞机大战游戏程序分为游戏滚动背景绘制模块、各游戏对象绘制模块、游戏对象之间的碰撞模块、爆炸效果产生模块、游戏界面输出玩家得分关卡信息模块、战机道具技能维护模块、消息处理模块、视图生命周期维护模块。
其中在游戏对象绘制模块中,战机是唯一对象,在游戏开始时产生该对象,赋予其固定的生命值,当其与敌机对象、敌机炸弹碰撞时使其生命值减一,直至生命值为零,便删除战机对象。
敌机对象与敌机炸弹对象的绘制中采用定时器技术,定时产生。
爆炸对象初始化为空,当游戏过程中即时发生碰撞时,在碰撞位置产生爆炸对象,添加到爆炸链表中,并根据爆炸素材图像分八帧进行输出,达到动画特效。
3.2主要功能模块
3.2.1系统对象类图
CGameObject是各个游戏对象的抽象父类,继承自CObject类,其他的类:
战机类、敌机类、爆炸类、子弹类、炸弹类、血包类、文字类都继承了此类,CBoss类继承敌机类。
每个游戏对象类中既继承了来自父类CGameObject的属性,又有自己的特有属性和方法。
3.2.2系统主程序活动图
3.2.3系统部分流程图
(