Flash 游戏 毕业论文

更新时间:2024-06-14 19:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

毕业设计(论文)

课题名称: Flash游戏制作——坦克大战

学 院: 软件学院 专 业: 信息工程 班 级: 081131

二零一二 年 四 月

摘 要

flash游戏是一种新兴起的游戏形式,以游戏简单,操作方便,绿色,无需安装,文件体

积小等优点现在渐渐被广大网友喜爱。由于flash游戏主要应用于一些趣味化的、小型的游戏之上,以完全发挥它基于矢量图的优势。flash游戏因为Flash CS 3和ActionScript 3。0的原因,在近年发展迅速,许多年青人投身其中,并在整个flash行业中发挥重要作用。flash player占据了90%互联网用户的浏览器,所以发的发展空间还十分巨大,前途不可估量。

制作游戏的初衷是因为在当今人们的工作很繁琐枯燥,在闲暇时能玩玩一些小游戏来放

松自己。本游戏运用了Flash基本知识与精巧的算法还原了90年代的经典游戏——坦克大战,由于是Flash游戏,在进网页浏览时要尽可能的减少游戏加载速度和提高游戏运行速度,所以游戏模型采取了最简单的矢量图绘制而成,放弃了色彩比较丰富的位图,整个游戏作品仅22KB大小,与静态网页的大小相差无几,完全满足一般网络带宽的加载需求。

游戏算法方面采用了面向对象程序设计,面向对象的编程引进了类的概念,在本文中重

点介绍了类的使用方法。游戏中每一个游戏元素都采用不同的类进行了封装,代码采用最新Flash CS 4。0中的ActionScript3。0,在AS3。0中每个类的脚本代码都用一个独立的*。as文件保存,在游戏中每一个元素都是一个独立的类,比如子弹类实现了子弹检测是否击中敌人的功能、玩家控制的坦克类实现了玩家坦克上下左右移动和射击的功能、敌军坦克类实现敌人自主移动和射击的简单人工智能功能等等,这些都体现了类的封装概念,让设计者更加轻松、读者更加易懂。

关键词: flash;碰撞;射击; 移动

目 录

第1章 绪论 .................................................................... 1

1。1 Flash软件简介 ......................................................... 1 1。2 Flash的特点 ........................................................... 1 1。3 Flash的发展现状与前景 ................................................. 2 1。4 Flash游戏 ............................................................. 3 1。5 Flash游戏的发展方向 ................................................... 4 第2章 游戏设计思路 ............................................................ 5

2。1 坦克大战的玩法和技术评分 .............................................. 5 2。2 坦克大战的框架与交互元件的组成 ........................................ 5 2。3 坦克大战游戏算法设计 .................................................. 9 第3章 坦克大战游戏实现 ....................................................... 11

3。1 游戏布局 ............................................................. 11

3。1。1 游戏主界面 ..................................................... 12 3。1。2 全局脚本 ....................................................... 12 3。1 玩家类 ............................................................... 14

3。2。1 玩家坦克的移动 ................................................. 14 3。2。2 玩家坦克发射子弹 ............................................... 18 3。2 玩家子弹类 ........................................................... 19

3。3。1子弹的速度与方向 ............................................... 19 3。3。2 子弹的碰撞 ..................................................... 21 3。3 敌人类 ............................................................... 23

3。4。1简单人工智能 ................................................... 24 3。4。2 敌人的移动 ..................................................... 24 3。4。3 敌人发射子弹 ................................................... 26 3。4。4敌人与玩家子弹的碰撞 ........................................... 26 3。4 敌人子弹类 ........................................................... 27

3。5。1 敌人子弹的速度和方向 ........................................... 28 3。5。2 敌人子弹的消失条件 ............................................. 28 3。5 领主类 ............................................................... 29

3。6。1 领主的登场 ..................................................... 30 3。6。2领主的移动和射击 ............................................... 30 3。6。3 领主的生命值 ................................................... 30 3。6。4 领主被击败了 ................................................... 31 3。6 领主子弹类 ........................................................... 33

3。7。1 领主子弹的移动 ................................................. 34 3。7。2 领主子弹与玩家的碰撞 ........................................... 35 3。7 玩家生命值 ........................................................... 36

3。8。1 生命值的宽度 ................................................... 37 3。8。1 游戏如何失败 ................................................... 37 3。8 关卡 ................................................................. 39

3。10。1 关卡的组成 .................................................... 40 3。9 游戏结束与得分 ....................................................... 41

2

3。11。1 玩家的分数总结 ................................................ 41 3。11。2 游戏的重新开始 ................................................ 41

总 结 ........................................................................ 42

3

第1章 绪论

1。1 Flash软件简介

早期Flash是由macromedia公司推出的交互式矢量图和 Web 动画的标准,后来被Adobe公司收购,将Flash升级为Flash CS系列,现在已更新到Flash CS 5,Flash CS引进了photoshop技术,并且将ActionScript从2。0升级到了3。0,以前的Flash代码部分从Flash文件内部移动到了文件外部,使开发者和设计者都能简单的进行查找和修改,运行速度也提升了5-30倍,功能更为强大。网页设计者使用 Flash 创作出既漂亮又可改变尺寸的导航界面以及其他奇特的效果。Flash也是存储芯片的一种,通过特定的程序可以修改里面的数据。

Flash是一种创作工具,设计人员和开发人员可使用它来创建应用程序、演示文稿和其它允许用户交互的内容。Flash可以包含视频内容、简单的动画、复杂演示文稿和应用程序以及介于它们之间的任何内容。

Flash特别适用于创建通过Internet提供的内容,因为它的文件非常小。Flash是通过广泛使用矢量图形做到这一点的。与位图图形相比,矢量图形需要的内存和存储空间小很多,因为它们是以数学公式而不是大型数据集来表示的。位图图形之所以更大,是因为图像中的每个像素都需要一组单独的数据来表示。

