实 训 报 告
飞机大战游戏设计与开发
李效伦
专业名称: 软件工程
班 级: 2010 级 3 班
学 号: 201001050515
信息科学与工程学院
二零一二年十一月
信息科学与工程学院软件实践实训报告
目 录
1. 概述··························································································································· 3
2. 相关技术··················································································································· 4
2.1 Windows 定时器······························································································ 4
2.2 透明贴图实现································································································· 4
2.3 CObList 链表·································································································· 5
2.4 获取矩形区域·································································································· 6
2.5 使用 AfxMessageBox 显示游戏过程中的提示信息······································ 6
2.6 双缓冲技术······································································································ 6
2.7 内存释放·········································································································· 6
2.8 CImageList 处理爆炸效果············································································ 7
2.9 对话框的应用·································································································· 7
3. 总体设计与详细设计······························································································· 7
3.1 系统模块划分································································································· 7
3.2 主要功能模块································································································· 8
3.3 主要类图········································································································· 9
3.4 主程序活动图······························································································· 10
3.5 主要流程图··································································································· 11
4. 编码实现················································································································ 13
4.1 重点的编码实现···························································································· 13
4.1.1 双缓冲的实现······················································································· 13
4.1.2 方向键控制战机··················································································· 14
4.1.3 战机、导弹、敌机、子弹等的绘制原理··········································· 14
4.1.4 游戏再来一次的实现··········································································· 14
4.1.5 随机函数的实现··················································································· 14
4.1.6 碰撞的实现··························································································· 14
4.1.7 绘制游戏动态背景··············································································· 15
4.2 测试用例········································································································ 15
5. 实训中遇到的主要问题及解决方法····································································· 16
6. 实训体会················································································································· 17
2
信息科学与工程学院软件实践实训报告
1. 概述
1.1、飞机大战游戏简介
通过老师的讲解和认证阅读、分析飞机大战游戏产品需求规格说明书,笔者得到了飞机
大战的开发资料如下:飞机大战游戏作为 PC 中一款桌面游戏,界面简洁流畅、游戏方式简
单,玩起来易于上手。面向休闲游戏的玩家,例如家庭、办公室人员等,使用人群广泛。
1.2、飞机大战主要实现的功能
飞机大战游戏实现的主要功能如下:
(1). 游戏开始欢迎界面,按 Enter 键进入游戏。当游戏结束时,出现有线结束画面。
(2). 游戏界面背景特效,星空闪动的背景。
(3). 游戏过程中声音特效,导弹碰到敌机,子弹碰到战机,战机碰到敌机等都会有相
应的声音提示。
(4). 游戏过程中的文字提示,时刻显示战机当前的生命值、玩家得分等信息。
(5). 玩家通过键盘控制方向键控制战机的位置,空格键发射导弹。导弹释放存在间隔,
有一定的运行速度。导弹遇到敌机发生爆炸,敌机被炸毁,导弹消失,玩家得分。由计算机
控制敌机自动向战机发动攻击。
(6). 敌机数量随机,计算机生成敌机时随机选择类别,敌机从游戏区域的上下两端进
入,左右位置随机。炸弹遇到战机时发生爆炸,战机生命值减 1,炸弹消失。当战机的生命
值为 0 时,战机爆炸,游戏结束。
(7). 游戏过程中的暂停、开始功能。按 P 键暂停游戏,按 R 键开始游戏。
(8). 菜单栏中实现“再来一次”游戏,即游戏从新开始。
(9). 菜单栏中实现高分榜的显示。
(10). 在菜单栏中玩家可以自行设置战机、敌机、子弹、导弹的速度值。
(11). 菜单栏中的帮助显示了游戏的基本操作和规则。
(12). 玩家每得 100 分生命值就加 1.
3
信息科学与工程学院软件实践实训报告
(13). 玩家每过一个关卡,难度加大,进入下一关卡的分值要求更高。
(14). 玩家打掉 boss 之后又一定的几率出现道具,玩家吃掉道具后会得分。
2. 相关技术
2.1 Windows 定时器
Windows 定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应
用程序一次。程序将时间间隔告诉 Windows,然后 Windows 给您的程序发送周期性发生的
WM_TIMER 消息以表示时间到了。本程序中使用多个定时器,分别控制不同的功能,比如:
为背景图片的变换设置一个定时器,使两张图片呈现动态变化的效果;为 boss 敌机的出现
设置一个定时器,是 boss 敌机的出现有一定的频率等。
2.2 透明贴图实现
绘制透明位图的关键就是创建一个“掩码”位图(mask bitmap),这个“掩码”位图是
一个单色位图,它是位图中图像的一个单色剪影。
在详细介绍实现过程之前先介绍下所使用的画图函数以及函数参数所代表的功能;整个
绘制过程需要使用到 BitBlt()函数。整个功能的实现过程如下:
(1).创建一张大小与需要绘制图像相同的位图作为“掩码”位图;
(2).将新创建的“掩码”位图存储至掩码位图的设备描述表中;
(3).把位图设备描述表的背景设置成“透明色”,不需要显示的颜色;
(4).复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩码”位图设备描述
表中存放的位图与位图设备描述表中的位图一样;
(5).把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对
话框上;
(6).把“掩码”位图与这个时候对话框相应区域的背景进行逻辑与的操作;
(7).重复步骤 5 的操作,把需要透明绘制的位图与对话框绘图相应区域的背景进行逻
辑异或操作绘制到对话框上;
4
信息科学与工程学院软件实践实训报告
(8).最后把系统的画笔还给系统,删除使用过的 GDIObject,释放非空的指针,最后
把新建的设备描述表也删除。
2.3 CObList 链表
MFC 类库中提供了丰富的 CObList 类的成员函数,此程序主要用到的成员函数如下:
(1).构造函数,为 CObject 指针构造一个空的列表。
(2). GetHead(),访问链表首部,返回列表中的首元素(列表不能为空)。
(3). AddTail(),在列表尾增加一个元素或另一个列表的所有元素。
(4). RemoveAll(),删除列表中所有的元素。
(5). GetNext(),返回列表中尾元素的位置。
(6). GetHeadPosition(),返回列表中首元素的位置。
(7). RemoveAt(),从列表中删除指定位置的元素。
(8). GetCount(),返回列表中的元素数。
下面以敌机的产生为例进行详细的说明:
(1). 首先在 Doc 中定义一个 CObList 链表对象 EnamyList,在 OnTimer 中以一定的时
间间隔产生敌机,产生敌机之后就使用 AddTail()将新产生的敌机添加到 EnamyList 的表尾。
(2).使用 GetCount()检查链表中元素的个数,即敌机的个数,如果敌机的个数过多就
不再产生敌机。
(3). 如果战机没有死,就使用 GetHeadPosition()函数监听 EnamyList 链表中是否有元
素。如果有元素,即 GetHeadPosition()返回值不为空,则返回首元素的位置,并根据位置
使用 GetNext()函数获取链表中的元素。如多没有元素就继续监听。
(4). 接下来,就判断敌机是否跑出界面,若果跑出界面就使用 RemoveAt()函数行链表
中将制定位置的敌机移除掉。
(5). 如果没有出界就活出敌机。并产生子弹。
5
信息科学与工程学院软件实践实训报告
2.4 获取矩形区域
首先,使用 CRect 定义一个对象,然后使用 GetClientRect(&对象名)函数,获取界面
的矩形区域。Width() 为矩形区域的宽度,rc.Height()为矩形区域的高度。
使用 IntersectRect(&,&))函数来判断两个源矩形是否有重合的部分。如果有不为空,
则返回非零值;否则,返回 0。
2.5 使用 AfxMessageBox 显示游戏过程中的提示信息
AfxMessageBox()是模态对话框,你不进行确认时程序是否往下运行时,它会阻塞你当
前的线程,除非你程序是多线程的程序,否则只有等待模态对话框被确认。
在 MFC 中,afxmessagebox 是全局的对话框最安全,也最方便。
2.6 双缓冲技术
双缓冲的实现步骤如下:
(1). 在 View 中创建一个位图对象 CBitmap m_pMemBitmap,并在 IniteGame 中进行初
始化 m_pMemBitmap= (CBitmap) LoadImage();
(2). 在 View 中创建与当前设备兼容的 CDC 对象 CDC m_pMemDC,建立与屏幕显示兼容
的内存显示设备 pMemBitmap.CreateCompatibleDC(NULL);
(3). 用 m_pMemDC.SelectObject()函数将位图对象与设备描述表 DC 绑定,在内存设备
上下文中绘制图像;
(4). 使用 CDC::BitBlt()或者 CDC::StretchBit()从内存 DC 中直接将图片复制到客户
区的设备描述表上,这样效率比较高;
(5). 恢复内存描述表中的原有位图。
2.7 内存释放
在 VC/MFC 用 CDC 绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU 时间占用率相当
高,绘图效率极低,很容易出现程序崩溃。及时的释放程序所占用的内存资源是非常重要的。
在程序中使用到的链表、刷子等占用内存资源的对象都要及时的删除。Delete Brush,
6
信息科学与工程学院软件实践实训报告
List.removeall()等。
2.8 CImageList 处理爆炸效果
爆炸效果是连续的显示一系列的图片。如果把每一张图片都显示出来的话,占用的时间
是非常多的,必然后导致程序的可行性下降。CImageList 是一个“图象列表”是相同大小
图象的集合,每个图象都可由其基于零的索引来参考。可以用来存放爆炸效果的一张图片,
使用 Draw()函数来绘制在某拖拉操作中正被拖动的图象,即可连续绘制出多张图片做成的
爆炸效果。
2.9 对话框的应用
在设置游戏难度、炸弹的速度等,使用对话框进行设置非常方便,又体现出界面的友
好。
对话框的应用过程如下:
(1). 资源视图下,添加 Dialog 对话框。然后添加使用到的控件,并修改控件的 ID 以
便于后面的使用。
(2). 为对话框添加类,在对话框模式下,点击项目,添加类。
(3). 在类视图中,为对话框类添加成员变量(控件变量)。设置变量的名称、类型、
最值等信息。
(4). 在资源视图菜单中,选择相应的菜单项,右击添加时间监听程序,设置函数处理
程序名称。
(5). 在处理程序函数中添加相应的信息。
3. 总体设计与详细设计
3.1 系统模块划分
飞机大战游戏主要分为三个模块:
(1). 游戏规则模块 主要实现游戏对战过程中的一些规则以及玩家的操作方法,比如:
战机与敌机子弹的碰撞、炸弹与敌机的碰撞、炸弹与子弹敌机的碰撞、子弹是否出边界的判
断、炮弹是否出边界的判断、敌机是否出边界的判断等。
(2). 应用程序对象模块 主要实现游戏程序的加载、游戏对象的绘制、游戏规则的调
用、玩家的键盘事件获取(如:玩家通过方向键控制战机、玩家变换子弹等)。
(3). 设置模块 主要实现再来一次、玩家高分榜记录、子弹速度设置、炸弹速度设置、
7
信息科学与工程学院软件实践实训报告
战机速度设置、敌机速度设置、玩家帮助信息等。
3.2 主要功能模块
飞机大战游戏功能模块图如图 1:
图 1:功能模块图
8
飞机大战游戏游戏设置暂停/开始游戏游戏对战再来一次开始游戏炮弹碰撞敌机初始化游戏初始化游戏子弹速度敌机速度炮弹速度战机速度开始游戏暂停游戏战机碰撞敌机战机生命值减1增加生命值进入下一关战机生命值减1随即产生馒头高分榜查看游戏规则随机产生boss难度增加通关播放音乐敌机爆炸玩家得分爆炸音乐背景变换产生敌机产生战机开始游戏恢复游戏音乐停止开始游戏玩家得分初始游戏