飞机大战实训报告.docx
- 文档编号:6603247
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:15
- 大小:373.51KB
飞机大战实训报告.docx
《飞机大战实训报告.docx》由会员分享,可在线阅读,更多相关《飞机大战实训报告.docx(15页珍藏版)》请在冰豆网上搜索。
飞机大战实训报告
程序设计综合实践
实习报告
学院名称
信息科学与工程学院
专业班级
软件工程2012-3
学生姓名
程大川
学号
1002
指导教师
孙红梅
山东科技大学
一、实习题目:
飞机大战游戏的设计与实现
二、实习时刻:
7周~8周实习地址:
J13-128 三、实习任务:
1.大体功能要求:
飞机大战游戏必需运用透明贴图、按键处置、按时操纵、双缓冲技术等技术实现战机(玩家)和敌机(运算机)对战功能
2.扩展功能:
在完成大体功能基础上能够增加双人对战、游戏积分制、声音成效、多种子弹类型、客机类型、游戏关卡设计、多种类型敌机、游戏中间结果存贮等功能
四、小组分工说明:
这次实习项目,所有内容均由一人完成
五、实习成绩
六、指导教师对实习的评语:
指导教师(签章):
2021年月日
1.概述
实训概述
这次实训,目的以Window7+VS2021为环境,编写一个简单的飞机大战游戏,熟悉软件工程的思想,学习MFC编程的方式,加深对面向对象思想的明白得
功能概述
用户能够左右移动操纵战机和发射子弹,子弹命中敌机遇造成损害,敌机被击毁能够取得积分,积分达到必然程度会显现BOSS,BOSS被击杀后即可进行下一关。
游戏中会不按期显现道具包,吃取不同的道具包会有不同的增益成效。
2.相关技术
本项目涉及的几个要紧技术介绍和简要实现方式如下:
转动背景技术
为了让游戏场景加倍传神,游戏节拍加倍合理,能够通过让背景转动来提高游戏的场景效应,实现这一技术时,能够将一张背景图片复制为三张,从上到下持续的拼接在一路,并将中间的图片进行垂直翻转,在输出图像时,每次只输出合成后图片的1/3部份,每次输出后,将位图中的纵坐标输出位置增加一个位移量,当输出位置抵达图片的2/3部份时,将图片的纵坐标输出位置置为0,由于图片的起始位置和图片的2/3位置是一致,因此在背景图片的显示中,可不能显现图片的卡顿和瞬移现象。
透明贴图技术
在飞机大战项目中,需要将很多的BMP图像贴到画布上,结合逻辑处置完成对整个游戏的设计,为了实现更好的显示成效,使移动元素所用的图像加倍贴合背景,那么需要利用透明贴图技术,将BMP图像中的无关颜色做透明处置,实现方式为挪用CDC中的TransparentBlt函数,而且利用函数的最后一个参数填写RGB信息,实现对对应颜色的透明化。
按时器技术
为了实现屏幕的按时刷新功能和暂停功能,需要设置按时器,当设置好时刻距离时,每次通过一个设置的时刻距离,Windows都会向程序发送一个WM_TIMER,而且挪用相关函数,程序执行OnTimer函数,并依照按时器编号执行相应的操作。
实现方式为利用SetTimer函数设置按时器标识和时刻距离。
另外也能够利用按时器实现对持续按键的处置,使子弹发射和移动成效加倍滑腻合理。
双缓冲技术
利用一般的绘制函数对项目中元素进行画图时,由于画图机会不必然持续,画图效率不必然统一,会造成重影和闪屏的不良成效,为了解决这一问题,能够利用双缓冲技术,先将要绘制的每部份内容存储到内存中的一个虚拟的画图设备中,当所有部份的内容都绘制完毕后,再一次性的将内存中的内容绘制到真实屏幕上,实现这一方式,能够在程序概念一个CDC指针变量和CBitmap指针向量实现,在构造函数中为两个指针分派内存空间,将所有的图像绘制完毕后,再利用GetDC函数取得真实窗口CDC指针和BitBlt函数将内存中的内容完整的拷贝至真实屏幕上。
持续按键处置技术
在飞机大战项目中,需要依照键盘输入决定游戏中各类位置的改变和一些变量的内容,在利用战机发射子弹或进行移动时,需要按下键盘的空格键或方向键,在该项目中,若是利用MFC中提供的默许消息处置函数进行按键消息的处置,那么会致使子弹发射频率过快,战机移动过快,乃至程序卡死等严峻问题,因此应将按键消息处置放在OnTimer函数里,以达到滑腻的移动和发射子弹成效
碰撞处置技术
在该项目中,需要处置对象之间的各类碰撞,比如,战机子弹与敌机的碰撞、敌机子弹与战机的碰撞、敌机与战机的碰撞、子弹与客机的碰撞等等。
在处置碰撞时,能够为每一个对象设置一个与位图大小相同的矩形,矩形的位置与对应位图所在位置一直,当判定两个元素是不是发生了碰撞时,只需要利用IntersectRect函数判定两个矩形是不是相交即可。
链表存储技术
一局游戏中会有很多的敌机,敌机子弹和战机子弹,而且需要其进行添加、删除、遍历等操作,为了提高程序执行效率,选用链表存储这些类型,当需要生产一个敌机或敌机子弹时,只需要在链表尾部添加一个对应的对象即可,时刻复杂度为O
(1),当敌机被击毁或子弹失效时,只需要在链表中将对应位置的对象删除即可,时刻复杂度为O
(1),当画图时,需要对所有的对象进行遍历,现在只需要从头至尾遍历一个链表即可,时刻复杂度为O(n),所有的复杂度已是最低,因此利用CList链表存储项目各类对象,是一个超级合理的选择。
动态成效技术
在敌机被击毁时,需要显示敌机爆炸的画面,那个动态的画面是由一组静态图像持续绘制形成的,为了实现这一成效,能够利用MFC中的CImageList类,将一组由静态图像组成的持续位图依照必然格式转化为CImageList对象,并为每一个对象设置一个index,在敌机生命值为0时,依照index逐帧播放图像,实现敌机爆炸的动态成效。
3.需求分析
功能需求分析
●飞机大战项目需要实现的要紧功能如下:
●战机在用户的操纵下能够自由移动,但不能够移动到窗体外。
●战性能够持续发射子弹,子弹的起始位置和战机位置有关。
●敌机在窗口顶部随机产生,产生后垂直向下移动。
●敌性能够发射子弹,每一个敌机在一个发射时刻能够发射两枚子弹。
●客机在窗口顶部随机产生,产生后由极慢的速度向下移动。
●客机的大小十分庞大,远大于敌机和战机
●战机子弹由战机产生,垂直向上飞行,而且能够击中敌机和客机
●敌机子弹由敌机产生,垂直向下飞行,而且能够击中战机和客机
●游戏中会不按期显现道具包,飞机通过道具包会显现不同的成效
●击毁敌性能够取得必然的得分,得分抵达必然数量会显现BOSS
●BOSS产生于顶部,可不能向下移动,会被子弹击中,击毁后可通过关卡。
●通过关卡后会使游戏难度增加,通过所有关卡会通关,完成游戏。
数据需求分析
飞机大战项目中所需要的数据有
类型
数据
战机
战机位置,战机生命值,战机伤害值
敌机
敌机位置,敌机生命值,敌机伤害值,敌机的生成速度,敌机的移动速度
战机子弹
子弹位置,子弹发射相应速度,子弹移动速度,子弹伤害值
敌机子弹
子弹位置,子弹发射生成速度,子弹移动速度,子弹伤害值
道具包
道具包类型,道具包位置,道具包移动速度
BOSS
BOSS位置,BOSS伤害,BOSS生命值
关卡
关卡编号,关卡难度,得分
行为需求分析
飞机大战项目中的行为能够用下面的用例图表示
其他需求
背景能够转动
4.整体设计与详细设计
(介绍游戏的功能模块划分,要紧类图、状态图、活动图或顺序图)
系统模块划分
要紧功能模块
4.2.1玩家操纵模块设计图
4.2.2游戏逻辑模块设计图(包括关卡操纵)
4.2.3图形显示模块设计(包括敌方生成模块)
要紧类图
软件结构设计体会
软件结构设计部份是软件工程开发进程的重要部份,设计内容的好坏关系到整个软件的好坏,在这次飞机大战项目开发中,对结构设计中显现的各类问题和解决方式,加深了对软件结构设计方式的明白得,熟悉了对其的应用,从系统功能模块设计到要紧功能设计,从类图到状态图,都是着软件开发的每一个步骤,从宏观和细节处展现了整个软件的体系结构,使整个软件更有层次感。
5.编码实现
编码标准
●在这次飞机大战设计开发项目中,涉及到的编码标准要紧包括
●类、对象、变量、常量、函数的名称含义准确不臃肿
●类的命名必需以C开头。
●类的名称中的单词首字母大写。
●变量名称中的单词首字母大写。
●函数名称中的单词首字母大写
●对象、变量、常量的概念尽可能概念在CPaperPlaneDoc里。
●函数概念在CPaperPlaneView里。
●对不易明白得的部份进行注释
代码组织策略
以MFC代码标准组织方式为主。
关键技术代码实现
5.3.1双缓冲的实现
CDC*pMemDC;
CBitmap*pBitmap;
CPaperPlaneView:
:
CPaperPlaneView()
{
5.3.25.3.35.3.45.3.5eFired(list);
}
return0;
}
voidCPaperPlaneView:
:
FireInBoss(CList
{
CPaperPlaneDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)return;
(list);
if<=0)
pDoc->PlaneScore=pDoc->PassBase*100*(3*pDoc->NowLevel-2);
return;
}
intCPaperPlaneView:
:
WaterInPlane(CList
{
POSITIONps2,pos=();
while(pos!
=NULL){
ps2=pos;
if(pos)))
(ps2);
}
return0;
}
intCPaperPlaneView:
:
CloudInPlane(CPlane&plane,CList
{
POSITIONpos=();
while(pos!
=NULL){
CCloud&tmp=(pos);
CRectplaneRect1,planeRect2,cloudRect,temRect;
+CPoint(10,10),+CPoint(60,30));
+CPoint(0,30),+CPoint(70,80));
+CPoint(80,50));
if>0&&>0&&(cloudRect,planeRect1)||(cloudRect,planeRect2))){
-=;
-=;
return1;
}
}
return0;
}
5.3.6链表遍历
intCPaperPlaneView:
:
FireInCloud(CList
{
CPaperPlaneDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)return0;
POSITIONpos=();
while(pos!
=NULL){
pDoc->PlaneScore+=(pos).beFired(list);
}
return0;
}
5.3.7关卡设置
voidCPaperPlaneView:
:
SetLevel(intnLevel)
{
CPaperPlaneDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)return;
switch(nLevel)
{
case1:
CPlane:
:
PlaneLife=6;
CPlane:
:
PlaneDamage=1;
CPlane:
:
PlaneBitmapNum=IDB_PLANE1;
CCloud:
:
CloudBitmapNum=IDB_CLOUD1;
CCloud:
:
CloudBoommapNum=IDB_CLOUDBOOM1;
CCloud:
:
CloudLife=1;
CCloud:
:
CloudDamage=1;
CCloud:
:
CloudMakeSpeed=1;
CCloud:
:
CloudMoveSpeed=2;
CFire:
:
FireMakeSpeed=6;5.3.8
实训中碰到的要紧问题及解决方式
这次实训中碰到了以下几个问题
(1)在开发初期,屏幕一直闪烁,图片显示不流畅,常常有卡屏现象
解决方式:
设置双缓冲,先将要绘制的每部份内容存储到内存中的一个虚拟的画图设备中,当所有部份的内容都绘制完毕后,再一次性的将内存中的内容绘制到真实屏幕上,实现这一方式,能够在程序概念一个CDC指针变量和CBitmap指针向量实现,在构造函数中为两个指针分派内存空间,将所有的图像绘制完毕后,再利用GetDC函数取得真实窗口CDC指针和BitBlt函数将内存中的内容完整的拷贝至真实屏幕上,现在将显示变得很流畅
(2)在编写按键处置模块中,子弹的发射速度过快,并常常会因为发射子弹致使程序崩溃
解决方式:
将键盘信息处置函数设置在OnTimer函数里,使程序接收按键信息的频率降低,使战机子弹的发射速度加倍滑腻
8.实训收成与体会
通过这次实训,学习了MFC编程的大体思想,加深了对软件工程的明白得,熟悉了对软件工程的应用,而且对面向对象的思想和方式加倍熟悉。
在这次实训中,学习了透明贴图,转动背景,利用按时器处置消息,利用双缓冲解决卡屏等技术,相信这些细节在以后的编程之路上都会用到。
通过这次实训,也让我熟悉到态度关于工作和学习的重要性。
总之,这次实训给咱们带来的收成颇丰。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 飞机 大战 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)