在Flash中创作内容时,需要在Flash文档文件中工作。Flash文档的文件扩展名为*。fla。

Flash文档有四个主要部分: 1. 2.

舞台是在回放过程中显示图形、视频、按钮等内容的位置。在Flash基础中将对舞台做详细介绍。

时间轴用来通知Flash显示图形和其它项目元素的时间,也可以使用时间轴指定舞台上各图形的分层顺序。位于较高图层中的图形显示在较低图层中的图形的上方。 3. 4.

库面板是Flash显示Flash文档中的媒体元素列表的位置。

ActionScript代码可用来向文档中的媒体元素添加交互式内容。例如,可以添加代码以便用户在单击某按钮时显示一幅新图像,还可以使用ActionScript向应用程序添加逻辑。逻辑使应用程序能够根据用户的操作和其它情况采取不同的工作方式。Flash的ActionScript代码可以写在Flash文档内部,也可以写在外部。

1。2 Flash的特点

1. 使用矢量图形和流式播放技术。与位图图形不同的是,矢量图形可以任意缩放尺寸

而不影响图形的质量;流式播放技术使得动画可以边播放边下载,从而缓解了网页

1

浏览者焦急等待的情绪。

2. 通过使用关键帧和图符使得所生成的动画(。swf)文件非常小,几K字节的动画文件

已经可以实现许多令人心动的动画效果,用在网页设计上不仅可以使网页更加生动,而且小巧玲珑下载迅速,使得动画可以在打开网页很短的时间里就得以播放。 3. 把音乐,动画,声效互方式融合在一起,越来越多的人已经把Flash作为网页动画

设计的首选工具,而且可以支持MP3的音乐格式,这使得加入音乐的动画文件也能保持小巧的‘身材’。

4. 强大的动画编辑功能使得设计者可以随心所欲地设计出高品质的动画,通过ACTION

可以实现交互性,使Flash具有更大的设计自由度,另外,它与当今最流行的网页设计工具Dreamweaver配合默契,可以直接嵌入网页的任一位置,非常方便。

1。3 Flash的发展现状与前景

目前,FLASH动画越来越受到国人的关注。2001年前后,FLASH软件开始在中国的动画市场风行。这个由美国MACROMEDIA公司推出的一款多媒体动画制作软件,作为交互式动画设计工具,可以将音乐、声效和可动的画面方便地融合在一起,以制作出高品质的动态效果,造就了一种新的动画形式—FLASH动画。短短几年时间,FLASH动画就从网络迅速推广到影视媒介,其发展速度之快,出乎很多人的意料。

FLASH动画最早通过网络流通,并随着网络技术的飞速发展,深入人们的日常生活。这一优秀的矢量动画编辑工具给我们带来了强有力的冲击,使我们能够轻易地将丰富的想象力可视化。现如今,Flash已经逐渐被国内用户所认识和接受,并随之出现一大批忠实的追随者。在网络上,对FLASH动画贡献最大的要数那些“闪客”们了,无数年轻人借助FLASH技术实现了他们的创意和梦想。如边城浪子、老蒋、IM,等“闪客”们,为中国的FLASH动画事业做出了不可磨灭的贡献。中国有一千万人喜欢看FLASH,有七、八十万人喜欢做FLASH,作为MACROMEDIA中国用户联盟(CHINA;MMUG)秘书长,冯嵘认为这样的数字已经表明,一个有着大量需方和供方的市场已经形成。只有FLASH形成产业,找到自身的盈利增长点,才能使“闪客”成为一种职业,进而促进更多优秀作品的出现。一些优秀作品对于推动FLASH动画事业也起到了不可低估的作用。

近两年,各电视台动画频道也陆续播放由FLASH制作的动画片,如现在热播的《喜羊羊和灰太狼》,《饮茶之功夫学园》等,都受到了业内人士及大众的一致好评。可见,中国电视观众已经完全接受了FLASH动画这种新的艺术表现形式。短短几年时间,FLASH动画就从网络迅速推广到影视媒介,其发展速度之快,出乎很多人的意料。

从FLASH软件本身特性来看,它在动画制作上较其他软件有很多优势和独到之处。首先,FLASH简单易学,容易上手。很多人不用经过专业训练,通过自学也能制作出很不错的FLASH动画作品。其次,用FLASH制作出来的动画是矢量的,不管怎样放大、缩小,都不会影响画

2

面质量,而且播放文件很小,便于在互联网上传输。它采用了流技术,只要下载一部分,就能欣赏动画,而且能一边播放一边传输送数据、FLASH有很多重要的动画特征,能实现较好的动画效果、FLASH的人机交互性可以让观众;通过点击按钮、选择菜单来控制动画的播放、最后,你可以建立FLASH电影,把动画输出为许多不同的文件格式,便于播放。正是有了这些优点,才使FLASH日益成为网络多媒体的主流。

