基于VC的飞行模拟游戏的方案设计书及实现.docx
《基于VC的飞行模拟游戏的方案设计书及实现.docx》由会员分享,可在线阅读,更多相关《基于VC的飞行模拟游戏的方案设计书及实现.docx(25页珍藏版)》请在冰豆网上搜索。
基于VC的飞行模拟游戏的方案设计书及实现
摘要
电子游戏的出现代表了一种全新娱乐方式的诞生。
目前,电子游戏正以其独特的魅力吸引着众多的玩家。
随着游戏产业的蓬勃发展,越来越多的人加入到了游戏开发的行业。
游戏开发涵盖了程序设计、文学、历史、音乐及美术等诸多方面的内容,除去市场价值的意义,电子游戏的发展的必要性还在于对我国文化产业的发展的重要性,游戏作为一种特殊的创意文化产品形态,是文化产业链中不可缺少的一环。
设计在利用已有的开发包和已有的游戏框架的基础上,采用MicrosoftVisualC++2005为开发平台,这些开发包和框架已经完美地解决了游戏图像和音效方面的问题,设计的主要工作就是向框架中添加自己所设计的类,用于实现设计所要实现的功能。
在进行类的设计时,运用C++所具有的继承和派生功能,使很大一部分代码能够得到重用,从而实现多态,同时,还要在父类中很好地引入虚函数,为指针能够指向子类的同名成员提供方便,然后利用开发包里的方法来实现游戏背景的显示,最终得到一个在MicrosoftVisualC++2005上运行的飞行模拟游戏,同时在运行时不会出现重大尤其是会令游戏崩溃的BUG。
关键词:
飞行模拟;多态;代码重用
DesignandrealizationofaflightsimulationgamebasedonVC
Abstract
Theappearanceofcomputergamehasrepresentedthenaissanceofatotallynewsortwayofentertainment.Atpresent,thecomputergamehasattractedagreatdealofplayersbyitsuniquecharm.Alongwiththegameindustryflourishing,moreandmorepeoplehasjoinedtheprofessionofgamedevelopment.Gamedevelopmenthascoveredmanycontentsincludingprogramming,literature,history,music,arts,etc.Eliminatethesignificanceofmarketvalue,gamedevelopisquiteimportanttothecultureevolutionofournationtobeaspecialkindofcreativitycultureproduction.Gameisindispensabletothechainofcultureindustry.ThedesignbasedonthedeveloppackageandthegameframewhichalreadyexistusesMicrosoftVisualC++2005tobetheplatform.Thesedeveloppackageandgameframehasraveledouttheproblemwhichrelatetoimageandsoundeffectperfectly.Themaintaskofthedesignistoaddclassesthatplanedbyoneselftothegameframe,toactualizethefunctionwhichthedesignhavetorealize.Whenwecarrythroughtheclassesdesign,usetheinheritandderivefunction,weneedtoenableamajorityofcodecanbereused,aimtoactualizepolymorphism,atthesametime.Itisnecessarytousevirtualfunctioninthebaseclass,tomakepointercanpointtothememberwhichhasthesamenameinthesubclassmoreconvenience,afterwards,utilizethedeveloppackagetorealizethedemonstrationofgamebackground,finallyobtainaflightsimulationgamewhichcanrunonMicrosoftVisualC++2005,andthere’snoseriouslybugsespeciallythatcanmakethegamecrashwhenrunning.
Keywords:
flightsimulation。
polymorphism。
codereuse
论文总页数:
26页
1引言
1.1课题背景
现今,游戏软件已经成为盈利最高的软件之一,而且还在向着复杂化、大型化发展,其中,很多由VisualC++作为开发工具的游戏都取得了巨大的成功,比如暴雪公司的《魔兽争霸》系列和《魔兽世界》,这说明VisualC++开发游戏具有一定的优势。
所以,在VisualC++平台上设计游戏是极为方便的,这也是优势所在。
1.2国内外研究背景
无论是在国内还是国外,游戏编程已经成为了一种时尚,许多程序员都忘我地投入到其中,他们其中有很多人不光是为了盈利,也有很多是纯粹为了兴趣,许多著名的游戏编程员本身就是狂热的游戏玩家,所以,无论是国内还是国外,诞生了很多经典的游戏,其中利用VisualC++作为开发平台的更是不胜枚举,但是由于我国的游戏编程相对于国外起步较晚,所以在很多地方还存在不小的差距,甚至成了很多游戏软件业比较发达的国家的游戏加工厂。
1.3本课题研究的意义
目前,市面上的游戏可以说是层出不穷,并且随着电脑硬件系统的改良,未来的游戏必将更智能化,更艺术化,更人性化,在高性能的硬件设备支持下,游戏的驱动引擎更具威力,控制功能更加完备,给人们带来更丰富的娱乐和体验,好的游戏给人们的生活带来了健康愉快的补充,唯美的艺术享受,潜默的教育功效,时尚的情感陶冶,如果没有足够的优质游戏,那么市场就不免会被粗劣的游戏充斥,可以说,对于青少年来说,谁对游戏编程有着更深入的理解和掌握,谁就掌握着游戏的导向权。
1.4本课题研究的方法
采用MicrosoftVisualC++2005为开发平台,在利用已有的开发包和已有的游戏框架的基础上,这些开发包和框架已经完美地解决了游戏图像和音效方面的问题,设计的主要工作就是添加自己所设计的类,用于实现本设计所要实现的功能,在进行类的设计时,运用C++所具有的继承和派生功能,使很大一部分代码能够得到重用,同时,还要在父类中很好地引入虚函数,为指针能够子类的同名成员提供方便,最后利用开发包里的方法来实现一个游戏背景的显示。
2游戏软件的现状和VC的简况
2.1中国游戏软件的现状
软件产业是当前世界上增长最快的朝阳产业之一,并将成为21世纪推动世界经济发展和社会进步的重要动力。
近年来,主要国家软件业平均以11%以上的增长率快速发展。
据“oecd2000年信息技术展望”报告,1997年,其增长率成员国仅软件包产值就占世界市场份额的94%,达1080亿美元,并自1990年以来年11.2%。
美国是世界上最大的软件生产国,1997年的软件产值为1705.9亿美元,占其当年GDP的2.1%,出口额为155.5亿美元。
日本其次,1998年软件产值约570亿美元,但出口仅为0.82亿美元。
英国列第三,1999年的软件产值为377.46亿美元,占其GDP的1.2%,出口约16.2亿美元。
据对各国软件业发展的轨迹分析,虽然各国的产业规模和出口额相差较大,但其成功的因素可归纳为以下几点:
1.对软件知识产权的严格保护,营造一种谁投资谁受益的良好商业和法治氛围;2.服务到位的融资机构,促进软件成果转化快;3.高素质的软件专业人才,配合制定灵活的技术移民政策;4.具有第一流的大学教育,能够迅速适应市场对人才的需求;5.发达的通信设施;6.长期磨炼的企业家精神;7.巨大的市场需求。
相比于其他国家,我国的软件产业特别是游戏产业起步较晚,在很多地方上都不及一些软件大国,但是近年来我国软件业发展迅速,有关统计数据显示,2001年,软件产业销售收入仅为796亿元,到了2006年年底已经达到4800亿元,5年增长了6倍多。
但与软件产业发达国家相比,差距依然很大,绝大部分市场被国外软件业巨头垄断,国产软件占据的市场份额很少。
在国际市场上,2005年国产软件出口额为35.9亿美元,仅占全球软件市场份额的5.9%。
2.2C++简介
C++语言是在C语言的基础上为支持面向对象的程序设计而研制的通用程序设计语言,它是由AT&T贝尔实验室的BjarneStroustrup博士创建。
研制C++的首要目标是使C++首先是一个更好的C语言,所以根除了C语言中存在的问题,增加了许多新功能。
C++的另一个目标是支持面向对象的程序设计,因此在C++中引入了类的机制。
所研制的这个语言最初被称为“带类的C语言”,1983年取名为C++。
C++语言的标准化工作从1989年开始,于1994年制定了ANSIC++标准草案。
C++的主要特点有两个方面:
全面支持C语言与面向对象。
C++从C语言发展而来,保持了C语言的简洁、高效和在某些操作上沿用了汇编语言指令的特点。
同时,对C语言的类型进行了系统的改革和扩充,堵塞了C语言中的许多漏洞,C++编译提供了更好的类型检查和编译时的分析,能检查出更多的类型错误。
C++改善了C语言的安全性,比C语言更安全。
由于C++保持与C语言兼容,这就使许多代码不经修改就可在C++编译器下通过,用C语言编写的众多库函数和实用软件可方便地移植到C++中。
因此,使用C语言的程序员能很快学会C++,使用C++进行编程。
另外,用C++编写的程序可读性好,代码结构更为合理。
C++的最重要的特点是支持面向对象的程序设计,使用C++编程,编程效率高;由于面向对象的方法更接近人类认识世界的方法,C++对于问题更容易描述,程序更容易理解与维护;C++的模板对库代码的重用提供了支持;C++更有利于大型程序设计。
C++是一种支持多种程序设计方法的语言,提供对过程化和基于对象的程序设计方法的支持。
适合于不同使用开发方法的编程人员。
2.3MicrosoftVisualC++简介
VisualStudio是微软公司推出的开发环境。
是目前最流行的Windows平台应用程序开发环境。
目前已经开发到8.0版本,也就是VisualStudio2005。
在VisualStudio中就有面向Windows开发使用的VisualC++。
VisualC++自诞生以来,一直是Windows环境下最主要的应用开发系统之一。
VisualC++不仅是C++语言的集成开发环境,而且与Win32紧密相连,所以,利用VisualC++开发系统可以完成各种各样的应用程序的开发,从底层软件直到上层直接面向用户的软件。
而且,VisualC++强大的调试功能也为大型复杂软件的开发提供了有效的排错手段。
进入21世纪以来,随着多媒体技术和图像技术的不断发展,可视化技术得到广泛的重视,越来越多的计算机专业人员和非专业人员都开始研究并应用可视化技术。
所谓可视化技术,一般是指软件开发阶段的可视化和对计算机图形技术和方法的应用。
VisualC++是一个很好的可视化编程工具,使用VisualC++环境来开发基于Windows的应用程序大大缩短了开发时间,而且它的界面更友好,便于程序员操作。
2.4利用VisualC++开发游戏简介
进入上个世纪90年代以来,游戏开发进入了可视化阶段,并且VisualC++是首选的开发工具,在此期间,诞生了许多用VisualC++开发的经典游戏,比如任天堂公司FamilyComputer主机上的《小蜜蜂》以及大名鼎鼎的《星际争霸》,这些游戏不仅在当时取得了巨大的成功,而且到现在也被奉为经典。
可以说在这个时期,VisualC++在游戏开发领域是独领风骚。
进入了新千年,JAVA语言开始崛起,由于JAVA具有较高的可移植性,许多游戏,特别是很多手机游戏都转向了JAVA平台,但是纵观市面上最火的单机游戏《魔兽争霸3》和最火的网络游戏《魔兽世界》,都清一色的是用VisualC++开发的,这说明就算在新时期的游戏开发中,利用VisualC++作为开发平台还是具有一定优势的。
3开发环境介绍
3.1开发环境
操作系统:
MicrosoftWindowsXP
程序语言:
C++
开发平台:
VisualC++2005
开发工具:
Allegro
3.2关于Allegro
Allegro是一个免费为C和C++的开发人员提供的一个游戏编程库,它支持以下操作系统:
DOS,Unix(Linux,FreeBSD,Irix,Solaris,Darwin),Windows,QNX,BeOS和MacOSX。
它还提供了很多诸如图形,声音,玩家输入(键盘,鼠标和手柄)和定时器的功能。
它也提供了浮点运算功能,3D功能,文件管理功能和GUI。
当前最新版本为4.3.1,官方网址为
4游戏程序的开发
4.1游戏的思路和构想
4.1.1游戏想法的产生
资料显示,在上个世纪风靡一时的任天堂FC主机上,最火爆的飞行游戏便是《小蜜蜂》,这款游戏已其独特的游戏方式征服了亿万玩家,这款游戏的游戏方式虽然极为简单,但是却极为有趣,停留在屏幕上方的蜜蜂不停地向下攻击玩家所控制的飞机,玩家不仅必须要避开蜜蜂的攻击,还要控制飞机还击蜜蜂而玩家击中这些蜜蜂以后,他们死亡后会有一定几率掉落增加玩家生命,玩家子弹速度和玩家得分的奖子,而这款《小蜜蜂》,正是用C++语言开发的,这说明,在VisualC++平台下开发一个类似于《小蜜蜂》的飞行射击游戏是可行的。
4.1.2对游戏设计的初步认识
整个设计的关键词如下:
游戏、飞机、敌机、子弹、关卡、玩家、奖子、屏幕、三发子弹、双发子弹、改变玩家子弹类型变化的奖子、增加玩家生命的奖子、爆炸,这些关键字都需要定义一个独立的类来描述它们,并且,可以把飞机类设定为敌机类和玩家类的父类,因为飞机类中的一些方法也可以用于敌机类和玩家类,同理,也应该把奖子类设定为改变玩家子弹类型变化的奖子类和增加玩家生命的奖子类的父类,至于子弹,则不必用到继承和派生,因为无论是三发子弹还是双发子弹,他们的属性和功能都是一样的,差别只是存在于视图上。
4.1.3模块成型阶段
进一步熟悉了编程知识后,对框架做出了一些修改,逐步把游戏的基本功能确定。
1.Level类主要实现负责管理游戏中的所有物体,包括管理显示,碰撞,创建和回收等,还提供了一些服务,方便查询关卡中的一些物体的信息。
2.Object类主要负责控制可见性,坐标位置,设置速度等,其中就主要的一个功能就是判断物体是否越界。
3.Plane类主要就是实现设定飞机的爆炸类型,子弹类型,实现开火以及设定开火冷却时间,而其子类Enemy类则进一步实现了设定敌机的生命值和掉落的奖子类型。
另一个子类Player类增加了实现玩家在被击毁后诞生时的无敌时间。
4.Bullet类主要实现了子弹的创造。
5.Explosion类主要实现了爆炸的创造。
6.Prize类主要实现玩家“吃”掉奖子后改变玩家属性。
4.2程序的类结构
图1游戏类结构图
4.3游戏的实现
4.3.1主类Level的实现
Level类是最核心的类,他实现了最初关卡的创建,最终关卡的销毁,并实现了检测碰撞,为Object类里的物体实现碰撞提供了接口,同时,Level类中的两个方法getNearestEnemy和getNumCompanies则为敌机对玩家实行攻击策略提供了函数,最后,玩家“吃”掉奖子后生命增加和得分增加的函数实现也包含在Level类中,所谓关卡,就必须要有一定的运行状态,关卡运行有三种状态,可以定义一个枚举类型来定义三个不同的状态,这里用到枚举类型的原因是,关卡运行的状态只有运行,结束和失败三种,只有有限的几种可能值,虽然可以用int,char等类型来表示他们,但是对数据的合法性检查却是一件很麻烦的事情,而C++中的枚类型就是专门来解决这类问题的
typedefenumStatus//关卡状态定义一个名为Status的枚举类型
{
LEVEL_END,//关卡结束
LEVEL_FAILED,//关卡失败
LEVEL_RUN,//关卡运行
}。
同时,在游戏运行中会发生不同的事件,也需要一一定义,由于游戏事件较多,同理,也需要定义一个枚举类型来定义众多的事件
enumEvent
{
E_RenewPlayer,//!
创建玩家,关闭所有事件
E_ReadyDelay,//!
显示‘ready’前的等待,并启动E_Ready事件
E_Ready,//!
显示‘ready’,启动E_RenewPlayer事件
E_LevelEnd,//!
使关卡处于完成状态,表示通关
E_LevelFailed,//!
使关卡处于失败状态
E_LevelFailedDelay,//!
关卡失败前的等待,并启动E_LevelFailed事件
E_LevelEndDelay,//!
关卡通关前的等待,并启动E_LevelEnd事件
}。
接下来,我们所要做的,便是创建关卡,从关卡文件中读入物体数据,创建物体并加入到关卡中
boolcreate(char*name,dev:
:
ResourceManager*rs,dev:
:
KeyBoard*kb)。
在关卡最初创建时,需要把敌机数目设置为0,把关卡状态设置为运行,同时应该关闭定时器。
接着就是使用io包内的ReadFile创建对象rf,方便读取文件,以实现关卡中敌机的初始化,由于IO包不透明,所以无法了解其内部是如何实现这一功能的,在此,只能列出在文本中的格式,格式如下:
视图奖子爆炸子弹体力坐标X坐标Y策略号
视图有两种:
编号1表示使用第一个敌机图片,编号2表示使用第二个敌机图片;奖子有四种:
编号0表示没有奖子,编号1表示奖一个生命的奖子,编号2表示奖励三发子弹武器的奖子,编号3表示奖励20分的奖子;爆炸有三种:
编号0表示小型爆炸,编号1表示普通爆炸,编号2表示大型爆炸;子弹有四种:
编号0表示小单发子弹,编号1表示双发子弹,编号2表示三发子弹,编号3表示反弹型单发子弹,编号4表示高速双发子弹;体力的数值就表示可以被攻击多少次;坐标的两个数值即为敌机在关卡中的坐标位置。
比如说,要设置一个使用第一张敌机图片,掉落一个奖励20分的奖子,爆炸类型为普通爆炸,发射小单发的子弹,可被攻击1次,坐标为6080的敌机,那么就在文本文件中输入131016080
由于这里涉及设备层中的资源管理器,提供加载图片和声音的服务以及设备层中的键盘,提供输入查询,具体的实现将放到重要问题说明中详细介绍。
关卡创建完毕,就应该向其中添加我们想要的东西,并使其工作
voidLevel:
:
add(Object*o)//向关卡里添加敌机的实现
{
intid=o->getRuntimeClassID()。
//获取物体运行时的类ID
if(id==Enemy:
:
ClassID)//如果物体是敌机,增加敌机数目
{
mNumEnemies++。
}
在这里向关卡中添加敌机时先要判断当前被添加物体是否为敌机,如果是才添加,如果不是,则不添加。
敌机添加完毕就需要创建玩家,玩家的位置是固定的,把玩家的坐标位置设置为:
X轴坐标设置为当前关卡X轴的二分之一,Y轴坐标设置为当前关卡Y轴最大值减20
p->setPos(&Vector(mArea.x2/2,mArea.y2-20))。
要添加,就必须要移出,所以相应的,也就有摧毁物体,比如在关卡结束后,我们需要摧毁关卡中所有的资源,所以我们定义一个destroy方法,摧毁关卡中的所有物体,释放资源给资源管理器,比如图片和声音
voiddestroy(dev:
:
ResourceManager*rs);
同时,关卡还需要处理玩家或者敌机的死亡,我们定义一个processDie的方法来实现,流程如下
图2处理飞机死亡流程
其中在判断物体的类别,并且完成玩家和或者敌机的死亡后继续判断玩家的生命是否用尽和敌机数目是否为0,这样做的目的是为了避免在玩家和最后一个敌机同归于尽的时候依然进入关卡结束事件。
而update方法算是Level类中比较关键的方法,他更新关卡中的所有物体,包括检测碰撞,更新定时器,处理碰撞等,其中最主要的方法便是物体的越界处理,首先计算物体的坐标与关卡边缘是否发生相交,其中判断是否在X轴越界的算法为:
取出物体的坐标,判断其是否小于关卡的坐标X1或者其是否大于关卡的坐标X2,若满足一项时,则调用Object类中的onOutOfArea方法,实现每个物体不停的越界实现,流程图如下
图3判断物体是否在X轴上越界流程
其中,关于检测物体碰撞由于是本设计的重点和难点,将放在后面的重要说明中具体说明。
关卡还需要实现两个方法,那就是getNearestEnemy和getNumCompanies,它们主要是用来实现敌机的攻击策略的,这里首先要声明一下,当玩家,敌机和奖子类被创建时,都会获取一个ID,以表明其身份,同样的,凡是通过这几个类创建的对象也具有与其所属类相同的ID,通过这样的方法,就可以把关卡中众多的物体相互之间区分开。
getNearestEnemy主要是实现敌机将离其最近的玩家作为目标,以实现跟踪策略,其基本思想是,以当前物体作为中心,对整个关卡中的物体进行一个遍历,若它们同为敌机,则继续,若它们一个为玩家,一个为敌机,则计算出与其的距离,选出其中与自己距离最小的物体,判断其是否小于最小距离,若小于,则把当前物体锁定为自己的目标,流程如下
图4锁定最近敌人的流程
getNumCompanies方法主要是用于给敌机策略提供一个接口,它是基于这样一个想法,那就是当敌机总数大于一个数值时,敌机不会做出任何攻击动作,而当玩家消灭一定数量后,敌机便会实行攻击策略,getNumCompanies就是让敌机获取当前敌机总数,当其返回值小于一定的值时便执行攻击策略,实现的方法仍然是对以当前所指向的物体为中心进行遍历,若被遍历到的物体与其为同一队伍且同为敌机或玩家,则同伴数目增加1,最开始时,同伴数目设置为0,流程如下
图5取得同伴数目流程
此外,关卡还需要管理增加玩家生命和得分,用于实现玩家“吃”掉奖子后的属性改变,分别定义为addPlayerLife和addScore方法实现,实现方法为他们实现自加即可。
4