




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FLASH游戏设计开发毕业论文 1 绪论1.1 设计内容 一款FLASH小游戏,玩家通过一个相互旋转的球在地面上行走,并对地面上的物体进行碰撞得分的小游戏。1.2 FLASH游戏开发现状和展望FLASH游戏是一种新兴起的游戏形式,以游戏简单,操作方便,绿色,无需安装,文件体积小等优点现在渐渐被广大网友喜爱。FLASH游戏又叫FLASH 小游戏,因为FLASH游戏主要应用于一些趣味化的、小型的游戏之上,以完全发挥它基于矢量图的优势。FLASH游戏在游戏形式上的表现与传统游戏基本无异,但主要生存于网络之上,因为它的体积小、传播快、画面美观,所以大有取代传统web网游的趋势,现在国内外用FLASH制作无端网游已经成为一种趋势,只要浏览器安装了ADOBE的Flash player,就可以玩所有的Flash游戏了,这比传统的web网游进步许多。FLASH是开发的网页富媒体及强交互技术,最初用来研发交互式或动画网站组件,近几年获得了突飞猛进的发展。根据Adobe公司的统计,其互联网PC桌面普及率达到了惊人的99%,而JAVA为85.1%。目前FLASH更在大力向PDA及智能手机终端发展。2 游戏分析2.1 游戏简介游戏主角是两个相互旋转的球,当一个停下后另一个会围绕它旋转,它们之间有一条线相连,当用鼠标点击游戏的界面时正在旋转的球会停止下来,而另一个球就会旋转运动。键盘的左右键也可以控制游戏主角的旋转运动。游戏共有九个关卡,每个关卡都有不同的物品,碰到不同的物品会有不同的反映;有的会得到分数、有的会使游戏主角丧失生命、有的会使游戏主角停止运动、有的会使游戏主角反向运动等等。每一关都有需要游戏主角在规定时间内,碰完所需要的球才能进入下一关。只有通关才能进入排行榜,留下自己的名字和成绩。2.2 需求分析现今我们走进了信息时代,随着互联网的普及,人们的生活方式发生了巨大的改变。网上购物、网上交友、网上冲浪等等,成为了现代生活的重要组成部分。2根据瑞典互联网市场研究公司Royal Pingdom与2012年1月份发表的2011全球互联网发展现状报告,全球互联网用户达21亿,对于2012年,互联网毫无疑问会继续发展。随着人们把更多的私人生活和商务生活安排到互联网上,人们将在一些以往不可想象的方面依赖于互联网。无论好与坏,互联网现在已经成为几乎一切事物的重要因素。而网上的休闲娱乐方式更是给人们的带来了极大地乐趣。据文化部2012年发布的2011中国网络游戏市场年度报告,中国网络游戏市场规模(包括互联网游戏和移动网游戏市场)为468.5亿元,其中互联网游戏为429.8亿元,互联网游戏用户总数突破1.6亿人,其中,网页游戏用户持续增长,规模为1.45亿人,增长率达24%。而FLASH小游戏又是网页游戏的主要组成部分,由此可以看出Flash小游戏的巨大发展潜力。下面我就从用户的角度分析一下网页游戏的需求:2.2.1 挑战挑战在竞技类游戏中体现得淋漓尽致。随着网络游戏的流行,多种游戏例如大型多人在线游戏和休闲竞技类游戏中,竞技形式丰富多样,玩家在一起切磋技艺,或同心协力挑战一个凶猛强大的BOSS,有些玩家已经把这些作为自己的长年的工作,职业战队每年吸引着无数的顶尖玩家参与其中,就像F1比赛一样。有些玩家则在游戏中组成自己的公会或战队,花费数周、数月为最先战胜一个boss不断地尝试,关键时候经常通宵达旦地进行,他们有专门的即时语音通信系统、专业的网站、铁杆玩家、严明的制度、苛刻的入会条件、分工明确的职业、思维灵活的战队指挥,在欧美,有些公会战胜BOSS后,还能在网上出售攻略。竞技游戏职业战队出现得较早,大型多人在线游戏中的,竞技系统做得好的游戏的玩家中,出现了专业的团队。2.2.2 交流交流在游戏中以多种形式呈现,其中至少包括聊天、交友、邮件和组队系统。这些系统使得玩家认识越来越多的朋友,在这些系统上聊天、组队、发邮件,其便捷程度丝毫不亚于游戏MSN等即时聊天系统。但是有些游戏将交流内容限制在游戏内容内,甚至在用户协议中写明,不得讨论游戏外的内容,例如:”我姐姐买了一辆新车”之类的话题都是被禁止的。但最终目的是强调不破坏游戏氛围。实际上,玩家在游戏中交流的内容主要还是游戏内的,例如交流战法等。2.2.3 成就 成就系统让玩家不断获得装备、声望、金钱、经验、技能、荣誉、称号、宠物、魔法道具、材料等的系统,玩家一边玩,一边获得收益,玩家将会持续地沉浸在游戏世界中,也是游戏最容易黏住用户的地方,但这个结果对健康不见得有益,长时间游戏对于青少年是不健康的。因此,防沉迷系统被强制推行。2.2.4 幻想虚拟的游戏世界中,游戏设计者可以充分地发挥幻想,用户也可以体验到现实中没有的内容。例如角色长了翅膀,或把敌人变成可爱的绵羊,或当上了国王。这些都是体验的形式。2.2.5 消遣休闲这种价值主要针对上班族(实际上,学生们也同样享受着这种待遇),工作之余,找一个世外空间,在这个空间里,可以随心所欲地游荡在虚拟世界,也没有人管束。游戏过程中,经常获得各种各样的些奖励,比起迷茫地闲逛、观看枯燥无味的电视节目,更让人兴奋。2.2.6 故事体验游戏内必定承载一定内容的故事,这些故事可以和和影视节目或小说中的故事一样,但体验更为直接,玩家身临其境,亲自扮演故事中的角色。2.2.7 获得知识人类进入快速发展时期后,知识传播更为快速,知识不断地改进着人们的生活。如果有种方式,寓教于乐,那么这种方式必然是最容易接受的,游戏能很好地解决这个问题,那游戏就是健康的,可以是有益而无害的。在网络游戏对青少年成长造成各种的影响的今天,这种可以让人获得知识的健康的游戏形式,是游戏的最好出路。2.2.8 收获快乐幽默诙谐的故事最容易让让大众接受。让观众或用户能笑起来,生活总是乐观地态度,少一些抑郁,多一些欢乐,社会更和谐。2.2.9 满足审美需求艺术是人类以感情和想象作为特性的把握世界的一种特殊方式,即通过审美创造活动再现现实和表现情感理想,在想象中实现审美主体和审美客体的互相对象化。具体说,他们是人们现实生活和精神世界的形象反映,也是艺术家知觉、情感、理想、意念综合心理活动的有机产物。作为第九艺术,同样具备满足人类审美需求的功能。2.3 游戏特点首先,游戏简单易操控,只需点击屏幕就可操控。其次,益智,需要在规定时间内将需要碰撞的球消失掉,需要每一步都要计算最佳落脚位置。再者,有行走的动感,关卡背景会随着游戏角色的移动而移动。每一关卡都有新的东西加入进来,有的可以使主角反向旋转,有的会使主角停止运动。不同的东西被主角碰到后会有不同的反应。3 游戏开发相关技术3.1 FLASH游戏开发简介我就从Flash的基本情况、历史发展和设计方式简单介绍一下什么是Flash。并了解一下游戏开发。3.1.1 FLASH简介FLASH是一种创作工具计算机软件,目前最新的零售版本为Adobe Flash CS5.5 Professional(2011年发布),现在已经有FLASH CS6 Professional提供测试版本的下载。Adobe FLASH Professional CS5为创建数字动画和交互式Web站点提供了功能全面的创作和编辑环境。FLASH广泛用于创建吸引人的应用程序,它们包含丰富 的视频、声音、图形和动画。可以在FLASH中创建原始内容或者从其它Adobe应用程序(如Photoshop或Illustrator)导入它们,快速设计简单的动画,以及使用Adobe AcitonScript 3.0开发高级的交互式项目。设计人员和开发人员可使用它来创建演示文稿、应用程序和其它允许用户交互的内容。FLASH可以包含简单的动画、视频内容、复杂演示文稿和应用程序以及介于它们之间的任何内容。通常,使用FLASH创作的各个内容单元称为应用程序,即使它们可能只是很简单的动画。也可以通过添加图片、声音、视频和特殊效果,构建包含丰富媒体的FLASH应用程序。 3.1.2 FLASH历史简介FLASH的前身是Future Splash Animator(也有被称为SchockwaveAnimator),在出现时它仅仅作为当时交互制作软件Director和Authorware的一个小型插件,后来才由Macromedia公司出品成单独的软件。曾与Dreamweaver(网页制作工具软件)和Fireworks(图像处理软件)并成为“网页三剑客”。FLASH随着互联网的发展,在AdobeFlash4版本之后嵌入了ActionScript函数调用功能,使互联网在交互应用上更加便捷。该公司及旗下软件于2007年被Adobe公司收购并进行后续开发。(Macromedia最后一个版本为FLASH8,Adobe收购后第一个发布的版本为FLASH CS) 但是Adobe Flash Professional仅仅是FLASH CS5工具套件当中的一个产品。除了FLASH Professional之外,Adobe还提供了FLASH Catalyst和Flash Builder。Flash Catalyst是一个设计工具,它无需编写代码即可快速创建富有表现力的界面和交互式内容。FLASH Builder(以前称为Flex Builder)是适合于开发人员(而不是动画师或设计师)创建交互式内容的以代码为中心的环境。尽管开发平台不同,这3种工具最终都将生成相同的结FLASH内容(SWF文件)。FlashSWF文件在浏览器上的FLASH播放器中、浏览器外面的桌面上的AIR(Adobe Integrated Runtimem,Adobe集成运行环境)中或者在移动电话上运行。3.1.3 FLASH游戏设计简介Flash特别适用于创建通过Internet提供的内容,因为它的文件非常小。FLASH是通过广泛使用矢量图形做到这一点的。与位图图形相比,矢量图形需要的内存和存储空间小很多,因为它们是以数学公式而不是大型数据集来表示的。位图图形之所以更大,是因为图像中的每个像素都需要一组单独的数据来表示。 要在FLASH中构建应用程序,可以使用FLASH绘图工具创建图形,并将其它媒体元素导入FLASH文档。接下来,定义如何以及何时使用各个元素来创建设想中的应用程序。 FLASH是一个非常优秀的矢量动画制作软件,它以流式控制技术和矢量技术为核心,制作的动画具有短小精悍的特点,所以被广泛应用于网页动画的设计中,以成为当前网页动画设计最为流行的软件之一。 在FLASH中创作内容时,需要在FLASH文档文件中工作。FLASH文档的文件扩展名为.fla(FLA)。FLASH文档有四个主要部分: 舞台:舞台是在回放过程中显示图形、视频、按钮等内容的位置。时间轴:时间轴用来通知FLASH显示图形和其它项目元素的时间,也可以使用时间轴指定舞台上各图形的分层顺序。位于 较高图层中的图形显示在较低图层中的图形的上方。 库面板:库面板是FLASH显示FLASH文档中的媒体元素列表的位置。 ActionScript:ActionScript代码可用来向文档中的媒体元素添加交互式内容。例如,可以添加代码以便用户在单击某按钮时显示一幅新图像,还可以使用ActionScript向应用程序添加逻辑。逻辑使应用程序能够根据用户的操作和其它情况采取不同的工作方式。FLASH包括两个版本的ActionScript,可满足创作者的不同具体需要。FLASH包含了许多种功能,如预置的拖放用户界面组件,可以轻松地将ActionScript添加到文档的内置行为,以及可以添加到媒体对象的特殊效果。这些功能使FLASH不仅功能强大,而且易于使用。 3.2 游戏开发原则 游戏开发的原则包括很多种,我就从中选出游戏性原则、活性原则、可靠性原则和经济性原则进行简单论述。3.2.1 游戏性原则游戏作为统一整体而存在,因此,在游戏设计中,要从整个游戏的角度出发,游戏的代码要统一,设计规范要标准,传递语言要尽可能一致。3.2.2 活性原则为保持游戏的长久生命力,要求系统具有较强的环境适应性。为此,游戏应具有较好的开放性和结构的可变化性。在游戏设计中,应尽量采用模块化结构,提高模块的独立性,以便于对模块的修改,提高游戏适应环境变化的能力。3.2.3 可靠性原则可靠性既是评价游戏设计质量的一个重要指标,又是游戏设计的一个基本出发点。只有设计出的游戏是安全可靠的,才能在实际运行中发挥出它应有的作用。所以在系统设计中必须考虑到对各种不安全因素抵御能力的设计。例如安全保密、检错、抗病毒能力和在出现意外情况后,游戏恢复能力的设计等。3.2.4 经济性原则在满足游戏需求的前提下,尽可能的减少游戏的开销。这里既要考虑到现实系统的费用,又要考虑到游戏实施后的费用。3.3 面向对像编程简介面向对像编程英文名字,Object Oriented Programming,简称OOP。是九十年代才流行的一种软件编程方法。它强调对象的“抽象”、“封装”、“继承”、“多态”。我们讲程序设计是由“数据结构”+“算法”组成的。从宏观的角度讲,OOP下的对象是以编程为中心的,是面向程序的对象。3.3.1 面向对象编程的定义AlanKay(Smalltalk面向对象编程环境语言的发明人之一,也是面向对象编程思想的创始人之一)对OOP的定义:面向对象编程是基于递归设计的原则:一切都是对象。计算通过对象间相互通信,请求其他对象执行动作来实现。对象间通过发送和接收消息来通信。每个对象都有自己的内存,其中可能包括了其他的对象。每一个对象都是某个类的实例。类就是一组相似的对象。类是对象相关行为的储存库。也就是说,同一个类的所有对象都能执行同样的动作。 类被组织成有单个根节点的树状结构,被称为继承层次结构。与类实例相关的内存和行为都会被树结构中的后代自动继承。3.3.2 面向对象设计的概念面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现。 1、对象 对象是运行期的基本实体,它是一个封装了数据和操作这些数据的代码的逻辑实体。类:类是具有相同类型的对象的抽象。一个对象所包含的所有数据和代码可以通过类来构造。封装:封装是将数据和代码捆绑到一起,避免了外界的干扰和不确定性。对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。继承:继承是让某个类型的对象获得另一个类型的对象的特征。通过继承可以实现代码的重用:从已存在的类派生出的一个新类将自动具有原来那个类的特性,同时,它还可以拥有自己的新特性。多态:多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。 动态绑定:绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式。消息传递:对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。方法:方法(Method)是定义一个类可以做的,但不一定会去做的事。4 游戏设计4.1 角色设计游戏主角是两个相互旋转的球,一个是红球、一个是黄球,它们之间有一条线相连。两个球中只有一个球在旋转。当一个停下后另一个会围绕它旋转,当用鼠标点击游戏的界面时正在旋转的球会停止下来,而另一个球就会旋转运动。键盘的左右键也可以控制游戏主角的旋转运动。当落脚点控制恰当时,他们就会按照一定方向进行移动。如4.1图1所示: 4.1图1 游戏主角4.2 场景设计游戏共有九关,每一关对应一个场景。每个场景都有一个时间条,根据关卡的情况,时间条播放速度不同。时间到了游戏结束。第一关的场景,包括两个黄球(黄色的主角踩到或者碰到才能得分),两个红球(红色的主角踩到或者碰到才能得分),红球和黄球各有一个是平面球,另一个是立体球,还有两个立体的蓝球(碰到就得分)。如4.2图1所示:4.2图1 第一关第二关的场景,包括一个立体的红球,一个立体的黄球,两个立体的蓝球,两个平面的篮球,两个平面的灰球(会随机的减少时间和分数),还有四个静止的障碍物(碰撞后会反向漂移)。如4.2图2:4.2图2 第二关第三关的场景,包括一个立体的红球,一个立体的黄球,两个立体的蓝球,两个平面的黄球和红球,两个平面的灰球,还有两个移动止的障碍物,还有一个加时间的表(踩到才能增加时间)。如4.2图3:4.2图3 第三关第四关场景,三个立体蓝球,两个平面黄球,两个平面红球,两个白色的立体球,四个加时间的表,一个障碍物和一个平面灰球(碰撞三次才能被消灭并得分)。如4.2图4、4.2图5:4.2图4 第四关4.2图5 第四关第五关场景,包括两个静止的障碍物,两个黄球和两个红球(一个平面球,一个立体球),一个灰色的平面球,一个白色的立体球,两个黑色的刺球(碰到后会反向漂移并损失一颗红心,当没有红心时就会死亡),四个蓝球和一个加时间的表。如4.2图6和4.2图7:4.2图6 第五关4.2图7 第五关第六关场景,包括四个静止的障碍物,十个蓝色的球(六个立体球,四个平面球),四个黄球(两个立体球,两个平面球),四个红球(两个立体球,两个平面球),两个刺球,六个立体的绿球(可伸缩,碰到后会反向漂移),两个加时间表。如4.2图8和4.2图9:4.2图8 第六关4.2图9 第六关第七关场景,包括四个立体的绿球(可伸缩),两个黄球(一个平面球,一个立体球),两个红球(一个平面球,一个立体球),四个蓝球(两个立体球,两个平面球),三个立体的白球。两个可移动的刺球(碰到后会反向漂移并损失一颗红心)。如4.2图10和4.2图11:4.2图10 第七关4.2图11 第七关第八关场景,包括两个静止的障碍物,六个蓝球(两个立体球,四个平面球),两个平面灰球,两个立体的白球,两个红球(平面),两个黄球(平面),两个加时间的表,一个栅栏(时开时关,碰到后会停止旋转)。如4.2图12、4.2图13和4.2图14:4.2图12 第八关4.2图13 第八关4.2图14 第八关第九关场景,包括八个蓝球(四个平面球,四个立体球),四个红球(两个立体球,两个平面球),四个黄球(两个立体球,两个平面球),四个静止的障碍物,四个刺球(两个静止,两个移动),四个足球(碰撞后会反向旋转,足球会滚动,足球可以消去刺球),四个加时间的表。如4.2图15、4.2图16:4.2图15 第九关4.2图16 第九关4.3 界面设计共有七个主控界面:Loading界面,主要包括了开始动画、游戏名字、制作者和指导老师;游戏开始界面,有游戏主角和四个界面按钮;游戏界面,承载游戏关卡的界面;排行界面,输出按分数排列的排行榜;帮助界面,游戏规则的介绍;设置界面,背景声音控制、游戏难度控制、游戏控制方式控制和关卡选择转换按钮;关卡选择界面,提供关卡选择的功能。4.4 规则设计反向漂移的主角会一个绕另一个旋转,当点击鼠标左键时,会使反向漂移交换旋转;键盘的左右键亦可控制反向漂移交换旋转,按键盘左键,黄色的旋转球落脚,按键盘右键,红色的旋转球落脚。游戏主角在每一关都有三条性命。反向漂移的主角碰到不同的物体会有不同的反应:碰到障碍物和立体灰球会反方向旋转,并后移;碰到刺球会丧失生命;碰到绿颜色的球会得到金币;碰到平面的黄球或红球,只有颜色相同并踩上才能得到金币;碰到立体的黄球或红球,只有颜色相同才能得到金币,否则反向旋转,并后移;碰到栅栏会停止运动; 碰到足球会令足球前进,自己会反向旋转,并后移;只有足球才能将刺球打掉并得到金币,一个足球只能消去一个刺球;碰到平面的灰球会丢失一定的时间或金币,碰到时钟会得到一定的时间;时间到了会结束本关卡,生命值为零也会结束本关卡;只有通关后才能进入排行榜,排行榜就会记录下你的分数和名字;4.5 数据管理玩家的排行信息的存储和读取,使用的是Flash的共享对象,6英文名称为Shared Object(以下简称SO)。SO允许你在使用者本机上存储所有flash支持的数据(包括:Array, Boolean, Date, Number, Object, String, XML.etc),如同在浏览器中使用cookie一样。SO的存储位置,一是本地客户端的硬盘;二是存放在服务器上。在这里,我只能简单介绍一下本地共享对象(Local shared object)的使用。本地共享对象存储默认存储路径为:C:DocumentsandSettings登陆名称ApplicationDataMacromediaFlashPlayer服务器网域名称影片路径影片文件名.swf.其扩展名为*.sol。默认情况下,Flash 可以在本地保存多达 100K 大小的永久性远程共享对象。4.5.1 Shared Objcet使用方法在ShareObject中存储简单数据是相当简单的工作,我们先用ShareObject存储一个用户自定义的对象,然后将讨论用ShareObject存储内建类的实例的问题。一个用户自定义对象可以这样创建: myObj = new Object(); 在ShareObject中存储myObj是很简单的,首先你需要创建一个本地ShareObject的引用:myLSO = SharedObject.getLocal(foo);getLocal方法的第一个参数是ShareObject的名字,getLocal()方法也有第二个可选参数:一个字符串类型的路径。大多数情况下你用不到这个参数,除非你在多个swf文件中共用同一个ShareObject。现在为了在ShareObject中储存数据,你需要给ShareObject指定“数据特性”(data property)。现在创建一个ShareObject引用,以及你想存储的对象,最后存储这个对象到“数据特性”中。例子:myLSO = SharedObject.getLocal(foo);myObj = ; myObj.fname = Jessica;myObj.lname = Smith;myLSO.data.myObj = myObj; myLocalSharedObject.data;描述:只读属性,用来存储被存储到“数据特性”中的对象的属性,这些属性可以共享/存储,每一个属性可以是各种基础数据类型(数组,数字布尔值等)对象。现在myObj已经存储在SharedObject中了,今后你可以通过对SharedObject数据属性的存取来实现对myObj的存取,下面是一个例子,这个例子检测是否数据已经被存储到SharedObject中了,如果没有,它将数据存储进去,如果已经存在,则在输出窗口输出。当你将这些代码放到一个空的影片剪辑的第一祯后,你可以运行它一次,然后在运行一次,第二次运行你可以看到你存储的数据被输出。 一定要先保存动画,否则你的动画只是在windows临时文件夹中运行,不能存储数据。myLSO = SharedObject.getLocal(foo);if(myLSO.data.myObj = undefined) trace(Storing Data, run me again);myObj = ; myObj.fname = Jessica;myObj.lname = Smith; myLSO.data.myObj = myObj; else trace(Retrieving Data); var firstname = myLSO.data.myObj.fname; var lastname = myLSO.data.myObj.lname;trace(First Name: +firstname); trace(Last Name: +lastname); 运行一次以上后,你可以将程序改为:myLSO = SharedObject.getLocal(foo);trace(Retrieving Data); var firstname = myLSO.data.myObj.fname; var lastname = myLSO.data.myObj.lname;trace(First Name: +firstname); trace(Last Name: +lastname); 你会发现无论你重复运行多少次,甚至关闭flash后重新进入,仍然能够得到firstname和lastname的值。另外你应该可以理解getLocal()方法的参数的作用了,它用来表示你所存储的数据的载体名称,是必不可少的。例如本例中的数据都存储在名为foo的SharedObject中,只有getLocal(foo),你才能得到你想要的结果。你还可以存储更多内建类型:数组,布尔值,日期,数字,对象,XML,undefined,null下面是一个将日期实例存储在SharedObject中的例子:myLSO = SharedObject.getLocal(DateStorage); myDate = new Date(); myLSO.data.myDate = myDate;4.6 游戏的结构共有七个界面,开始界面为主界面,开始界面上有四个按钮,可以调动开始游戏界面、设置界面、帮助界面和排行榜界面,而设置界面中的选择关卡按钮可调动关卡选择界面。开始游戏界面是运行游戏的主界面,个个关卡在其中转换,当过关失败后,会转到游戏失败的界面,玩家可以选择继续游戏和返回开始界面。当闯关成功后会转到过关的界面,玩家也可以选择继续游戏和返回开始界面。只有通关后才会转到排行输入界面,进而进入排行榜的界面,记录下玩家的名字和最高分。结构如4.6图1:Loading界面帮助界面设置界面排行榜界面开始界面游戏运行关卡选择背景声音游戏难度控制方式成功过关关卡过关失败关卡选择4.6图1 游戏结构图4.7 主要模块主控模块:控制游戏进程、界面转换、数据管理、声音控制和背景移动等等。是由文档类(StartMain.as)和元件里的控制代码进行控制。文档类是主控模块的核心,元件里的代码是辅助文档类控制游戏。这样做使控制灵活、多变、便于更改和减少代码的数量。角色模块:主角的运动方式和属性和物品的属性和运行方式。凡是关于角色和物品的基本属性都是继承与角色类的基类(BasicBall.as),其他的属性都是各具特色的。例如角色和物品的大小、状态和碰撞性质都是基类定义的。而他们的运行方式、分数、碰撞后性质变化都是不同的,需要在自己的类中定义。这样利于统一管理,方便扩展。关卡模块:游戏关卡的设计、碰撞管理、物品管理、分数管理等等。每一个关卡都是继承自关卡的基类。关卡的基类(LevleMap.as)定义了关卡的基本属性,包括碰撞、物品的控制方式、分数管理。而物品的摆放、物品的数量和类型、碰撞后的分数反馈是不同的。5 游戏开发5.1 开发思路该游戏的开发思路是:第一步:设计游戏角色和场景,包括游戏主角、游戏的对象和游戏的场景。第二步:设计游戏方式,包括游戏对象的运行方式、主角的运动方式、游戏规则等等。第三步:游戏的结构设计,包括游戏的界面与界面的关系和关卡的转换关系。第四步:数据的传递和存储,该游戏主要的是游戏分数的传递和存储。5.2 游戏开发的编程Flash游戏的编程是比较简单的,Flash编程使用的语言是ActionScript,它属于面向对象语言。在前面已经介绍了,这里就不赘述了,下面我就结合实例说明我在本游戏中的主要编程。5.2.1 游戏主角运行的核心算法运行主要算法:主角的其中一球叫A球,另一球叫B球,第一、当B停止旋转时,A会围绕B旋转;第二、当A停止旋转时,B会围绕A 旋转;第三、A和B只有一球围绕另一个球旋转;第四、当玩家点击控制键时,正在旋转的球停止旋转。旋转算法,例如A围绕B旋转。第一、得到两者的坐标(A.x,A.y)和(B.x,B.y),计算A相对于B的角度;第二、用A围绕B旋转的角速度Speed加上阿尔法,即可算出每次A相对于B旋转时的角度偏移量,得到两者的固定旋转半径R;第三、根据公式:A.x=B.x+sin*R;A.y=B.y+cos*R即可算出旋转后的坐标;第四、返回第一步,就可以让A围绕B做匀速圆周运动。旋转算法的AS3代码实现:stage.addEventListener(MouseEvent.CLICK,onMouse,false,0,true);/鼠标侦听,两球旋转 public function onMouse(event:MouseEvent):void if (A.State=run) this.removeEventListener(Event.ENTER_FRAME,onABall);/两球之间的角度,改变A球的状态vrAngle=Math.atan2(B.y-A.y,B.x-A.x);this.addEventListener(Event.ENTER_FRAME,onBBall,false,0,true);B.State=run;if (A.State=stop) this.removeEventListener(Event.ENTER_FRAME,onBBall);/两球之间的角度,改变A球的状态 vrAngle=Math.atan2(A.y-B.y,A.x-B.x);this.addEventListener(Event.ENTER_FRAME,onABall);A.State=run;/A球绕B球旋转private function onABall(event:Event):void if (A.State=run) /旋转公式vrAngle=vrAngle+hi*vrSpeed;/旋转角度每次增加“hit*vrSpeed”。hit的正负,表示方向A.x=B.x+Math.cos(vrAngle)*spinRadius;A.y=B.y+Math.sin(vrAngle)*spinRadius;B.State=stop;/B球绕A球旋转private function onBBall(event:Event):void if (B.State=run) /旋转公式vrAngle=vrAngle-hit*vrSpeed; /旋转角度每次增加“hit*vrSpeed”。hit的正负,表示方向B.x=A.x+Math.cos(vrAngle)*spinRadius;B.y=A.y+Math.sin(vrAngle)*spinRadius;A.State=stop;5.2.2 碰撞检测方式基于距离的碰撞检测和基于显示对象的碰撞检测。对于Flash的很多版本,影片剪辑里有一个内置的方法为hitTest,现在,它已经被更合理的分成了两种独立的方法。hitTestObject方法用于测试一个显示对象(精灵、影片剪辑等等)是否碰撞到另外一个,hitTestPoint方法用来检测一个指定的点是否碰撞到一个显示对象。而基于距离的碰撞检测的基本思路如下:两个圆的距离如果小于两圆半径只和就可以判定这两个圆发生碰撞了。代码如下:ball1表示一个球,ball2表示另一个球:var dx:Number = ball2.x - ball1.x; /两者x的差var dy:Number = ball2.y - ball1.y; /两者y的差var dist:Number = Math.sqrt(dx * dx + dy * dy);/两者的距离 /如果两者的而距离大于两者的半径和则,输出碰撞if (dist ball1.radius + ball2.radius) trace(hit); 声音控制,声音的控制主要使用的是Flash里的media包的Sound类和SoundChannel类进行加载和控制。例如加载并使用song.mp3这个音频,首先声明一个Sound的对象将音频加载进来:var sound:Sound=new Sound(song.mp3);接着声明一个SoundChannel类的对象:var soundChannel:SoundChannel=new SoundChannel();然后将控制方式交给soundChannel播放声音:soundChannel=sound.play();最后停止播放音频是由soundChannel控制的:soundChannel.stop()。类的关系:主要的类包括,主角类(TwinsBall.as):主要控制,主角的运动、响应用户的交互和主角的属性;球类基类(BaseBall.as):各种球类物品的基类,定义了球类物品的基本属性;文档类(StartMain.as):控制游戏的进程、关卡的转换、参数的传递以及响应用户的交互;主界面上时间轴上的代码:主要控制界面的转换、数据的管理和保存。关卡类基类(LevleMap.as):关卡的属性、碰撞管理、关卡物品和分数传递等。类图如5.2图1所示:BaseBall(基类)*BadBall(刺球)*RunBall(足球)*BigBall(主角黄球)*TdRedBall(立体红球)*AddTimes(加时间的表)*TdYellowBall(立体黄球)*BlueBall(立体蓝球)*WhiteBall(立体白球)*SmallBall(主角红球)*YellowBall(平面黄球)*FloorBlueBall(平面蓝球)*RedBall(平面红球)*GrayBall(立体绿球)*LostTimes(平面灰球)StartMain(文档类类)TimeLine.as(时间条类)子类LevleMap(基类)子类* Levle0Map(开始界面)* Levle05Map(第五关)* Levle01Map(第一关)* Levle06Map(第六关)* Levle02Map(第二关)* Levle07Map(第七关)* Levle03Map(第三关)* Levle08Map(第八关)* Levle04Map(第四关)* Levle09Map(第九关)Fence.as(栅栏类)TwinsBall(主角类)5.2图1 类图5.2.3 自定义事件在AS3中实现自定义事件发送者有多种方法,其本质只有一个EventDispatcher。这里有三种:一是通过继承来实现;二是通过复合来实现;三是通过实现接口来实现。在AS3事件中有3个要素,如下5.2图2所示: 5.2图2 类图下面简单介绍一下事件的简单用法,addEventListener事件监听传递参数,例如下面的就是一个简单的例子:var sayHello:String = how are you;btn1.addEventListener(MouseEvent.CLICK,function (e:MouseEvent)clickHandlerWithArg(e,sayHello);function clickHandlerWithArg(e:MouseEvent,arg:String):voidvar out:String= e.target + 发出事件(有参数) : + arg;trace(out);其实发消息的时候传参数在2.0里面是很方便的,但3.0里面要去写一个类去继承Event这个类,感觉麻烦了许多,在我学习3.0的初期一直不是 很理解到了3.0为什么变复杂了,所以刚开始经常会用到扩展Event这个类,但到后来发现只要程序的架构写好了,这种方法是可有可无了,不过今天还是要 讲解这种方法的使用.我们先写一个继承Event的类:package net.smilecn import flash.events.Event; public class MyEvent extends Event private var _object:Object; public function MyEvent(type:String,object:Object):void super(type); _object=object; public function get param():Object return _object; 这个一个很简单的类,继承了Event这个类,在构造方法里有一个super(type),super的意思是执行父类的构造方法,也就是执行Event 的构造,type是消息的类型,就是消息的名字,一个字符串,object就是我们要传的参数要用到的一个变量,是一个对象,我们知道对象是很方便的,可 以存储1到多个参数,下面是一个GET方法,通过param这个名字去取_object这个对像的值.再来看一下怎么用这个MyEvent类,修改上一节中的文件MyClass:package net.smilecn import flash.display.Sprite; import flash.events.MouseEvent; import net.smilecn.MyEvent; public class MyClass extends Sprite public function MyClass() addEventListener(MouseEvent.CLICK,clickHnadler); private function clickHnadler(event:MouseEvent):void dispatchEvent(new MyEvent(myClassMessage,a:100,b:200); 我们发现修改代码并不多,由new Event变成了net MyEvent,也就是说以前发的消息是as自带的Event事件,现在发的是我们自己写的MyEvent事件,再看参数还有一个 a:100,b:200,这个参数就是我们传进去的对象,这个对象有两个属性值,一个叫a,值为100,一个叫b,值为200。再来看文档类:package net.smilecnimport flash.display.Sprite; import net.smilecn.MyEvent; import net.smilecn.MyClass; public class MainForm extends Sprite private var myClass:MyClass; public function MainForm() myClass = new MyClass(); addChild(myClass); myClass.addEventListener(myClassMessage,myClassMessageHandler); private function myClassMessageHandler(event:MyEvent):void trace(你收到了myClass的消息:a=+event.param.a+ b=+event.param.b); 文档类中修改的地方是侦听到消息后执行的方法,我们发现参数的类型变成了MyEvent,因为我们发的是MyEvent的事件,这里收到事件的类型当然是 MyEvent,在event.param就是去取MYEevent_object,就是我们在MyClass传过的对象了,event.param.a 的值就是100,event.param.b的值就是200,这样我们就达到了传递参数的目的了.5.2.4 画线方式主角之间的连线是有一个画线函数进行控制的,接下来我就简单介绍一下画线的方式。下面是一个简单的画线代码:this.createEmptyMovieClip(draw_mc, 1); / 创建一个影片剪辑 draw_mc.lineStyle(1, 0x99CCFF); / 设置线条样式 draw_mc.moveTo(0, 0); / 绘画的起点 draw_mc.lineTo(100, 100);/ 画到某一点 而在主角进行旋转运动时,有一个监视器时时检测两个主角的坐标,并反馈给画线函数,然后画线函数会依照这两个坐标进行画线。并且会有一个清理器时时清除绘制过的线,这样两个主角就连接起来了。画线函数的代码如下:/新建连线的的画线存储器private var lostLines:Shape =new Shape();drawLine.addEventListener(TimerEvent.TIMER,onDrawLi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土方运输与堆存规划方案
- 防水施工质量控制方案
- 堤防溃口预防与应急响应方案
- 塑钢门窗安装施工组织设计
- 产业园区生态环境影响评估与优化方案
- 宜昌疾控考试题目及答案
- 水利工程项目空地租赁及水资源利用合同
- 现代化婚内子女抚养责任、监护权及财产支持合同
- 垃圾处理厂环境影响评价技术协作协议
- 物业企业总经理职位聘用与品牌建设合同
- 2025 精神科护理抑郁患者干预医学查房课件
- 遵义介绍课件
- 播音主持重音的教学课件
- 安全生产晨会记录表模板
- 2025至2030全球及中国轻型商用车(LCV)行业项目调研及市场前景预测评估报告
- 2025年福建省选调生考试综合知识真题解析试卷
- 酒店工程节能降耗培训
- 飞书软件使用培训
- NSM安全管理体系培训
- 单位工会钓鱼活动方案
- 采购廉洁警示教育
评论
0/150
提交评论