从动画制作工序和周期上来看,FLASH动画比传统动画在工序流程有一定简化和较多的削减,制作周期大为缩短传统动画片虽然有一整套制作体系保障它的制作,但还是有难以克服的缺点。一部10分钟的普通动画片,要画几千张画面。像大家熟悉的《(大闹天宫》,1分钟的片长需要画10万多张画面。如此繁重而复杂的绘制任务,需要几十位动画作者,花费3年多时间才能最终完成。传统动画片在分工上非常复杂,要经过导演、美术设计师、原画、动画、绘景、描线、上色、校对、摄影、剪辑、作曲、对白配音、音乐录音、混合录音、洗印等十几道工序,才可以顺利完成。目前,FLASH动画主要分为商业用途和个人创作,包括产品广告、网站、故事短片、MTv等。FLASH作者从接到任务,到最后分布完成,差不多都是一个人。虽然FLASH动画相较于传统动画来说,在画面动作衔接上不太流畅,略显粗糙,但是有自己特有的视觉效果。比如,画面往往更夸张起伏,以达到在最短时间内传达最深感受的效果,适应现代观众的审美需要。在制作周期上,半小时的节目,若用FLASH技术制作,大约3—4个月就可完成,若用其他技术通常需用10一14个月。

从动画制作成本上来看,传统动画片制作成本最低也要10000元/分钟,一部动画短片的制作成本至少需要几十万,还不包括广告费、播出费等。再加上市场运作与相关产品开发等,制作成本大大高于收入,也因此制约了传统动画片的发展。而FLASH动画制作成本非常低廉,只需一台电脑,一套软件,作者就可以制作出绘声绘色的FLASH动画,大大减少人力、物力资源以及时间上的消耗。在目前中国动画市场资金短缺的环境张下,FLASH动画非常适合中国的国情。

总之,FLASH动画相对于传统动画的优势非常明显。当前,FLASH动画在中国的发展取得了一定的进展,但是全盛时代还没有到来。随着网络时代的到来,传统媒体和非传统媒体必将在相互竞争中不断向前发展,FLASH动画必将随着自身技术和形式上的更大突破,展现出更为广阔的前景。

1。4 Flash游戏

Flash游戏是由Flash动画演变而来,在游戏形式上的表现与传统游戏基本无异,但主要生存于网络之上,因为它的体积小、传播快、画面美观,所以大有取代传统web网游的趋势,现在国内外用Flash制作无端网游已经成为一种趋势,只要浏览器安装了ADOBE的Flash player,就可以玩所有的flash游戏了,这比传统的web网游进步许多信息资料收集,需求分析

对于Flash游戏而言,容量同比来说是最小的,而且占用时间很短,可以起到放松娱乐,

3

休闲身心的作用,其具体有体积小、内容好、耐玩、娱乐性高、无年龄层次、能修改难度、有益身心健康、数量多、玩法丰富新颖等特色。

1。5 Flash游戏的发展方向

Flash被称为是“最为灵活的前台”。结合ActionScitp的对象和流程控制。使得在灵活的界面设计和动画设计中成为可能,但一直还未形成一套在flash中的界面设计理论。同时它也是最为小巧的前台。

Flash具有跨平台的特性(这点和Java一样),所以无论你处于处于何种平台,只要你安装有支持的Fash Player。你就能保证它们的最终显示效果都一致。而不必像在以前的网页设计中那样为IE和Mozilla或NetSpace各设计一个版本。同Java一样。它的可移植性很强。特别是在小型网络中和小型设备中(当然大型网络已不用说),最近具有的手机支持功能可以让你为自已的手机设计你喜爱的功能。当然你必需要有支持Flash的手机。当然它还可以应用于Pocket PC上。

目前利用Flash开发出了许多夸平台的网络游戏,甚至可以匹敌大型MMOR,在3G时代到来以后,我们很快可以在手机上玩到大型网络游戏,现有的FLASH制作网络游戏有:SLG类(热血三国),体育类(热血球球),RPG类(凡人修真),桌面(德州扑克),TD类(保卫家园)等等。

FLASH小游戏的流行

FLASH是开发的网页富媒体及强交互技术,最初用来研发交互式或动画网站组件,近几年获得了突飞猛进的发展。根据Adobe公司的统计,其互联网PC桌面普及率达到了惊人的99%,而JAVA为85。1%。目前FLASH更在大力向PDA及智能手机终端发展。

FLASH技术包含一套可编程脚本解析器,称为ActionScript,使用与Java及Javascript类似语法,可以控制FLASH动画,实现多种交互功能。AS3。0更支持了Socket联网功能,使得开发大型交互式网页游戏成为可能。凭借ActionScript2。0及ActionScript3。0的出色表现,FLASH技术成为了绝大多数小游戏开发的技术基础。 FLASH的解析器,称为Flash Player,体积十分小巧。不仅可以支持流行的IE浏览器,还可以支持Firefox, Opera, Safari等多款浏览器,用户下载安装非常方便。这也是Flash小游戏流行的重要原因之一。

4

第2章 游戏设计思路

2。1 坦克大战的玩法和技术评分

坦克大战是经典的键盘类小游戏,玩家通过键盘的上下左右控制一两小坦克移动、

CTRL发射子弹来击毁敌人。击毁的敌人越多,得分越高;如果被敌人击毁,则游戏失败。游戏失败后如果想重新开始坦克大战只需要按下SPACE即可。屏幕左上角有玩家的生命值,每击毁一辆敌军坦克则自动增加一定数量的生命,若生命值的宽度为0,则游戏失败。屏幕上方显示了玩家当前的分数值,击毁的坦克越多,则得分越高,右上方为领主血量统计,只有当领主存在时它才会显示出来。在游戏运行中,每隔一定时间就会在游戏区的任意一个位置刷新出一辆普通敌军坦克,玩家需要将他们一一击毁,当游戏运行一段时间后,领主坦克将出现在游戏区中,这时普通敌军坦克将会停止刷新,领主有专用的子弹和身躯。玩家只需要一对一的对付领主,将其击毁,如果将领主击毁后,将会自动进入下一关。

2。2 坦克大战的框架与交互元件的组成

坦克大战包含了以下元件:

1。 游戏布局元件,如图2。2。1所示。游戏布局元件是所有对象的一个容器,其他所有的对象都在它的内部,便于游戏的管理和游戏数据的存储。

图2。2。1 游戏布局元件

5

2. 关卡元件,如图2。2。2所示。关卡元件中包含了八个墙对象,它是一个逐帧动画,每一帧中8面墙的大小和摆放都不一样,模拟每一个关卡的界面。

图2。2。2 关卡元件

3。 墙元件,如图2。2。3所示。墙元件存在与关卡元件中,它的作用是阻挡玩家、敌人和子弹。

图2。2。3 墙元件

4。 玩家元件,如图2。2。4所示。玩家类使用了键盘控制系统来操作玩家坦克在关卡中移动,同时还会发射子弹。

图2。2。4 玩家元件

6

5。 子弹元件,如图2。2。5所示。子弹元件特指玩家发射的子弹,它的功能是击毁敌人。

图2。2。5 子弹元件

6。 敌人元件,如图2。2。6所示。敌人元件在游戏中作为普通敌人,能向上下左右四个方向自主进行移动和射击。

图2。2。6 敌人元件

7。 敌人子弹元件,如图2。2。7所示。敌人子弹为普通敌人发射的子弹,能向上下左右四个方向移动,攻击力较小,若玩家与之碰撞会损失一定生命值。

图2。2。7 敌人子弹元件

7

8。 领主元件,如图2。2。8所示。领主是每个关卡的最后一个敌人,能在游戏中任意移动不受墙的约束并且拥有自己的生命值,与普通敌人一样也能自主移动和射击。

图2。2。8 领主元件

9。 领主子弹元件,如图2。2。9所示。领主子弹是领主发射的专用子弹,能全方位360度移动,攻击力非常强大,与玩家碰撞则会损失大量生命值。

图2。2。9 领主子弹元件

10。 生命值元件,如图2。2。10所示。用以显示玩家的生命值,本身不具备代码,在游戏中通过判断其宽度来确定玩家是否被击毁。

图2。2。10 生命值元件

8

11。 游戏结束元件,如图2。2。11所示。游戏结束元件是当玩家坦克被击毁时,用于显示玩家的得分、军衔等级和游戏帮助的界面。

图2。2。11 游戏结束元件

2。3 坦克大战游戏算法设计

由于坦克大战游戏只有失败界面,没有过关界面,所以游戏算法不是开始——结束型流程,它由两个大循环组成。第一个大循环为游戏循环,即击毁敌军来提升分数的循环。第二个大循环为初始化的循环,即玩家失败后游戏可以重新开始。第一个大循环游戏循环也由两个循环构成,第一个是敌人的循环,每过一定时间就会刷新出一辆普通坦克,在普通坦克刷新出一定数量时刷新出一辆领主坦克。第二个循环为关卡循环,每关开始时,每过一定时间刷新一辆普通坦克,再过一定时间刷新一辆领主坦克,当领主坦克在场时,普通坦克不会再次被刷新出,当领主坦克被击毁时,重复关卡开始时的循环。算法流程图如图2。3。1所示。

9

图2。3。1 坦克大战算法流程图

10

第3章 坦克大战游戏实现

3。1 游戏布局

游戏布局元件是整个游戏元件,其他所有的元件都是游戏布局元件的子对象,如果将其删除那舞台上将不会存在任何对象,界面如图3。1。1所示。游戏布局元件包含两大部分,第一是功能图层,其中包含了游戏的功能性元件,例如玩家、关卡和生命值等;第二是特效图层,在图3。1。1中以“boom”开头的图层均为特效图层。

图3。1。1 游戏布局设计界面

11

3。1。1 游戏主界面

游戏布局元件包含了特效图层和功能图层。特效图层为带有“boom”的图层,在游戏时能让画面闪烁,增加动感。功能图层部分中的玩家图层包含玩家元件(Player)、游戏结束图层包含游戏结束元件(GameOver)、关卡图层包含关卡元件(GuanQia)、生命图层包含玩家生命值元件(Health)、游戏边框图层包含游戏区域和游戏背景。其中红色边框为舞台区域,游戏运行时舞台区域以外的元件是不可见的。

3。1。2 全局脚本

全局脚本即游戏布局(State)元件的的脚本(State。as),它具有以下作用:

1.存储游戏数据。

游戏数据包含了下列变量:

public var bulletX:Number;

2. 实现游戏特效。

游戏,在flash中是一个可以被玩家控制的影片剪辑,所以游戏布局元件也有他自己的时间轴,有了时间轴就有了帧,每一帧都是一个静态的图片,根据帧频快速播放后就形成了动画。游戏特效建立在下面这个函数上 onEnterFrame_(),它的作用是影片每一次播放一个帧,此函数都会运行一次。现在主流的Flash游戏帧频都是60fps,所以onEnterFrame_()函数每秒都要运行60次。

12

//玩家子弹的横坐标 //玩家子弹的纵坐标

public var bulletY:Number; public var enemyX:Number; public var enemyY:Number; public var bossX:Number; public var bossY:Number; public var i:Number; public var j:Number;

//敌人的横坐标 //敌人的纵坐标 //领主的横坐标 //领主的纵坐标 //敌人出现延时 //领主出现延时

//玩家子弹参数 //分数

public var bulletCS:Bullet; public var score_:int=0; public var d:Number;

public var buNum:Number=0; //玩家子弹数(控制在1之内) private var init_:Boolean=false; //是否可以初始化

//屏幕抖动参数

//玩家子弹攻击力(只适用于领主) //领主生命值

public var des:Number; public var bossH:Number;

在此款坦克大战游戏中,由函数控制的特效有两个:第一是屏幕抖动

(DouDong()),他模仿了击毁敌人使的空气震动效果。在抖动函数中有两条语句,它们的作用是让整个State元件在横坐标上随机移动-2~2像素,纵坐标随机移动-2~2像素,实现屏幕抖动功能。onEnterFrame_()函数控制了屏幕抖动参数d,如果d<6,则屏幕开始抖动,如果d>6,则屏幕静止不动,每次抖动d都会自动增加1,直到d大于6为止,避免屏幕一直抖动不停。如果屏幕静止了,则让d等于20,避免d无限增大下去。第二个特效为全屏渐变,在游戏中全屏渐变的元件都添加在前面带有boom的图层中,不同的图层有不同的颜色和效果,比如游戏开始时,整个屏幕从一团白色中渐变出来,模拟了士兵上战场的特效。

3.控制游戏进程。

在上面的参数中,我们可以看到有两个参数,i和j,他们就是控制游戏进程的参数。一个新关卡开始时,i=0,每一帧i自动增加1,当i大于120时,则会生成一个普通的敌军坦克,并且i再次等于0,实现了敌军不断增援的效果。同理,j开始也等于0,当j大于3000时,将会出现一个领主坦克,领主坦克出现时,i和j等于一个极大的负值,这样就不会继续出现敌军普通坦克和领主坦克。

参数des,这是玩家坦克对领主的伤害值,它的初始值为0。2,我们在这里规定它不小于0。05。

参数bossH,这是领主的生命值,是由领主类的一个计算方法得出的,它显示了玩家要击毁领主需要多少颗子弹。

在游戏结束时,如果玩家要重新开始游戏,则需要对游戏进行初始化,初始化的参数是init_。

4.评判玩家技术。

在游戏中,每击毁一辆敌军坦克都会增加分数。在游戏结束时,GameOver元件会从舞台外部移动到内部,并且系统会根据分数判定你的军衔等级,军衔等级包括新兵、上等兵、中尉、少将等等。

13

3。2 玩家类

玩家类是影片剪辑类,但它实际是一个简单的图形,并且有一个图层,如图3。2。1所示。

图3。2。1 玩家元件设计界面

3。2。1 玩家坦克的移动

玩家坦克有自己的横坐标x,纵坐标y。在玩家类中需要添加键盘监听器,在玩家类中,同样拥有自己的onEnterFrame_()函数。类中负责玩家移动的参数是vx和vy,它们是横坐标和纵坐标上的速度,实现玩家移动效果只需要将两句代码加入到onEnterFrame_()函数中,即x+=vx; y+=vy; 为了不让玩家超出移动范围,需要将玩家的横纵坐标限制在一个矩形范围内,并且根据键盘的按键来判断坦克的旋转角度。代码如下:

private function onEnterFrame_(e:Event):void {

14

x+=vx; y+=vy; if (x>1125) { x=1125;

}

if (x<75) { x=75;

}

if (y>625) { y=625;

}

if (y<125) { y=125;

}

if (fangxiang==1) {

rotation=0; }

if (fangxiang==2) {

rotation=90;

}

if (fangxiang==3) {

rotation=180;}

if (fangxiang==4) {

rotation=270;} } }

