




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、分类号:tp311. 1密级:公开u d c: d10621-408- (2007)5841-0编号:2003032003成都信息工程学院学位论文基于vc的飞行模拟游戏的设计及实现论文作者姓名: 申请学位专业: 申请学位类别: 指导教师姓儆 职称): 论文提交日期:林丹网络工程工学学士金虎(讲师)2007年06月01日基于vc的飞行模拟游戏的设计及实现电子游戏的出现代表了一种全新娱乐方式的诞生。口前,电子游戏正以其 独特的魅力吸引着众多的玩家。随着游戏产业的蓬勃发展,越來越多的人加入 到了游戏开发的行业。游戏开发涵盖了程序设计、文学、历史、音乐及美术等 诸多方面的内容,除去市场价值的意义,电子
2、游戏的发展的必要性还在于对我 国文化产业的发展的重要性,游戏作为一种特殊的创意文化产品形态,是文化 产业链屮不可缺少的一环。设计在利用已有的开发包和已有的游戏框架的基础 上,采用microsoft visual c+2005为开发平台,这些开发包和框架已经完美地 解决了游戏图像和咅效方面的问题,设计的主要工作就是向框架中添加口己所 设计的类,用于实现设计所要实现的功能。在进行类的设计时,运用c+所具 有的继承和派生功能,使很大一部分代码能够得到重用,从而实现多态,同吋, 还要在父类中很好地引入虚函数,为指针能够指向了类的同名成员提供方便, 然后利用开发包里的方法来实现游戏背景的显示,最终得到-
3、个在microsoft visual c+2005上运行的飞行模拟游戏,同时在运行时不会出现重大尤其是会 令游戏崩溃的bugo关键词:飞行模拟;多态;代码重用design and realization of a flight simulation game based onvcabstractthe appearance of computer game has represented the naissance of a totally new sort way of entertainment. at present, the computer game has attracted a
4、great deal of players by its unique charm. along with the game industry flourishing, more and more people has joined the profession of game development. game development has covered many contents including programming, literature, history, music, arts ,etc. eliminate the significance of market value
5、, game develop is quite important to the culture evolution of our nation to be a special kind of creativity culture production. game is indispensable to the chain of culture industry. the design based on the develop package and the game frame which already exist uses microsoft visual c+2005 to be th
6、e platform. these develop package and game frame has raveled out the problem which relate to image and sound effect perfectly. the main task of the design is to add classes that planed by oneself to the game frame, to actualize the function which the design have to realize. when we carry through the
7、 classes design, use the inherit and derive function, we need to enable a majority of code can be reused, aim to actualize polymorphism, at the same time. it is necessary to use virtual function in the baseclass, to make pointer can point to the member which has the same name in the subclass more co
8、nvenience, afterwards, utilize the develop package to realize the demonstration of game background, finally obtain a flight simulation game which can run on microsoft visual c+2005, and there's no seriously bugs especially that can make the game crash when running.key words: flight simulation; p
9、olymorphism; code reuse论文总页数:26页1 弓丨言11.1 课题背景11. 2国内外研究背景11.3 本课题研究的意义11.4 本课题研究的方法12 游戏软件的现状和vc的概况12. 1中国游戏软件的现状12. 2c+简介22. 3microsoh visual c+简介32. 4利用vislu c+开发游戏简介33 开发环境介绍33. 1开发环境33. 2关于allegro44 游戏程序的开发44. 1游戏的思路和构想44. 1.1游戏想法的产生44.1.2对游戏设计的初步认识44.1.3模块成型阶段44.2 程序的类结构54. 3游戏的实现54.3.1主类level
10、的实现54.3.2object类的实现84.3.3plane类的实现94.3.4player类的实现114.3.5enomy类的实现114.3.6bullet类的实现134.3.7prize类的实现145 程序设计过程小遇到的一些垂要问题155. 1关于碰撞的问题155.2 关于游戏画面的问题185.3 关于玩家控制的问题20结论21参考文献21致谢22声明231引言1.1课题背景现今,游戏软件己经成为盈利最高的软件之一,而且还在向着复杂化、大 型化发展,其中,很多i visual c+作为开发工貝的游戏都取得了巨大的成功, 比如暴雪公司的魔兽争霸系列和魔兽世界,这说明visual c+开发游
11、 戏具有一定的优势。所以,在visual c+平台上设计游戏是极为方便的,这也 是优势所在。1.2国内外研究背景无论是在国内还是国外,游戏编程已经成为了一种时尚,许多程序员都忘 我地投入到其中,他们其中有很多人不光是为了盈利,也有很多是纯粹为了兴 趣,许多著名的游戏编程员本身就是狂热的游戏玩家,所以,无论是国内还是 国外,诞生了很多经典的游戏,其中利用visual c+作为开发平台的更是不胜 枚举,但是由于我国的游戏编程相对于国外起步较晚,所以在很多地方还存在 不小的差距,甚至成了很多游戏软件业比较发达的国家的游戏加工厂。1. 3本课题研究的意义目而,市面上的游戏可以说是层出不穷,并且随着电脑
12、硬件系统的改良, 未來的游戏必将更智能化,更艺术化,更人性化,在高性能的硬件设备支持卜: 游戏的驱动引擎更具威力,控制功能更加完备,给人们带來更丰富的娱乐和体 验,好的游戏给人们的生活带來了健康愉快的补充,唯美的艺术享受,潜默的 教育功效,时尚的情感陶冶,如杲没有足够的优质游戏,那么市场就不免会被 粗劣的游戏充斥,叮以说,对于青少年來说,谁对游戏编程有着更深入的理解 和掌握,谁就掌握着游戏的导向权。1. 4本课题研究的方法采用microsoft visual c+2005为开发平台,在利用己有的开发包和己有 的游戏框架的基础上,这些开发包和框架已经完美地解决了游戏图像和咅效方 面的问题,设计的
13、主要工作就是添加白己所设计的类,用于实现木设计所耍实 现的功能,在进行类的设计时,运用c+所具有的继承和派生功能,使很大一 部分代码能够得到重用,同时,还耍在父类中很好地引入虚函数,为指针能够 了类的同名成员提供方便,最后利用开发包里的方法來实现一个游戏背景的显 /j i o2 游戏软件的现状和vc的概况2. 1中国游戏软件的现状软件产业是当前世界上增长最快的朝阳产业之一,并将成为21世纪推动 世界经济发展和社会进步的重耍动力。近年来,主耍国家软件业平均以11%以 上的增长率快速发展。据“oecd2000年信息技术展望”报告,1997年,其增长 率成员国仅软件包产值就占世界市场份额的94%,达
14、1080亿美元,并口 1990 年以来年11.2%。美国是世界上最大的软件生产国,1997年的软件产值为 1705.9亿美元,占其当年gdp的2. 1%,出口额为155.5亿美元。日水其次, 1998年软件产值约570亿美元,但出口仅为0. 82亿美元。英国列第三,1999 年的软件产值为377. 46亿美元,占其gdp的1.2%,出口约16.2亿美元。据 对各国软件业发展的轨迹分析,虽然各国的产业规模和出i额相差较大,但其 成功的因素可归纳为以卜几点:1.对软件知识产权的严格保护,营造一种谁投 资谁受益的良好商业和法治氛围;2服务到位的融资机构,促进软件成果转 化快;3.高素质的软件专业人才
15、,配合制定灵活的技术移民政策;4.貝有 第一流的大学教育,能够迅速适应市场对人才的需求;5.发达的通信设施;6. 长期磨炼的企业家精神;7.巨大的市场需求。相比于其他国家,我国的软件产业特别是游戏产业起步较晚,在很多地方 上都不及一些软件大国,但是近年来我国软件业发展迅速,有关统计数据显示, 2001年,软件产业销售收入仅为796亿元,到了 2006年年底己经达到4800亿 元,5年增长了 6倍多。但与软件产业发达国家相比,差距依然很大,绝大部 分市场被国外软件业巨头垄断,国产软件占据的市场份额很少。在国际市场上, 2005年国产软件出口额为35. 9亿美元,仅占全球软件市场份额的5. 9%。
16、2. 2 c卄简介c+语言是在c语言的基础上为支持面向对象的程序设计而研制的通用程 序设计语言,它是由at&t贝尔实验室的bjarne stroustrup博士创建。研制 c+的首耍目标是使c+首先是一个更好的c语言,所以根除了 c语言中存在的 问题,增加了许多新功能。c+的另一个目标是支持面向对象的程序设计,因此 在c+中引入了类的机制。所研制的这个语言最初被称为“带类的c语言”,1983 年取名为c+°c+语言的标准化工作从1989年开始,于1994年制定了 ansi c+ 标准草案。c+的主要特点有两个方面:全面支持c语言与面向对象。c卄从c语言发展 而來,保持了c语言
17、的简洁、高效和在某些操作上沿用了汇编语言指令的特点。 同时,对c语言的类型进行了系统的改革和扩充,堵塞了 c语言中的许多漏洞, c+编译提供了更好的类型检查和编译时的分析,能检查出更多的类型错误。o+ 改善了 c语言的安全性,比c语言更安全。由于c+保持与c语言兼容,这就使 许多代码不经修改就可在c+编译器卜通过,用c语言编写的众多库函数和实用 软件可方便地移植到c+中。因此,使用c语言的程序员能很快学会c+,使用 c+进行编程。另外,用c+编写的程序叮读性好,代码结构更为合理。c+的最 重要的特点是支持面向对象的程序设计,使用c+编程,编程效率高;由于面向 对象的方法更接近人类认识世界的方法
18、,c+对于问题更容易描述,程序更容易 理解与维护;c卄的模板对库代码的重用提供了支持;c+更有利于大型程序设计。 c+是一种支持多种程序设计方法的语言,提供对过程化和基于对象的程序设计 方法的支持。适合于不同使用开发方法的编程人员。2. 3 microsoft visual c卄简介visual studio是微软公词推出的开发环境。是目前最流行的windows平 台应用程序开发环境。目前已经开发到8.0版本,也就是visual studio 2005o 在visual studio中就有面向windows开发使用的visual c卄。visual c+|j诞生以來,一直是windows环境下
19、最主耍的应用开发系统z 一。visual c+不仅是c+语言的集成开发环境,而且与win32紧密相连,所 以,利用visual c+开发系统可以完成各种各样的应用程序的开发,从底层软 件直到上层直接面向用户的软件。而k, visual c+强大的调试功能也为大型 复朵软件的开发提供了有效的排错手段。进入21世纪以来,随着多媒体技术和图像技术的不断发展,可视化技术得 到广泛的重视,越来越多的计算机专业人员和非专业人员都开始研究并应用可 视化技术。所谓可视化技术,一般是指软件开发阶段的可视化和对计算机图形 技术和方法的应用。visual c+是一个很好的町视化编程工具,使用visual c+ 环境
20、來开发基于windows的应用程序大大缩短了开发时间,而且它的界面更友 好,便于程序员操作。2.4利用visual c卄开发游戏简介进入上个世纪90年代以來,游戏开发进入了可视化阶段,并且visual c+ 是首选的开发工具,在此期间,诞生了许多用visual c+开发的经典游戏,比 如任天堂公司fandly computer主机上的小蜜蜂以及大名鼎鼎的星际争 霸,这些游戏不仅在当时取得了巨大的成功,而且到现在也被奉为经典。可以 说在这个时期visual c+在游戏开发领域是独领风骚。进入了新千年,java语言开始崛起,由于java具有较高的可移植性,许 多游戏,特别是很多手机游戏都转向了 j
21、ava平台,但是纵观市面上最火的单机 游戏魔曽争霸3和最火的网络游戏魔曽世界,都清一色的是用visual c+ 开发的,这说明就算在新时期的游戏开发中,利用visual c+作为开发平台还 是具有一定优势的。3 开发环境介绍3. 1开发环境操作系统:microsoft windows xp程序语言:c+开发平台:visual c+ 2005开发工具:allegro3. 2 关于allegroallegro是一个免费为c和c+的开发人员提供的一个游戏编程库,它支持以 下操作系统:dos, unix (linux, freebsd, irix, solaris, darwin), windows,
22、 qnx, beos和macos x。它还提供了很多诸如图形,声咅,玩家输入(键盘,鼠标 和手柄)和定时器的功能。它也提供了浮点运算功能,3d功能,文件管理功能和 gue当前最新版本为4. 3. 1,官方网址为 http:/allcg.sourceforge, nct/indcx. html4 游戏程序的开发4. 1游戏的思路和构想4. 1. 1游戏想法的产生资料显示,在上个世纪风靡一时的任天堂fc主机上,最火爆的飞行游戏便 是小蜜蜂,这款游戏已其独特的游戏方式征服了亿力玩家,这款游戏的游戏 方式虽然极为简单,但是却极为有趣,停留在屏幕上方的蜜蜂不停地向卜攻击 玩家所控制的飞机,玩家不仅必须耍
23、避开蜜蜂的攻击,还耍控制飞机还击蜜蜂 而玩家击中这些蜜蜂以后,他们死亡后会有一定几率掉落増加玩家生命,玩家 了弹速度和玩家得分的奖了,而这款小蜜蜂,正是用c+语言开发的,这说 明,在visual c+平台下开发一个类似于小蜜蜂的飞行射击游戏是可行的。4. 1. 2对游戏设计的初步认识整个设计的关键词如下:游戏、飞机、敌机、了弹、关卡、玩家、奖了、 屏幕、三发子弹、双发子弹、改变玩家子弹类型变化的奖子、增加玩家生命的 奖了、爆炸,这些关键字都需要定义一个独立的类來描述它们,并且,可以把 飞机类设定为敌机类和玩家类的父类,因为飞机类中的一些方法也可以用于敌 机类和玩家类,同理,也应该把奖子类设定为
24、改变玩家子弹类型变化的奖子类 和增加玩家生命的奖了类的父类,至于了弹,则不必用到继承和派生,因为无 论是三发了弹还是双发了弹,他们的屈性和功能都是一样的,差别只是存在于 视图上。4. 1. 3模块成型阶段进一步熟悉了编程知识后,对框架做出了一些修改,逐步把游戏的基本功 能确定。1. level类主要实现负责管理游戏屮的所冇物体,包括管理显示,碰撞,创 建和回收等,还捉供了一些服务,方便查询关卡中的一些物体的信息。2. object类主要负责控制可见性,坐标位置,设置速度等,其屮就主要的 一个功能就是判断物体是否越界。3. plane类主要就是实现设定飞机的爆炸类型,子弹类型,实现开火以及设 定
25、开火冷却时间,而其子类enemy类则进一步实现了设定敌机的生命值和掉落的 奖子类型。另一个子类player类增加了实现玩家在被击毁后诞生时的无敌时间。4. bullet类主耍实现了子弹的创造。5. explosion类主耍实现了爆炸的创造。6. prize类主要实现玩家“吃”掉奖子后改变玩家屈性。4. 2程序的类结构图1游戏类结构图4. 3游戏的实现4. 3. 1主类level的实现level类是最核心的类,他实现了最初关卡的创建,最终关卡的销毁,并 实现了检测碰撞,为object类里的物体实现碰撞提供了接口,同时,level类 中的两个方法getnearestenemy和getnumcomp
26、anies则为敌机对玩家实行攻击 策略捉供了函数,最后,玩家“吃”掉奖子后生命增加和得分增加的函数实现 也包含在level类屮,所谓关卡,就必须要有一定的运行状态,关卡运行有三 种状态,可以定义一个枚举类型来定义三个不同的状态,这里用到枚举类型的 原因是,关卡运行的状态只有运行,结束和失败三种,只冇冇限的几种可能值, 虽然可以用int, char等类型来表示他们,但是对数据的合法性检查却是一件 很麻烦的事情,i(ij c+中的枚类型就是专门来解决这类问题的typedef cnum status/关卡状态定义一个名为status的枚举类型level_end,level failed,level_
27、run,;关卡结束关卡失败关卡运行同时,在游戏运行中会发生不同的事件,也需耍一一定义,由于游戏事件 较多,同理,也需要定义一个枚举类型来定义众多的事件cnum evente_renewplayer, /!创建玩家,关闭所有事件e_readydelay, /!显示'ready'前的等待,并启动e_rcady事件 e_rcady, /!显示"ready',启动e_rcncwplayer 事件 e_levelend, /!使关卡处于完成状态,表示通关e_lcvclfailcd, /!使关卡处于失败状态e_levelfa订eddelay, /!关卡失败前的等待,并启动
28、e_levelfailcd 事件e_lcvclenddclay, /!关卡通关而的等待,并启动e_lcvclend事件;接下來,我们所要做的,便是创建关卡,从关卡文件中读入物体数据,创 建物体并加入到关卡中bool creato (char *name, dev:rcsourccmanagcr* rs, dev:kcyboard *kb);在关卡最初创建时,需耍把敌机数目设置为0,把关卡状态设置为运行, 同时应该关闭定时器。接着就是使用io包内的readfile创建对象rf,方便读 取文件,以实现关卡中敌机的初始化,由于10包不透明,所以无法了解其内部 是如何实现这一功能的,在此,只能列出在文
29、本中的格式,格式如f:视图奖了爆炸了弹体力坐标x坐标y策略号视图有两种:编号1表示使用第一个敌机图片,编号2表示使用第二个敌 机图片;奖了有四种:编号0表示没有奖了,编号1表示奖一个生命的奖了, 编号2表示奖励三发了弹武器的奖了,编号3表示奖励20分的奖了;爆炸有三 种:编号0表示小型爆炸,编号1表示普通爆炸,编号2表示大型爆炸;子弹 有四种:编号0表示小单发了弹,编号1表示双发了弹,编号2表示三发了弹, 编号3表示反弹型单发了弹,编号4表示高速双发了弹;体力的数值就表示可 以被攻击多少次;坐标的两个数值即为敌机在关卡中的坐标位置。比如说,要设置一个使用第一张敌机图片,掉落一个奖励20分的奖子
30、,爆 炸类型为普通爆炸,发射小单发的了弹,可被攻击1次,坐标为60 80的敌机, 那么就在文本文件中输入1 3 1 0 1 60 80由此外,关卡还需要管理增加玩家生命和得分,用于实现玩家“吃”掉奖子 后的屈性改变,分别定义为addplayerlifc和addscore方法实现,实现方法为 他们实现门加即可。43. 2 object类的实现object类主耍管理物体的可视性,速度,以及判断设置物体的队伍和判断 队伍是否一样等,他抽象了所有的物体,也就是说,其中所有的属性和方法是 一切物体都具有的,这样做是为了增加代码的重用量,这也是运用c+开发游 戏的好处z-,但是,这样做就耍求把object
31、类的析构函数设为虚函数,这是 因为如果不将析构函数设为虚函数的话,那么当用一个object类的指针删除一 个其了类的对象时,了类的析构函数就不会被调用,虽然这样做并没有什么实 际意义,但是这却符合用c+进行软件开发的时候一般用來做基类的类的析构 函数设为虚函数的默认规定,i大i此,需要将析构函数设为虚函数。此外,还有几个方法是需耍重点提及的:objccttraccr* scttraccr是设置越界处理器,这个处理器将处理物体的 越界事件objccttraccr* scttraccr (objccttraccr* tr)/指针指向新的越界处理器objccttraccr* old = mtracc
32、r;mtraccr = tr;return old;/返冋旧的越界处理器sctdircction是用来设置物体的移动方向,这个方向为用來修改物体的当 前运动速度void sctdircction (vector* dir)/指针指向新方向向量vector* vel = getvelocity();dir->normalize ();/单位化这个向量 vcl->multiply (dir) ;/应用这个向量到速度上onoutofarca方法是为了实现物体越界的处理函数,将任务代理给mtranccr 处理,这样实现了objccttraccr接口的类都可以处理物体的越界void onou
33、tofarea (bool onx) /onx为真的话表示在x轴上越界,否则 在y轴上if (mtracer)mtraccr->onoutofarca (this, onx);通过这样的方法,在而面提及的level类中的update方法就可以成功地实现 越界处理。另外,顾名思义,所谓object类,肯定是要设定所有物体的屈性的,这些属 性包括是否可见visible,是否可碰撞collidablc,物体所属队伍号team,设置 位置setpos和获取位置getpos,设定速度setvelocity和获取速度getvelocity, 需要说明的是,这里的速度不是普通的标量,而是一个矢量,即它
34、是有方向的, 这样做的好处就是由于飞机是只能向而开火,并且其面朝的方向应该和其速度的 方向一致,那么如何来实现这两点呢?这就需要把速度设置为一个矢量,这样一 來,就可以把飞机的开火方向和面朝方向与速度方向取一致。4. 3. 3 plane类的实现plane类是object类的了类,它通过object类公有继乐而来,所以,凡 是object类中有的方法和屈性,它也具有,当然,我们必须为起添加新的函数 或者数据,那么飞机相对于其他物体特有的属性是什么呢?对,那就是它们死 亡的时候会发生爆炸,它们也能发射了弹,而每种飞机所产生的爆炸类型和所 发射的了弹类型都是不同的,所以,我们在plane类中就设定
35、几个方法来设定 物体的爆炸类型,所发射的子弹类型以及他们的速度飞机的死亡会产生爆炸,同时也会变得不可见void plane:dic(void)/死亡的实现objeet *obj = mef->crcatc (mexpltypc);if (obj)obj->sctpos (this-getpos();mlcvcl->add (obj);disappear ();凡是玩过飞机游戏的人都知道,飞机是不能连续发射了弹的,在两次发射了 弹z间,必须要有一定的冷却时间,而这个功能是dtlplane类的一个update方 法实现,思路为:对每一个飞机都设定一个定时器cooltimer,初始
36、值为10,然 后不断对它进行检查,只耍它的值不为0,就进行门减,如果某个飞机有开火请求的话,就检查定时器的值是否为0,如杲为0,则允许开火,同时定时器的值复 位为初值,如果定时器的值不为0,则开火请求无效,流程如f:图6飞机开火冷却流程同时,由于假定飞机只能向前运动,而不能向后运动,所以飞机的朝向向量 也就必须和它的速度向量一致,在前面已经介绍过,在设定object类中设定了物 体的速度为矢量,这样就可以把飞机的朝向向量与其速度矢量取一致了if (getvelocity()->length()/如果物体有速度,那么物体的朝向向量就根据他的速度來进行调整mfacedirection. sc
37、ale (0);mfacedirection. add (getvelocity();mfacedirection. normalize ();object: : update();文档在线00:249796576此外还有一个问题,那就是本游戏假定的是所有飞机都只能向前方发射了 弹,所以在发射子弹的实现中,就必须把子弹的方向与飞机所面对的方向取一致, 同样的,也只需要把了弹的方向与飞机的速度方向取一致就可以了void plane:fire ()bullet* b = mbf->crcatc (gctbullcttypc(), gcttcamo);if (b=0)return;b->
38、sctpos (gctpos ();b>setdirection (&mfacedirection) ;/将子弹的方向与飞机面朝的方向取一致mlcvcl->add (b);4. 3. 4 player类的实现player类主要实现了玩家的一些方法,它继承了飞机类的所有参数和方法, 玩家和敌机除了操作不一样以外,其余的属性基本一致,比如说,玩家一样有 开火的冷却时间,另外,为了和所有已有的飞行游戏接轨,需要将玩家刚诞生 时的一段时间设为无敌时间,即在这段时间内,所有敌机的攻击都对玩家无效, 而且,照以往飞行游戏的惯例,在这段无敌时间内,玩家是在不停闪烁的,为 此,我们设定为其
39、无敌时间为100,再取名一个为matchlcsstimcr的定时器, 让其不停自减,当减为0时,无敌效果取消,那么,如何实现玩家的闪烁呢? 其实所谓“闪烁”,意思就是其可视性在不停地变化,在这100时间内,不停 地对其视图可视性取非运算,以实现其闪烁的效杲,当无敌时间耗尽时,只需 要干两件事:第一,取消玩家无敌状态,通过设置玩家collidable属性为真实 现;第二,取消玩家的闪烁,通过设置玩家visiblc属性为真实现。关于玩家的控制,将在后面的重耍问题中说明。435 enemy类的实现enemy类主要实现的功能是设定敌机的生命值,设定掉落奖了类型,其他 一些彳亍为全部由父类plane继承
40、而來,但是对于update这个方法,enemy类进 行了重写,目的就是为了实现在不同时间敌机采用不同的攻击策略來攻击玩家, 我们现在设定敌机每5个周期就执行一次攻击策略,那么如何实现敌机每5个 周期就更新一次其攻击策略呢?这同样需耍设置一个定时器updateaitimer來 实现,首先设置updateaitimer的初值为0,然后对它进行自加,同时对 updateaitimer的值进行检查,当它的值为5的倍数时,敌机的攻击策略就进 行更新,再进一步,如何判断updateaitimer的值是否为5的倍数呢?当然通 过把updateaitimer的值对5取余,当得到的值等于0时,updateait
41、imer的 值即为5的倍数,敌机的攻击策略也就进行相应的更新。那敌机的攻击策略由谁负责管理?所有敌机的攻击策略都是由ai指针管 理,在关卡刚创建时,ai指针指向的是defaultai,这时敌机的攻击策略是不 作出任何动,作在敌机执行dcfaultai时,他会调用level中的gctnumcompanics 方法,当返回值小丁最小友军数目时,它便会调用level中的gctncarcstencmy 方法,它的目的是寻找是否有玩家,若玩家已被击毁,则执行defaultai,停 止任何动作,如杲玩家仍然存在,那么就把玩家的坐标取出,与口己的坐标相 减,算出距离,若距离小于最小距离mmindist,则实
42、施随机开火策略,开火几 率是1%到100%之间的一个随机数,流程如下:图7敌机攻击策略更新流程那么,如何保证开火几率为0%至1oo%z间的一个随机数呢?这就要通过一个 随机数md來实现,把它的值设为rand()%100,这样就保证md总是小于100了。43. 6 bullet类的实现bullet类主耍实现的就是了弹的创造了销毁,以及设定了弹与飞机的碰撞, 它也是object类的子类,继承了 object类的所有属性和方法,其中,子弹都 是由了弹工厂bulletfct创造的,也是由其销毁的,了弹共有3种,同前面介 绍的一样,为了方便,可以定义一个枚举类型來描述它typedef enum bull
43、ettypebt_normal,bt_double,bt_ti1ree,;接下来,就要创建子弹,但是由于bulletfct不知道是要创建哪种子弹, 所以在创建了弹的时候,需要一条switch语句来判断所要创建了弹的类型,共 有3种了弹类型,所以switch语句就应该有3种case,分别对每一种了弹进 行相应的视图创建。在这里有一个问题,那就是bulletfct一次性地创建了200个了弹,如果不对 莫进行回收,这就势必会大大增加了系统的开销,导致运行速度的缓慢,如何解 决着一问题呢?可以创建一个“池了”,创建的所有了弹都先放入这个池了中, 当飞机开火需要子弹时,再从池中取出子弹供其使用,同理,当
44、关卡中有不用的 了弹时,也放入池中以供以后使用,这样就大大增强了资源的重利用,也节省了 许多不必要的系统开销,这个表的主要思想是:存放一群物体。根据物体的使用 情况,存放到两个表内。一个表存放所有物体,另外一个表存放无效的物体。当 用户需要物体时,从无效的物体表内取给用户。当用户用完后回收时,存放这个 物体到无效物体表内以供卜次使用,流程如k:图8子弹调丿ij和回收流程在木游戏中,所有的了弹只能是直线向上或者向下运动,所以它的更新方 法比较简单,只需耍先判定了弹是否诞生,如杲诞生的话,就取出它的坐标以 及它的速度向量,然后以其速度向量为方向对其坐标作加。4. 3. 7 prize类的实现pri
45、ze类和bullet类似,也是object类的子类,它的主要功能是实现奖 了的创建和销毁,以及设定和玩家的碰撞行为,奖了一共有3种,但是我们把 没有奖了也算成一种,所以共有4种奖了,同样用一个枚举类型來定义它typedef entim prizetypebt_no,没有奖了bt.life,/增加玩家生命的奖了bt_ti1ree_bullet,/子弹变为三发的奖子bt_score,/增加玩家得分的奖了;奖子都是由prizefct创建的,3种不同的奖子的创建方法是不同的,所以, 也需耍一条switch语句來分别实现4种(其实只有3种,因为没有奖了是不需要创 建任何东西的)不同奖了的创建。在本游戏中
46、,子弹的更新方法只是与子弹类似,也同样是取出它的坐标以 及它的速度向量,然后以其速度向量为方向对其坐标作加。那么奖了如何实现改变玩家的相关屈性的呢?为了实现不同奖了改变玩家 不同属性,我们又用prize类派生出3个子类:addlifeprize类, changcbullctprizc类和scorcprizc类,分别用来实现增加玩家生命值,改变 玩家了弹和增加玩家得分,以addlifeprize类举例,它增加玩家的生命就通 过调用level类中的addplayerlife函数实现void addlifeprize:changcattributc (player *p)/增加玩家生命的实现 mle
47、vel->addplayerlife ();同样,changcbullctprizc类改变玩家了弹通过调用player类中的 setbullettvpe函数來实现void changcbullctprizc:changcattributc (player* p)/改变玩家了弹 类型的实现p->sctbuilettype (mtypc);scoreprize类增加玩家得分通过调用level类中的addscore來实现 void scorcprizc: changcattributc (player *p)/增加玩家得分mlevel->addscore (mscore);5 程序
48、设计过程中遇到的一些重要问题5.1关于碰撞的问题碰撞检测问题是木程序的难点和重点,也是所有飞行射击游戏的难点和重 点,所谓碰撞检测,就是指检测在某一时刻是否冇2个或者以上的碰撞矩形相 交。那么我们首先要做的就是设定一个物体的碰撞矩形,具体做法为,在 planeview中以此物体视图的中心为点,上,下,各取视图高度的一半,左, 右各取视图宽度的一半,然后调用object类中的sctcollshapc方法来设定其 碰撞矩形void planeview:changeshape (object *obj)float w = m_plane->gctw(), h = m_planc->gct
49、ll ();obj->sctcolishapc (&rcct(-w/2, -h/2, w/2, h/2);虽然给物体的碰撞矩形设定完毕了,但是我们设想一下,当物体开始移动 时,也就是视图开始移动,但是它的碰撞矩形却还留在原地,这显然会造成碰 撞检测不能正确地完成,如何解决呢?virtual void update(void)mncwshapc = mcolishapc;mnewshcipe. translate (&mpos) ;/将碰撞矩形移动到物体的当前坐标 上;接下來,我们所要做的就是进行碰撞检测,这个方法是由level类实现的, 先从一个物体a开始,若a被设定为不
50、能碰撞,则继续从下一个物体开始,若 a能发生碰撞,则又判断是否有物体b的碰撞矩形和其相交,若有,则判断a 和b是否属于同一队伍以及物体b是否为不能碰撞,若其中有一为真,则不进 行任何处理,否则就调用object类中的oncollidc方法实现碰撞,流程如门而object类中的oncollide方法很简单,就是令发生碰撞的物体消失void objcct:oncollide(objcct* obj)disappear () ;/令物体消失而disappear方法又调用level类中的proccssdic方法,proccssdie方 法在之前己经清楚地利用流程图进行了表示。至此,玩家与敌机的碰撞就完
51、美 解决了,但是了弹与玩家,了弹与敌机,奖了和玩家z间的碰撞还没有实现, 为了实现了弹与玩家和了弹与敌机z间的碰撞,在bullet类中重写object类 中的oncollide方法,i大i为各个子弹之间和子弹与奖子之间是不能发生碰撞的, 所以,还必须先对与了弹的碰撞矩形相交的物体进行检测void bullet:oncollide (object* obj)int id = obj->gctruntimcclassido ;if (id=prizc:classid | id=bullct:classid)/子弹与奖子,子弹之间不能发生碰撞else子弹与玩家和敌机碰撞的实现explosion
52、* cp = mef->crcatc (explfct:et_small);if (ep)cp->sctpos (getpos();mlevel->add (ep);object:oncollide (obj);最后,便是奖子与玩家碰撞的实现,同样,在prize类中也重坊object类 中的oncollidc方法,因为奖了和了弹以及敌机是不能发生碰撞的,所以我们 也必须对与奖了的碰撞矩形相交的物体进行检测void prize:oncollide (object* obj)int id = obj->gctruntimcclassido ;if (id=bullet:cl
53、assid | id=enemy:classid)奖了不能与敌机和了弹发生碰撞elseobject:oncollide (obj);/奖了可以与玩家发生碰撞mbceaten = true;5.2关于游戏画面的问题由于我之前对于游戏编程只是一个初步认识,所以完全没有接触过关于图 像渲染及其他方面的知识,所以z丽这个方面我感到无能为力,所以我只有使 用了同学给我捉供的整个游戏框架,在这个框架屮,所有的关丁图像资源的初 始化,渲染和摧毁都已完成,而且实现这些功能的开发包alleg, dev, io对外都 是不透明的,所以无法看到其内部的方法,但是我还是通过这几个包实现了游 戏背景的显示,背景主耍就是
54、表现一些星星不停地闪烁,这主要是通过 background类实现的。首先把星星放入关卡中,i大i为放置星星的区域不能超过关卡的区域,所以 要设定放置星星的区域的宽度为关卡坐标x2-x1,高度设为关卡坐标y2-y1,同 理,星星的位置也不能超过放置星星的区域,所以令星星的x坐标和y坐标分 别取放置星星区域的宽和高的一个随机值,通过如下语句來实现s>pos x = reind () % w;s>pos.y 二 reind () % h;为了让星星闪烁,就必须让其每隔一段时间更新一次,现在设定每30个周 期更新一次,这只需要判断时间是否为30的倍数即可(s->dclay = ran
55、d () % 30)另外,耍实现闪烁,就要有颜色的变化,那么如何实现颜色的变化呢? dev 包中有一个方法color,只要赋给其一定的值,便能显示出一定的颜色,颜色 左端点的值为coll,右端点的值为c012,当前颜色为col,开始时设定col二coll。接卜來的工作就是令星星开始闪烁,闪烁是通过定时器timer实现的,其基 本思想是:对每一个星星都设置一个定时器timer,把其初值设为0,对它进行自 加,然后随时对其进行检测,如果它的值大于delay,则把它复位为0,如果它的 值小于delay ,则计算其占delay 的比例(float sc = (float)s->timcr / s->delay),然后根据比例对两个颜色端点进行线形插值计算当前颜色(color 方法规定颜色有3个分量,所以颜色的每个分量都耍计算),最后根据计算出的 新颜色并更新星星的当丽颜色,流程如f:图10星星颜色变化流程到这里,我们的工作似乎结束了,但是运行游戏会发现背景并没有星星的 显示,为什么呢?这是因为我们定义的一个星星只是一个像素点,对于我们人 的肉眼來说是很小的,我们自然看不见,所以只有把其放大成为一个矩形,这 样我们就能够看见了int rg = 1;for (int i=0; i<max_stars; i+)star*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食品饮料供应链合作合同
- 医学领域实习经历证明(7篇)
- 货物原材料销售协议
- 合作开展医疗业务活动协议及保密条款
- 加油站股份转让协议
- 农村电商物流合作方案与战略合作协议
- 资产评估与转让协议
- 2025年公文处理考试要点试题及答案
- 收入及奖金证明书金融行业(7篇)
- 突破自我2025年建筑工程试题及答案
- DBJ-T 13-195-2022 烧结煤矸石实心砖和多孔砖(砌块) 应用技术标准
- FZ/T 21009-2015短毛条
- 最新臭氧氧化技术专业知识讲座课件
- 电力拖动自动控制系统-运动控制系统(第5版)习题答案
- 心血管疾病康复治疗课件
- 海运提单填制练习
- 幼儿园童话剧“拔萝卜”剧本
- 各种面试方法详解
- 常用H型钢理论重量表格
- 中学自主招生考试物理试题
- 四川大学-刘龙飞-毕业答辩PPT模板
评论
0/150
提交评论