15

玩家在移动时,通过按键盘上上下左右,坦克会随着按键进行和移动旋转,让坦克的炮口对着移动的方向。如果放开按键,则速度等于0。实现方法如下:

在舞台中加入键盘按下和弹起事件的监听器: public function Player():void {

编写键盘按下事件的方法:

private function onKeyDown_(ev:KeyboardEvent):void

stage。addEventListener(KeyboardEvent。KEY_DOWN,onKeyDown_); stage。addEventListener(KeyboardEvent。KEY_UP,onKeyUp_); addEventListener(Event。ENTER_FRAME,onEnterFrame_);

}

{

if (ev。keyCode==Keyboard。UP) { }

if (ev。keyCode==Keyboard。DOWN) { }

if (ev。keyCode==Keyboard。LEFT) { }

if (ev。keyCode==Keyboard。RIGHT) {

16

//按下上

vy=-6; vx=0; fangxiang=1;

//按下下

vy=6; vx=0; fangxiang=3;

//按下左

vx=-6; vy=0; fangxiang=4;

//按下右

}

vx=6; vy=0; fangxiang=2;

编写键盘按键弹起事件的方法:

private function onKeyUp_(eve:KeyboardEvent):void {

if (eve。keyCode==Keyboard。UP) //放开上 { }

if (eve。keyCode==Keyboard。DOWN) //放开下 { }

if (eve。keyCode==Keyboard。LEFT) //放开左 { }

if (eve。keyCode==Keyboard。RIGHT) //放开右 {

if (vx>0) { }

17

if (vy<0) { }

vy=0;

if (vy>0) { }

vy=0;

if (vx<0) { }

vx=0;

vx=0;

}

3。2。2 玩家坦克发射子弹

在经典坦克游戏中,玩家发射的子弹上限只能有一个。这个功能的实现很简单,在玩家类中添加一个子弹数的参数(buNum),只有当它等于0,也就是舞台上没有玩家子弹时,才能发射子弹,这样就保证了子弹数的唯一。发射子弹的原理就是用Flash中的addChild方法添加一个玩家子弹类的实例,具体实现方法如下:

在onEnterFrame()函数中添加代码判断玩家发射的子弹数。 if (MovieClip(parent)。buNum<1)

在键盘按下事件方法中加入发射子弹的代码。 if (ev。keyCode==Keyboard。CONTROL)

}

}

{

if (isArmed) {

MovieClip(parent)。buNum=1; var bu:Bullet= new Bullet(); MovieClip(parent)。addChild(bu);

isArmed=false; //发射完毕后不能再次发射子弹

}

{

isArmed=true; //isArmed为true说明当前可以发射子弹

18

3。3 玩家子弹类

玩家子弹类同样是一个静态的图片,但是在子弹元件中添加了发光滤镜,如图3。3。1所示。

图3。3。1 玩家子弹元件设计界面

3。3。1子弹的速度与方向

子弹的速度也分横坐标的速度和纵坐标的速度,分别为vx和vy,由于子弹实例是由玩家类创建,所以子弹一被创建就会有一个固定的速度和方向,定义一个变量_BulletFX来表示子弹的飞行方向,子弹要获取方向要用到以下语句:

_BulletFX=MovieClip(parent)。player。fangxiang;

其中MovieClip(parent)表示子弹的父级对象,即State元件,通过点方法找到玩家类中的方向参数(fangxiang),通过方向值,改变横坐标和纵坐标的速度,这样子弹就会沿着玩家坦克面对的方向发射了。

19

具体实现方法如下:

添加\加载到舞台\事件函数。 public function Bullet():void

{

addEventListener(Event。ADDED_TO_STAGE,onATS_); //只有当子弹

被加载到舞台时才会触发onATS_内部的代码

}

编写加载到舞台时的事件方法。

public function onATS_(e:Event):void { vx=0;

vy=0;

//让子弹在被加载时赋予子弹方向和速度

_BulletFX=MovieClip(parent)。player。fangxiang;向,由于子弹与玩家同方向,所以可以直接赋值

if (_BulletFX==1) { x=MovieClip(parent)。player。x; y=MovieClip(parent)。player。y-20; vy+=-15;

}

if (_BulletFX==2) { x=MovieClip(parent)。player。x+20; y=MovieClip(parent)。player。y; vx+=15;

}

if (_BulletFX==3) {

x=MovieClip(parent)。player。x;

20

获取玩家的方

//

}

y=MovieClip(parent)。player。y+20; vy+=15;

if (_BulletFX==4) { }

x=MovieClip(parent)。player。x-20; y=MovieClip(parent)。player。y; vx+=-15;

//加载子弹删除和进入帧的事件方法

}

当子弹被删除时,同时删除时间监听器 public function onRFS_(e:Event):void

3。3。2 子弹的碰撞

子弹被创建之后,第一步先要将被创建的子弹“上传”到父级类(State)中的bulletCS参数中,因为要保证碰撞的唯一性,检测敌人与子弹的碰撞就写在了敌人类中。子弹类中碰撞是检测子弹与墙和边框的碰撞,子弹撞到了墙或者超出了边框,则子弹自身被删除,玩家类中的子弹数(buNum)变为0,子弹消失后玩家便可以再次发射出子弹。

下面为具体实现方法:

在加载到舞台事件函数中添加进入帧事件监听器。

addEventListener(Event。ENTER_FRAME,onEnterFrame_);

21

addEventListener(Event。REMOVED_FROM_STAGE,onRFS_);

{ }

removeEventListener(Event。ADDED_TO_STAGE,onATS_); removeEventListener(Event。REMOVED_FROM_STAGE,onRFS_); removeEventListener(Event。ENTER_FRAME,onEnterFrame_);

编写进入帧事件函数。

private function onEnterFrame_(e:Event):void

//当子弹碰到墙后删除子弹

{

x+=vx; y+=vy;

MovieClip(parent)。bulletCS=this; //将自身赋值到State类的

bulletCS参数中方便其他类调用

if (this。hitTestObject(MovieClip(parent)。guan。q1)) { }

else if (this。hitTestObject(MovieClip(parent)。guan。q2)) { }

else if (this。hitTestObject(MovieClip(parent)。guan。q3)) { }

else if (this。hitTestObject(MovieClip(parent)。guan。q4)) { }

else if (this。hitTestObject(MovieClip(parent)。guan。q5)) { }

else if (this。hitTestObject(MovieClip(parent)。guan。q6)) {

22

MovieClip(parent)。buNum=0; parent。removeChild(this);

MovieClip(parent)。buNum=0; parent。removeChild(this);

MovieClip(parent)。buNum=0; parent。removeChild(this);

MovieClip(parent)。buNum=0; parent。removeChild(this);

MovieClip(parent)。buNum=0; parent。removeChild(this);

}

MovieClip(parent)。buNum=0; parent。removeChild(this);

else if (this。hitTestObject(MovieClip(parent)。guan。q7)) { }

else if (this。hitTestObject(MovieClip(parent)。guan。q8)) { }

else if (x>1150||x<50||y>650||y<100) { }

MovieClip(parent)。buNum=0; parent。removeChild(this); MovieClip(parent)。buNum=0; parent。removeChild(this); MovieClip(parent)。buNum=0; parent。removeChild(this);

//当子弹超出游戏区域后删除子弹

}

1.1 敌人类

敌人类是静态图片有两部分组成,第一部分为游戏者可见部分,如图3。4。1中的蓝色圆形区域;第二部分为碰撞检测部分,在area图层中,用于测试与子弹的碰撞,如图3。4。1中的半透明点阵圆形。

23

图3。4。1 敌人元件设计界面

3。4。1简单人工智能

敌人类和玩家类的功能相似,唯一的区别是,玩家坦克的移动和发射子弹是由玩家通过键盘来控制,而敌人类的移动和发射子弹是由电脑来控制,在敌人类中,一个数学方法起到了很重要的作用,那就是Math。randim()方法,它是Flash中的一个静态方法,功能是生成一个介于0~1之间的随机数。下面重点介绍一下Math。randim()方法如何让敌人进行自主移动和射击。

3。4。2 敌人的移动

敌人在被State元件添加到舞台中时,它的横坐标和纵坐标在一个矩形区域内随机生成。敌人的移动也有两个变量:vx和vy,实现敌人的移动,类中还增加了两个新变量:private var isMove:Boolean; private var moveTime:Number; 即布尔型变量isMove和数量型变量moveTime,isMove变量用来表示敌人当前是否移动,moveTime变量则表示敌人移动的时间或者静止的时间,他们的每一次改变都是 一个介于0~100之间的随机

24

数,敌人的运动方式为移动——静止——移动,的实现原理前面的屏幕抖动特效相同。

具体敌人的移动方法实现如下:

添加加载到舞台时间监听器。 public function Enemy():void

初始化敌人数据并添加进入帧和删除类的时间监听器 public function onATS_(e:Event):void

数据初始化后根据参数来改变横向和纵向速度,就像玩家按键盘那样操作敌人移动,这部分与玩家类类似,具体请参照玩家类。

25

{ }

addEventListener(Event。ADDED_TO_STAGE,onATS_);

{ }

bulletNum=30; isMove=true; isShoot=false;

moveTime=int(Math。random()*100); shootTime=int(Math。random()*100); fangXiang=int(Math。random()*5+1); x=Math。random()*1200; y=Math。random()*900; vx=0; vy=0;

addEventListener(Event。REMOVED_FROM_STAGE,onRFS_); addEventListener(Event。ENTER_FRAME,onEnterFrame_);

3。4。3 敌人发射子弹

敌人发射的子弹与玩家发射子弹不同,它没有数量限制,敌人类通过两个变量:isShoot:Boolean;ShootTime:Number; 即布尔型变量isShoot和数量型变量shootTime,isShoot表示敌人是否处于射击状态,shootTime表示敌人设计状态或者非设计状态的持续时间,他们也都是0~100的随机数,射击方式为射击——静止——射击,当处于射击状态时,有一个子弹射击频率参数(bulletNum),用它来调整子弹的射击频率,数值越大则频率越慢。射击时,敌人类会将自身的横纵坐标赋值到State元件中的enemyX和enemyY变量中,并加载一个敌人的子弹类。

具体实现方法如下:

if (j>moveTime) //敌人移动--停止--再移动的运动规律

3。4。4敌人与玩家子弹的碰撞

前面我们已经知道了玩家子弹被“上传”到了State类中,所以要找到玩家发射的子弹只需从State元件上“下载”就行了,方法为checkHit(MovieClip(parent)。bulletCS); 这是自己定义的一个方法,用于检测敌人与玩家子弹的碰撞。具体的碰撞方法如下:

{ }

if (k>shootTime) //敌人射击--停止--再射击的射击规律

isMove=! isMove; j=0;

moveTime=int(Math。random()*100); fangXiang=int(Math。random()*5);

{ } j++; k++;

isShoot=! isShoot; k=0;

shootTime=int(Math。random()*100);

public function checkHit(bu:MovieClip):void {

if (bu!=null&&MovieClip(parent)。player。visible!=false) //确保{

if (this。hitTestPoint(bu。x,bu。y,true))

26

玩家子弹和敌人都存在与舞台

{

MovieClip(parent)。health。width++;

//生命值的宽

//特效元件//特效元件

度+1像素

MovieClip(parent)。boomG。gotoAndPlay(1); MovieClip(parent)。boomW。gotoAndPlay(1);

开始播放 开始播放

MovieClip(parent)。score_++; MovieClip(parent)。d=0; bu。x=-1000; bu。y=-1000;

MovieClip(parent)。buNum=0;

//分数值+1

//屏幕抖动 //玩家子弹数为0

//将子弹的碰撞区域移//如上

//删除子弹 //删除敌人坦

动到屏幕外,防止游戏中出现意外的情况

bu。parent。removeChild(bu);

this。parent。removeChild(this);

}

}

}

在函数中,我们看到,里面运用了hitTestPoint()函数,也就是说只有敌人碰撞到了玩家子弹的中心点,才会触发效果,请仔细看敌人类的图像,敌人的外围有一圈更大的透明的圆,它是真正的碰撞区域,在运行游戏时,才会更加的真实,不会出现“打空”的现象。

另外还有一句代码:

if (MovieClip(parent)。player。visible==false){parent。removeChild(this);} 它的作用是当玩家坦克被击毁时,敌人坦克同时也被删除,避免再次开始游戏时上一次游戏中的敌人还存在于舞台中。

1.2 敌人子弹类

敌人子弹类为静态图片,和敌人类一样,拥有可见部分和碰撞检测部分。如图3。5。1所示,圆形蓝色区域为可见部分,矩形半透明点阵部分为碰撞检测部分(area图层)。

27

图3。5。1 普通敌人子弹设计界面

3。5。1 敌人子弹的速度和方向

敌人子弹的速度和玩家子弹的速度的实现方法类似,具体请参照玩家子弹类。方向则是用随机数表示,即子弹在被创建时可以往上下左右四个方向随机发射,不用考虑敌人在创建敌人子弹时敌人坦克的运动方向。

3。5。2 敌人子弹的消失条件

敌人的子弹不会不停的向一个方向移动,在满足一个条件后,它就会消失,消失的条件有下列几种:

1。 子弹与墙碰撞 q8))

2。 子弹超出了游戏范围 if (x>1125||x<75||y>625||y<125)

28

if (this。hitTestObject(MovieClip(parent)。guan。q1?

3。 子弹与玩家碰撞 player。y,true))

4。if(this。hitTestPoint(MovieClip(parent)。player。x,MovieClip(parent)。5。 玩家坦克被击毁 if (MovieClip(parent)。player。visible==false) 如果上述条件中有一个满足,则运行删除子弹的代码parent。removeChild(this);

这里着重讲解一下第3个条件,子弹与玩家碰撞。这里的碰撞函数依然是取玩家坦克的中心点来进行碰撞检测,所以在敌人子弹的外面也有一个更大的透明碰撞区域。当子弹与玩家坦克碰撞时,会做两件事:第一,检测生命值元件的宽度,如果大于10像素,则生命值元件的宽度减少10像素,如果小于10,则游戏失败。第二,屏幕特效元件播放,屏幕抖动特效运行。

代码如下:

if (MovieClip(parent)。health。width>10) //如果玩家生命值大于10,则损失10生命

{ } else { }

MovieClip(parent)。boomHealth。gotoAndPlay(2); //特效播放 MovieClip(parent)。d=0; parent。removeChild(this);

//屏幕震动 //删除子弹

MovieClip(parent)。health。width=2;

//如果玩家此时生命不足10,则生命值为2,即玩家被击毁 MovieClip(parent)。health。width+=-10;

1.3 领主类

领主类为静态图片,拥有可见部分和碰撞检测部分。如图3。6。1所示,蓝色区域为可见部分,圆形半透明点阵部分为碰撞检测部分(图层2)。

29

图3。6。1 领主元件设计界面

3。6。1 领主的登场

领主登场时,整个屏幕会从一团漆黑中渐变出来,给玩家阴森恐怖的感觉,这仅仅只是一句简单的代码:boom。play(),代码写在了State类中。在登场时,屏幕右上方会出现领主的生命值,它是一个红色的数字文本框。

3。6。2领主的移动和射击

前面章节介绍了普通敌人的移动和射击,领主的移动和射击大部分与普通敌人类似,只是领主的移动不受墙的干扰,所以它可以穿墙而过,领主发射的子弹也是领主专用子弹,威力更强。

3。6。3 领主的生命值

领主跟普通敌人不一样,因为领主不会被玩家一下就打败,它有一定的生命值,玩家需要对其发射若干子弹。在游戏中,领主加入了透明度效果,透明度的范围在0~1之间,0为完全透明,就是消失了;1为完全不透明。领主在登场时透明度为1,当它受到玩家攻击时,每一次攻击,透明度减少一个特定的值,当领主透明度小于0。4时,则领主被

30

击败。这个特定值是前面在State类中提到的,State类中的des变量,des在第一关时是0。2,而后每增加一关减少0。05。所以第一关需要攻击领主4下,领主生命值具体的数学表达式为MovieClip(parent)。bossH=int(0。6/(MovieClip(parent)。des))+2;。当领主受到攻击,也会出现十分震撼的特效,特效代码为

MovieClip(parent)。d=5;

3。6。4 领主被击败了

领主怎么检测碰撞到玩家的子弹?这个函数跟普通的敌人一样,同样用到了自定义方法checkHit()。下面详细介绍此方法的具体代码和功能:

特效 动画

MovieClip(parent)。boomBoss。gotoAndPlay(2);

public function checkHit(bu:MovieClip):void {

if (bu!=null&&MovieClip(parent)。player。visible!=false) {

if (this。hitTestPoint(bu。x,bu。y,true)) //当玩家子弹{

MovieClip(parent)。buNum=0; bu。x=-100; bu。y=-100;

//子弹移动到屏幕外

//删除子弹 //领主生命值-1

//子弹数等于0

与领主碰撞时

bu。parent。removeChild(bu); MovieClip(parent)。bossH--; if (alpha<0。4) {

MovieClip(parent)。d=-50;

//当领主被击败时

//屏幕剧烈抖

动,抖

动时间为(50+6)/60

//玩家生命

//屏幕

MovieClip(parent)。health。width+=50;

值元件宽度+50像素 元件开始播放过关

//分数+10 //主界面重新

MovieClip(parent)。boomW。gotoAndPlay(8);

MovieClip(parent)。score_+=10; MovieClip(parent)。i=-300;

31

}

开始刷新普通坦克,玩家开始挑战下一关

MovieClip(parent)。j=-300;

//同上 MovieClip(parent)。des+=-0。05;

//玩家伤害 减少0。05,下一关的领主将会更难对付 MovieClip(parent)。guan。play();

//关卡元件

始播放,模拟通关效果

MovieClip(parent)。bh。y=-120;

//显示领主生

命值的文本框元件移动到屏幕外

this。parent。removeChild(this);

//删除领主

}

else //如果攻击没有击

败领主

{ MovieClip(parent)。d=5; //屏幕抖动 MovieClip(parent)。boomBoss。gotoAndPlay(2); //特效 元件播放 alpha+=- MovieClip(parent)。des;

//领主透明

下降

}

}

}

32

1.4 领主子弹类

领主子弹类为静态图片,拥有可见部分和碰撞检测部分。如图3。7。1所示,蓝色圆形区域为可见部分,圆形半透明点阵部分为碰撞检测部分(图层1)。

33

图3。7。1 领主子弹元件设计界面

3。7。1 领主子弹的移动

领主发射的子弹跟普通敌人的子弹也不一样,它取消了向上下左右4个方向运动的效果,取而代之的是360度的全方位发射。这个效果需要借助Flash中的数学函数,即Math。sin和Math。cos,具体方法请看下面的代码:

private var vx:Number; private var vy:Number; private var banJing:Number; private var jiaoDu:Number;

x=MovieClip(parent)。bossX; y=MovieClip(parent)。bossY; banJing=5;

jiaoDu=Math。random()*360; vx=banJing*Math。cos(jiaoDu);

//定义变量

//子弹初始横坐标为领主的横坐标 //子弹初始纵坐标为领主的纵坐标 //子弹的发射角度在360度内随机

//利用三角函数,将横坐标上的速度vx表示出来, 只有这样电脑才能运行子弹的运动模拟出来

34

//子弹速度为5

vy=banJing*Math。sin(jiaoDu); //同上

3。7。2 领主子弹与玩家的碰撞

首先领主子弹不会与墙碰撞,跟领主一样,也会“穿墙而过”,增加了难度。由于领主在发射子弹时,领主的子弹会很多,为了时游戏顺畅运行,较少内存占用,领主子弹没有添加滤镜效果,并且超出游戏范围后就会消失。而领主子弹与玩家的碰撞检测方法跟普通敌人子弹的检测方法一样,具体请参照普通敌人子弹类,这部分代码唯一与之不同的是碰撞后玩家会损失大量的生命值。

if (MovieClip(parent)。health。width>50)

35

{ } else { }

MovieClip(parent)。health。width=2; MovieClip(parent)。health。width+=-50;

1.5 玩家生命值

玩家生命值元件为显示了玩家的生命状态,越长则生命值越多,采用了纵向颜色渐变效果,如图3。8。1所示。

图3。8。1 玩家生命值元件设计界面

36

本文来源:https://www.bwwdw.com/article/5my3.html

Top