当前位置:文档之家› Flash游戏-开发基础

Flash游戏-开发基础

Flash游戏-开发基础
Flash游戏-开发基础

目录

Flash游戏制作常用代码解析 (2)

FLASH游戏制作基础:响应键盘的四种方法 (8)

Flash游戏制作--空战 (11)

Flash飞行游戏制作全解 (18)

Flash游戏制作--迷宮 (28)

Flash游戏制作规划与流程漫谈 (35)

用Flash制作互动的小人 (44)

常见的飞机发射子弹的控制 (48)

一个完全使用AS2编制的飞机游戏之制作详解 (49)

Flash游戏制作常用代码解析

1.获取随机数

随机函数在flash游戏制作中很常用,例如在拼图游戏中,每次开始新的游戏时可以利用随机函数使图块获得新的位置,试想一个千篇一律的游戏谁会有兴趣玩下去。

现在我们有两种产生随机数的方式:random()和Math.random(),举例来讲,如果我们相随机赋给x一个0-5的数,我们可以使用x=random(6)或者x=Math.random()*5。

但这两种方式产生的随机数是有区别的,用random(6)方法返回的x是0<=x<=5的整数,而另外一种返回的x 则是0<=x<5的小数。

试着在第一帧中写入下面的AS,并在第二帧创建内容帧以形成循环:

x = random(6);

y = Math.random()*5;

trace("x="+x+",y="+y);

在output窗口中将得到以下数据:

...

x=1,y=3.66887632058933

x=2,y=4.39878350123763

x=0,y=0.522367884404957

x=3,y=2.95675310306251

x=5,y=4.03038211166859

x=2,y=0.223042098805308

...

区别一目了然。

2.获得鼠标及MC(MovieClip)的位置

另外一个在flash游戏制作使用频率比较高的参数就是坐标了,鼠标的坐标和MC的坐标的获得方式是不同的,鼠标的坐标可以用_xmouse和_ymouse获得,MC的坐标可以用MovieClip._x和MovieClip._y获得。值得注意的是在获得坐标时要考虑实际需要的坐标值是相对的还是绝对的,下面给出了一个典型的获得鼠标相对坐标和绝对坐标的例子(例1):

其中浅色的正方形是一个被命名为mc的MovieClip,四个文本框属性均被设置为Dynamic Text(请参阅《Flash

MX 文本工具详解》),场景中的两个用于获得变量x_timeline和y_timeline(绝对坐标),正方形中的两个用于获得变量x_movieclip和y_movieclip(相对坐标),为了获得变量,需要在文本框的属性面板中的Var属性中分别填入相应的变量名,与上面例子形成循环的方式一样,在第一帧中写下面的AS,第二帧创建为内容帧:

x_timeline = _root._xmouse;

y_timeline = _root._ymouse;

x_movieclip = mc._xmouse;

y_movieclip = mc._ymouse;

注意:场景的坐标原点为其左上角,坐标值向右向下递增,为正值(这与我们通常意义的坐标并不相同);MC的坐标原点是编辑MC时的中心,坐标象限见图1.

获得MC坐标的方法与上面说的大同小异,我们将在下面的MC属性简介中做介绍。

4.判断按键

既然是游戏,当然就要响应玩家的各种反应,除了鼠标,最直接的就是键盘了。响应键盘无非是判断玩家按下了哪一个键或者组合键,要实现这些其实很简单,我们既可以通过按钮或MC的事件来响应按键,也可以通过帧上的动作来响应,举例说明:

(1)按钮的keyPress方法:

先说按钮,按钮除了响应鼠标的一些动作(如:rollOver,release...)之外还有几个是响应固定按键的(如

Enter,Left,Home,PageDown...),下面我们就来制作一个。建立一个按钮,拖到场景中,捆绑下面的AS:

on (keyPress "") {

trace("按下了Left键");

}

这样当我们在测试的环境下按下左方向键后,output窗口就会显示出"按下了Left键"。下面说说怎样使MC 响应按键更复杂的按键。

(2)MC响应单个按键:

onClipEvent (keyDown) {

if (Key.isDown(72)) {

trace("按下了H键");

}

}

这样在测试的环境下按下H键,output窗口就会显示出"按下了H键",其中72是H键的keyCode值(其他按键的keyCode值将在附录中给出),如果不知道某个键的keyCode值也没关系,Flash为我们提供了getCode函数,将上面AS中的72替换成Key.getCode("H")会得到同样的效果。

(3)MC响应组合键:

onClipEvent (keyDown) {

if (Key.isDown(72) && Key.isDown(17)) {

trace("您按下的组合键是Ctrl+H");

}

}

在测试的环境中按下Ctrl+H键,output窗口就会显示出"您按下的组合键是Ctrl+H"

(4)利用帧上的动作响应按键:

新建一个flash文件,利用上面讲过的:在第一帧写AS,第二帧创建内容帧的方法,使影片形成循环以便随时进行判断,然后在第一帧中写入下面的几组代码,分别进行试验;如果你使用的是MX,也可以不建立第二帧,而是用试验代码代替_root.onEnterFrame=function(){...}中的"..."来达到同样的效果:

//①

trace(Key.getCode());

//②

if (Key.isDown(72)) {

trace("按下了H键");

}

//③

if (Key.isDown(72) && Key.isDown(17)) {

trace("按下了Ctrl+H组合键");

}

//④

if (Key.isDown(17)) {

if (Key.isDown(72)) {

temp = "+H";

}

if (Key.isDown(71)) {

temp = "+G";

}

trace("按下了Ctrl"+temp+"键");

}

注:对于MC的(2)(3)两种情况,可以将keyDown事件改为enterFrame事件,其中(2)还可以替换为keyUp事件.

5.检测碰撞(hitTest)

目前我们见到的射击游戏或打老鼠之类的游戏很多都利用了hitTest,hitTest既可以检测MC与MC的碰撞,

也可以检测鼠标与MC的碰撞:

hitTest的语法如下:

(1)myMovieClip.hitTest(x,y,shapeFlag)

这用来检测鼠标的碰撞,x和y分别代表鼠标的横纵坐标,shapeFlag用来规定检测以MovieClip的最大边界为限或以MovieClip的实际边界为限.

(2)myMovieClip.hitTest(target)

检测MC之间的碰撞,应用起来十分简单。

6.MC的复制与卸载

MC的复制,顾名思义就是产生出一个与目标相同的MC(除了name和depth以外),语法

为:duplicateMovieClip(target,newname,depth)

target:被复制目标的名称;

newname:复制出的MC的名称;

需要注意,复制出来的新MC的name最好不要相同,也不要与被复制的MC的相同,因为这样会给控制带来不可预期的麻烦;另外depth也是一个相当重要的参数,如果新复制出的MC与前面某个复制的MC的depth属性相同(即位于通一深度),那么先前被复制的MC将被新复制的MC替换掉(不管他们是否属于同一被复制目标),这个特性经常被我用来制作鼠标跟随的效果,即炫又简单,你试试:)

再来说说MC的卸载,大家对这个MC的复制的"双胞胎兄弟"的重视程度好像远不如他的"兄长",因为我经常在论坛中看到类似于"为什么复制出的MC在跳到其他帧,甚至到其他场景后依然存在?"的问题,其实解决方法很简单,就是MC的卸载:

removeMovieClip(target);

只要将要被卸载的MC的name替换掉语句中的target就可以成功的完成卸载任务。

7.获取影片运行时间

getTimer();

这个函数用以返回自影片开始播放时起已经过的毫秒数,虽然是个很简单的函数,但用利用率却很高,尤其是在一些需要计时的游戏中。

需要说明的是:毫秒与秒的计算公式为1毫秒=1/1000秒;函数以影片第一次播放的开始时刻为0,不受任何其他因素影响,也就是说如果你想从头开始计时,那么只有重起player,或者定义一个变量来存放getTimer的值,然后用getTimer与变量做减法运算以便得到新的运行时间,看下面的例子(例5).

8.颜色的设置

说到颜色必须先说说什么是对象,对象就是预先定义好的用来访问某些特定类型的信息的集合,大多数预定义对象都有自己的方法(被指派给一个对象的函数被称为这个对象的一个方法),你可以通过这些方法得到不同类型的返回值或执行某个动作.

预定义对象包括普通对象和顶级对象,普通对象在使用前需要创建(我们将要提到的Color对象就属于这一类),而顶级对象则可以直接调用(入下面要说的Math对象)

下面我们详细介绍一下Color对象,它包含四种方法:

getRGB():返回由最后一次setRGB 调用设置的数值;

getTransform():返回由最后一次setTransform 调用设置的转换值;

setRGB(0xRRGGBB):指定Color 对象实例的RGB 颜色,调用此方法会覆盖由setTransform 方法设置的任何以前的设置;

setTransform(colorTransformObject):设置Color 对象实例的颜色转换信息colorTransformObject 参数是通过new Object 构造函数创建的通用对象它具有指定颜色的红、绿、蓝和alpha(透明度)成分百分比和偏移量数值的参数,颜色转换对象的参数与"高级效果"对话框中的设置相对应,定义如下:

ra 是红色成分的百分比(-100 到100)

rb 是红色成分的偏移量(-255 到255)

ga 是绿色成分的百分比(-100 到100)

gb 是绿色成分的偏移量(-255 到255)

ba 是蓝色成分的百分比(-100 到100)

bb 是蓝色成分的偏移量(-255 到255)

aa 是alpha 的百分比(-100 到100)

ab 是alpha 的偏移量(-255 到255)

myColorTransform = new Object();

myColorTransform.ra = 50;

myColorTransform.rb = 244;

myColorTransform.ga = 40;

myColorTransform.gb = 112;

myColorTransform.ba = 12;

myColorTransform.bb = 90;

myColorTransform.aa = 40;

myColorTransform.ab = 70;

也可使用以下语法来创建colorTransformObject 参数:

myColorTransform = {ra:'50',rb:'244',ga:'40',gb:'112',ba:'12',bb:'90',aa:'40',ab:'70'}

下面的例子展示了为一个目标电影创建一个新的Color对象,使用Object构造器创建一个颜色改变对象以及使用setTransform方法将这个颜色改变对象传递给一个Color对象的过程:

//为目标MC创建一个名为myColord 的对象

myColor=new Color(MC);

//使用普通对象Object对象创建一个名为myColorTransform的颜色改变对象

myColorTransform=new Object;

//为myColorTransform设置值

myColorTransform={ra:'50',rb:'244',ga:'40',gb:'112',ba:'12',bb:'90',aa:'40',ab:'70'};

//将颜色改变对象和为MC创建的颜色对象关联起来

myColor.setTransform(myColorTransform);.

9.三角函数的运用

三角函数属于Flash中的顶级对象----Math,一提到这个名词很多人是不是会感到"恐惧",但在游戏的制作中它可是必不可少的。

这里我们利用Math的atan方法来制作一个永远指向鼠标的指针(例6),其他的三角函数以及数学函数的用法和注意事项请参考附录中的数学函数表.

新建一个MC,画一个长度为70的水平指向右侧的箭头(箭头根部放在中心点上),回到场景,Ctrl+J修改影片的大小为200*200,将指针从库中拖入场景,命名为"pointer",修改坐标为100*100,在主timeline的第一帧中写如下AS: x = _xmouse-100;

y = _ymouse-100;

//将坐标中心移到场景的中心

tan = Math.atan(y/x)*180/Math.PI;

//注意要使用弧度表示的角度值

if (x>=0 && y>=0) {

r = Math.round(tan);

} else if (x>=0 && y<0) {

r = Math.round(360+tan);

} else {

r = Math.round(180+tan);

}

//判断各种不同的情况,通过运算使r值在0-360之间

pointer._rotation = r;

//将r值付给_rotation

放置一个用来显示r值的文本框属性为Dynamic Text,获取变量(Var)为"r",第二帧建立内容帧,Ctrl+Enter测试。

以上我们向大家介绍了Flash游戏制作中最常用的一些ActionScript,掌握了这些基本控制方法,就可以制作出很多有意思的Flash游戏,同时在制作的过程中你还会发现更多的技巧,欢迎投稿和大家一起交流。

FLASH游戏制作基础:响应键盘的四种方法

响应键盘的方法作为AS中的一个重要组成部分,在如今已经越来越广泛的使用,尤其是在FLASH游戏制作中,如果缺少了响应键盘的方法,那是不可能的,而响应键盘的方法主要的四种,分别是:

1、利用按钮进行检测

3、利用键盘侦听的方法

4、利用影片剪辑的keyUp和keyDown事件来实现响应键盘

只有熟练掌握了这些方法,然后加以变通的话,就会得到很多意想不到的效果,下面我就结合理论和自己的想法简要的介绍一下。

第一种响应键盘的方法:利用按钮进行检测来实现响应键盘

在按钮的on事件处理函数中不但可以对鼠标事件作出响应,而且可以对键盘事件作出响应。如在按钮的动作面板中加入如下所示的代码,在敲击键盘上的X键时输出窗口中将提示:X is pressed

在按钮上加上:

on (keyPress "x") { trace("X is pressed");

}但是要注意的是:检测键盘上的字母键时,字母都应为小写。如果要检测键盘中的特殊键,Flash中有一些专门的代码来表示它们,下面列出了一些常用的功能键的表示代码:如要检测键盘上的键,可以使用下面的ActionScript:

on (keyPress "") {

trace("Left is pressed");

}

另外,你可以在一个按钮中加入若干个on函数,也可以在一个on函数中结合多种事件,这使您可以为按钮定义自己熟悉常用的快捷键,如下所示:

on (release, keyPress "") {

_root.myMC.prevFrame();

}

on (release, keyPress "") {

_root.myMC.nextFrame();

}

上面的第一个语句实现单击按钮或按键盘上的左方向键,控制影片剪辑myMC回退1帧,而上面的第二个语句实现单击按钮或按键盘上的右方向键,控制影片剪辑myMC前进1帧。

第二种响应键盘的方法:利用Key对象来实现响应键盘的操作

利用按钮检测按键动作很有效,但是并不利于检测持续按下的键,所以不适合于制作某些通过键盘控制的游戏。

这时,您就需要用到Key对象。Key对象包含在动作面板的“对象”/“影片”目录下面,它由Flash内置的一系列方法、常量和函数构成。使用Key对象可以检测某个键是否被按下,如要检测左方向键是否被按下,可以使用如下ActionScript:

if (Key.isDown(Key.LEFT)) {

trace("The left arrow is down");

}

函数Key.isDown返回一个布尔值,当该数中的参数对应的键被按下时返回true,否则返回false。常量Key.LEFT代表键盘上的左方向键。当左方向键被按下时,该函数返回true。

Key对象中的常量代表了键盘上相应的键,下面列出了一些基本的常量:

一些功能键的表示:

Key.BACKSPACE Key.ENTER Key.PGDN

Key.CAPSLOCK Key.ESCAPE Key.RIGHT

Key.CONTROL Key.HOME Key.SHIFT

Key.DELETEKEY Key.INSERT Key.SPACE

Key.DOWN Key.LEFT Key.TAB

Key.END Key.PGUP Key.UP

以上是键盘上的功能键,那么如何表示键盘上的字母键呢?

if (Key.isDown(Key.getCode("x"))) {

trace("X is pressed");

}

上面脚本的意思就是,利用Key.getCode函数来告诉系统你是否按下了x键,如果按下了x键以后,函数Key.isDown则会返回true,在输出窗口就会输出X is pressed。

第三种响应键盘的方法:利用键盘侦听的方法来实现响应键盘(个人习惯用这种方法)

假设在影片剪辑的onClipEvent(enterFrame)事件处理函数中检测按键动作,而影片剪辑所在的时间轴较长,或计算机运算速度较慢,就有可能出现这种情况:即当在键盘上按下某个键时还未来得及处理onClipEvent(enterFrame)函数,那么按键动作将被忽略,这样的话,很多你想要的效果就会无法实现了。

另外,还有一个需要解决的问题就是,在某些游戏(如射击)中,我们需要按一次键就执行一次动作(发射一发子弹),即使长时间按住某个键不放也只能算作一次按键,而Key对象并不能区别是长时间按住同一个键还是快速地多次按键。

所以如果要解决这个问题,就需要用到键盘侦听的方法。你可以使用“侦听器(listener)”来侦听键盘上的按键动作。

要使用侦听器之前,首先需要创建它,你可以使用如下所示的命令来告诉计算机你需要侦听某个事件:

Key.addListener(_root);

Key.addListener命令将主时间轴或某个影片剪辑作为它的参数,当侦听的事件发生时,可以用这个参数指定的对象来响应该事件。

上面的代码指定主时间轴来响应该事件。要让主时间轴对该事件作出响应,还需要设置一个相应的事件处理函数,否则设置侦听器就没有什么意义了。

键盘侦听的事件处理函数有两个:onKeyUp和onKeyDown,如下所示:

Key.addListener(_root);

_root.onKeyUp = function() {

trace(Key.getAscii());

};

//代码的意思是,当按下一个键并释放后,输出窗口将输出你按下的那个键的Ascii码

当然,你也可以使用影片剪辑作为侦听键盘的对象,只需要使用影片剪辑的路径代替_root作为Key.addListener命令的参数就可以了。

比如下面代码:

Key.addListener(_root.mc);

_root.mc.onKeyUp = function() {

trace(Key.getAscii());

};

代码的意思是,当按下一个键并释放后,输出窗口将输出你按下的那个键的Ascii码,意思差不多,但是键盘侦听对象不同,一个是影片mc,一个是主时间轴。

第四种响应键盘的方法:利用影片剪辑的keyUp和keyDown事件来实现响应键盘

最后一种方法很容易被忽视,但是也有一定的应用价值,最重要的是把概念弄清楚。

例如下面的代码:

onClipEvent (keyDown) {

trace(Key.getAscii());

}

//当按下键盘上的一个键的时候,输出窗口将输出按下的这个键的Ascii码值。

函数Key.getAscii表示返回与按键相对应的ASCII码,其中 ASCII码是一个整数,键盘上的每个字符对应一个ASCII码,如字母A对应的ASCII码为65,B对应的ASCII码为66,a对应的ASCII码为97, b对应的ASCII码为98,+ 对应的ASCII码为43等。需要注意的是:只有字符键才有ASCII码,键盘上的功能键是没有ASCII码的。

如果我想在输出窗口中输出与按键相对应的字符,那怎么办?

这时候,你可以使用String对象的fromCharCode函数将ASCII码转换成字符,如将上例的代码改成如下所示:

onClipEvent (keyDown) {

trace(String.fromCharCode(Key.getAscii()));

};

//意思就是说,当按下键盘的一个键,输出按下的这个键相对应的字符,当然除了功能键。

关于String对象的详细解释,大家可以查看动作面板的“对象”/“核心”目录下面。

Flash游戏制作--空战

Flash游戏制作--空战

射击类游戏一直是Flash游戏制作中的一个热点,大多数Flash射击游戏都是都是纵版的,也就是游戏背景的前进方向是垂直的,这样的游戏已经司空见惯了。所以这次我们来制作一个横版的射击游戏,游戏背景和飞机的运动方向都是水平的。

游戏运行后的主界面如图1所示:

图1

游戏说明:

此游戏玩家是以第一视角的模式来进行的,所谓第一视角就是游戏的界面相当于玩家的双眼,通过这样的形式,可以使游戏达到一种非常逼真的效果,仿佛您已经置身于激烈的游戏之中了。游戏中玩家可以使用鼠标控制屏幕中的瞄准镜,瞄准并射击从左边随机出现的敌机,飞机会以各种路线在空中飞行以避开你的射击,如果敌机被射中后,就会从空中跌落下来,相应的玩家会得一分,在游戏规定的100秒内,尽量击落更多的敌机。

制作步骤:

一:游戏中相应元件的制作

1.既然是空战游戏,自然少不了飞机,所以首先来制作游戏中的敌机。在影片中新建一个Graphic元件,,命名为gPlane,进入元件的编辑状态后,可以从外部导入一张飞机的图片,然后将其分离,稍稍加工一下即可。或者使用Flash提供的强大的绘图工具自己绘制一架飞机,如图2所示:

图2

有了飞机,还需要一个飞行员飞机才可以工作,所以再建一个Graphic元件,命名为gMan,进入元件编辑状态后,使用椭圆绘图工具绘制一个简单的人头即可,如图3所示:

图3

接下来就需要将飞机和飞行员组合到一起了,因为游戏中需要使用Action动作脚本对飞机进行控制,所以需要将最终的组合体制作成Movie clip元件,所以再新建一个Movie clip元件,进入元件的编辑状态后,将元件gMan和Gplane分别拖到编辑区,使用鼠标调整其相对位置,如图4所示:

图4

这样,一架逼真的战斗机就制作完成了。

2.飞机飞行动画的制作:游戏中飞机是从游戏窗口左边随机出现的,但是飞机的飞行路线是事先确定好的,我们可以在制作过程中按照实际需要制作一些飞机沿一定路线飞行的Motion动画,使用Guide Line引导线可以很方便的实现,然后在游戏中分别调用即可,本游戏预先制作了三中不同的飞行路线,这里以其中一种举例说明,其它的制作方法完全类似。

新建一个Movie clip元件,命名为mPlane1,进入元件的编辑状态后,在图层layer1的上面插入一个引导层,在引导层上使用铅笔工具随意绘制一条曲线,然后将图层延续到第120桢,如图5所示:

图5

然后将元件mPlane拖到图层layer1的第1关键桢,放置到曲线的左边的开始端点,飞机会自动吸附到此端点,接着在属性面板中设置飞机的Instance name为airplane。在第120桢插入一个关键祯,同样的将飞机拖到曲线的右边的端点,也会自动吸附上去,最后,在第1祯到第120祯的任意祯上单击鼠标右键,选取Creat Motion Tween命令即可,这样就创建了飞机从曲线的左端点沿曲线运动到右端点的运动效果。最后还需要添加一个图层Action,用来设置Action动作脚本,在第1桢添加如下as:

var planeDepth=_root.pDepth;

在最后一桢(120祯)添加如下as:

_root.numPlane--;

this.removeMovieClip();

按照同样的方法分别制作元件mPlane2和mPlane3,和mPlane1的唯一不同点就是引导层的曲线不一样。

3.制作瞄准镜:游戏中玩家可以控制的唯一对象就是瞄准镜,可以用它瞄准并射击敌机,新建一个Movie clip元件,命名为mPointer,在编辑区中使用椭圆工具绘制一个正圆,然后在正圆中绘制四条方向不同的直线即可,如图6所示:

图6

4.云彩的制作:既然是空战,天空中当然少不了白云,并且适当的在游戏中加入白云这样的对象,可以使游戏更生动和逼真,游戏中的白云是使用Action动作脚本随机复制并进行控制的,所以这里我们新建一个Movie clip元件,命名为mCloud,进入元件编辑状态后,使用铅笔工具的Ink绘制模式,绘制一个弯曲的闭合区域,并将图层延续到第5祯,如图7所示:

图7

接下来需要添加复制和控制白云的Action动作脚本,新建一个图层,分别在第1,3,5三祯插入三个关键祯,给第一祯添加如下AS:

this._y = 30+random(300);

speed = 2+random(5);

给第3祯添加如下AS:

this._x -= speed;

给第5祯添加如下AS:

if (this._x<-35) else {

gotoAndPlay (_currentframe-2);

}

5.飞机被击落的效果:游戏中飞机如果被击落,如果简单的来做,只需要设置飞机消失即可,不过为了增强游戏的观赏性,我们这里专门来设计以下飞机被击落的效果,而且会带有爆炸的声音。

新建一个Movie clip元件,命名为mDown,进入元件的编辑状态后,首先添加三个图层分别为down,planedown和explord,在图层explord的第一祯绘制一个如图8所示的多角形,并填充上适当的颜色:

图8

然后在第3祯插入一个关键祯,在属性面板上设置此多角形的Alpha透明度值为15%,最后建立第1到第3祯的Motion运动过渡,这样就实现了飞机被击中的瞬间爆炸的效果。

接下来制作飞机下落的效果。在图层planedown的第2祯插入一个关键祯,将元件Mplane拖进编辑区,使用旋转工具将飞机旋转90度,使飞机头冲下,然后在第10祯插入一个关键祯,将飞机向下移动一段直线距离,并适当降低飞机的Alpha透明度值,最后建立第2祯到第10祯的Motion运动过渡效果,这样飞机被击中后下落并消失的效果也有了。

不过如果飞机在下落过程中,能有冒烟的效果就更完美了。所以我们在图层down的第4祯插入一个关键祯,然后使用椭圆工具绘制个竖直的扁椭圆,并填充上黑色,在第10祯插入关键祯,调整椭园的形状并设置降低其透明度,同样建立一个Motion运动过渡效果。

然后插入一个图层sound,用来设置飞机下落的声音效果,从外部导入一个爆炸的音效,然后选中图层sound,从属性面板的sound下拉列表中选择所导如的身影,最后将此层也延续到第10祯,时间线如图9所示:

图9

最后还要添加一些Action动作脚本对其加以控制。新建一个图层ACTION,在第1,2,和10祯分别插入一个关键祯,然后给第一祯添加如下AS:

this._x = _root.expX;

this._y = _root.expY;

给第2祯添加如下AS:

this._x=_root.expX;

给第10祯添加如下As:

this.removeMovieClip();

6.制作记时器:游戏是有一定时间控制的,所以还需要添加一个记时器,使用动态文本可以方便的实现,新建一个Movie clip元件,命名为mTime,在元件编辑状态下,使用文本工具绘制一个矩形文本框,然后在属性面板中设置其为Dynamic动态文本,这样就可以用Action对其中的内容加以控制了,设置其变量名为rTime,然后在文本框前面输入提示信息,如图10所示:

图10

然后新建一个层,在第一祯添加如下AS:

now = new Date();

//新建一个Date对象

startTime = now.getTime();

//设置开始时间为系统时间

playTime = _root.playTime;

rTime = playTime;

在第三祯添加如下AS:

now = new Date();

currentTime = now.getTime();

rTime = playTime-int((currentTime-startTime)/1000);

if (!rTime) {

_root.gotoAndPlay("reStart");

stop ();

}

//显示并控制记时器中的时间

在第5祯添加如下AS:

gotoAndPlay (_currentframe-2);

到此为止,游戏中需要的元件大部分准备好了,下面就可以开始布置主场景了。

二:布置主场景

1.首先将默认图层layer1重命名为background,使用矩形工具绘制一个和舞台一样大小的矩形,并填充上天蓝色,将图层延续到第50祯。

2.新建两个图层分别为start和gun,在start图层上用来设置游戏的开始界面,使用文本工具输入游戏的名称,并将瞄准器放置到图层gun 中,并在属性面板中设置瞄准器的Instance name为pointer,如图11所示:

图11

3.在图层gun的第22祯插入关键祯,输入游戏时间已到的消息,如图12所示;

图12

4.新建一个图层命名为score&time,用来放置记分器和记时器,将记时器mTime放到舞台下面靠右的位置,然后在下面靠左的位置绘制一个动态文本框,设置其变量名为score,用来记录游戏的得分,如图13所示:

图13

三:给游戏添加Action动作脚本

最后的游戏就是添加Action动作脚本了。

新建一个图层,命名为ACTION,设置第2祯的祯标签为start, 设置第9祯的祯标签为dup, 设置第15祯的祯标签为gotoDup, 设置第22祯的祯标签为reStart.

在第一祯添加如下AS:

startDrag("/pointer", true);

//游戏开始前,首先隐藏鼠标,然后使瞄准器变为可拖动状态

sShoot = new Sound();

sShoot.attachSound("sShoot");

//新建一个sound声音对象,然后从外部导入射击的音效Sshoot,使用attachsound方//法将此声音绑定

sExp = new Sound();

sExp.attachSound("sExp");

////新建一个sound声音对象,然后从外部导入射击的音效Sexp,使用attachsound方//法将此声音绑定

stop();

在第2祯添加如下AS:

score = 0;

//设置初始得分为0

playTime = 100;

//设置游戏时间为100秒

var expX;

var expY;

//定义两变量,代表飞机的坐标

cDepth = 100;

pDepth = 0;

numPlane = 0;

numCloud = 0;

//定义变量,分别代表飞机和云的深度和数量

_root.attachMovie("mP", "pointer", 300);

startDrag("/pointer", true);

在第9祯添加如下AS:

if (Math.random()<0.2 && numCloud<5) {

numCloud++;

_root.attachMovie("mCloud", "c"+cDepth, cDepth);

cDepth = (++cDepth)%100+100;

}

//复制白云

if (Math.random()<0.3 && numPlane<7) {

_root.attachMovie("mPlane"+(1+random(3)), "P"+pDepth, pDepth);

numPlane++;

with (eval("/p"+pDepth)) {

_x = -20-random(120);

_y = 150+random(60);

}

pDepth = (++pDepth)%100;

}

//复制飞机,并使用随机函数设置飞机出现的坐标

在第15祯添加如下AS:

gotoAndPlay("Dup");

在第22祯添加如下AS:

_root.pointer.removeMovieClip();

//游戏结束后,从游戏中删除瞄准器

在第50祯添加如下AS:

Mouse.show();

//显示鼠标

for (i=0; i<100; i++) {

removeMovieClip ("/c"+(100+i));

removeMovieClip ("/p"+i);

}

stop ();

//删除游戏中所有复制出来的飞机和白云

最后的时间线如图14所示:

图14

到这里,一款精彩的空战射击游戏就制作完成了,您可以按照相似的制作方法,制作一款比较传统的纵版射击游戏。此实例其实是设计空战类射击游戏的通用思路,其它飞行射击游戏其实是在此基础上扩展成的,所以还可以进一步丰富游戏的功能,加强游戏的可玩性。

Flash飞行游戏制作全解

Flash一直是大家喜欢的交互多媒体开发工具,Flash游戏则以简单、耐玩,而深受用户喜爱。看似复杂多变的Flash游戏,其制作并不难。本文以一款传统的飞行游戏制作为例,说明其制作全过程,相信在你阅读完本文后,也可以通过自己的想象,制作出心仪的游戏来。

一、飞行游戏制作思路分析

这是一款相对传统的飞行游戏。它使用上、下、左、右键控制飞机的运行方向,Shift键发射子弹,空格键发射导弹。游戏中共有两种敌机,一号敌机的飞行方向是由下而下,二号敌机是由左至右,两种敌机的飞行轨迹都是弧线的、随机的。

在游戏中我们添加了几组数据,以增加游戏的刺激性。例如,装备库的设计,它可以随机添加一些装备,以供主控飞机使用。这其中包括有子弹的速度、导弹的个数、飞机数量,以及主控飞机的飞行速度。装备库的设计,会大大增加游戏的娱乐性。

另外,在BOSS敌机的设计中,我们使用了利用弧度换算角度的公式,使BOSS敌机可以发射一种子弹,跟踪主控飞机的坐标。相信在这些设计中,会让大家品尝到不同的数学公式,在游戏制作中的妙用。

注:本文全部源程序及素材下载地址为https://www.doczj.com/doc/c610064820.html,/hdb/fj_game.rar。

二、游戏界面设计

1.制作开始界面

每一个游戏都有一个开始界面,供游戏者选择,我们在第1帧中制作游戏的开始界面。启动Flash MX 2004,请在第1帧中加

on(press){

gotoAndPlay("Scene 2",1)

}

2.制作星空

按下Shift+F2组合键,打开“场景”面板,点击“+”按钮新增加一个场景,进入场景2,开始游戏的制作。

将“图层1”更名为scene以制作星空。其实,这些星空都是用圆形绘图工具绘制上去的,它们的大小只有一个或是两个像素,我们可以使用复制,然后再对齐的方式,使它们布满场景。

全选这些亮点,按F8键将其转换成影片剪辑,将这个影片剪辑复制3次,然后放置在一个影片剪辑中,让它们并排向下循环移动即可。

3.变量设置

新建一个图层,命名为fenshu,使用文本输入工具,在屏幕下方输入:“现在分数:”、“子弹速度”、“子弹类型:”、“导弹数量:”、“飞机速度:”、“飞机数量:”等文字内容。

新建一个图层,命名为score,在工具箱中点击“文本工具”按钮,然后在“属性”面板中更改其为“动态文本”,在“现在分数:”的后面拖出一个输入框,在“属性”面板中将“变量”更改为score。

使用相同的方法,新建shot_speed图层,在“子弹速度:”后制作一个动态文本框,变量名称为shot_speed。新建一个shot_sty 图层,在“子弹类型:”后制作一个变量名为shotsty_txt的动态文本框。新建一个plane_speed图层,在“飞机速度:”后制作一个plane_speed的动态文本框。

新建missilenum图层,使用绘图工具绘制作如图5所示的图形,选取这些图形按下F8键将其转换成影片剪辑,命名为missilenum_mc,在“属性”面板“实例名称”框中输入“missile_num”。

进入missilenum_mc影片剪辑,在第3、4、5、6帧处按F6建立关键帧,在第6帧处加入stop()代码,然后将第1帧中的导弹全部删去,第2帧保留一个,第3帧保留2个,以此类推。

回到场景,新建一个plane_num图层,取实例名为“planenum_mc”,依照上一步的方法制作。

回到场景,在第1帧中加入如下代码,新建一个info图层文件夹,将上面的这些图层放置其中:

score=0

shot_speed=10

shotsty_txt="单弹道"

missilenum=6

plane_speed=10

planenum=4

shot_sty=1

missile_text=6

代码说明:

这里主要是为这些变量赋值,score等于分数,初始值为0,shot_speed等于子弹速度,初始值为10;shotsyt_txt等于子弹类型,开始时它为单弹道;missilenum表示导弹数量,初始值为6;plane_speed表示飞机速度,初始值为10;planenum表示飞机数量,初始值为4;子弹类型的变量等于1;导弹类型的变量等于6。

三、主机制作

1.主机结构

在场景中新建一个plane图层,使用绘图工具绘制一个飞机。

选中飞机按F8键将其转换成影片剪辑,名称为plane_mc,双击进入该影片剪辑,新建一个图层,绘制一个矩形,如图8所示,按F8键将其转换成影片剪辑,取实例名称为plane_hit,再将透明度降为0。因为Flash的碰撞测试是以矩形为准的,所以,我们绘制矩形影片剪辑,用来碰撞测试。回到场景,为飞机影片剪辑取实例名称为plane_mc,按F8键转换成影片剪辑,双击进入影片剪辑开始制作,新建一个图层,在第30帧建立关键帧,绘制一个渐淡的红色圆球,将其转换成影片剪辑,名称为plane_bo。如

图9所示。在plane_bo影片剪辑中,第5帧制作它被放大,第10帧缩小变黄,第20帧渐渐消失。新建一个图层,导入音乐文件fx13431_bomb8.mp3,放置在第1帧。双击空白区域回到上一级影片剪辑,

新建8个图层,分别复制plane_bo影片剪辑,放置在第30帧以后的位置,隔两帧放置一个。等于是让8个爆炸的圆球依次播放,模仿爆炸效果。新建一个图层,在第1帧加入代码:

plane_mc._y=550

plane_mc._x=0

_https://www.doczj.com/doc/c610064820.html,mand_bl=false

_root.hittest_bl=false

_root.shot_bl=false

代码说明:

在第1帧,我们让主控飞机的Y坐标等于550,X坐标等于0,让代表可以被控制的command_bl变量为假,表示在这1帧时,主控飞机不能被控制,hittest_bl敌机的热区检测为假,也就是主控飞机不能被击爆,shot_bl子弹可以发射的变量为假。

在第2帧加入代码:

plane_mc._y-=10

plane_mc._alpha=30

代码说明:

主控飞机的Y坐标等于Y坐标减去10,透明度等于30。

在第3帧加入代码:

if(plane_mc._y<=0){

gotoAndPlay(4)

}else{

gotoAndPlay(2)

}

代码说明:

当主控飞机的坐标小于等于0时,开始播放第4帧,如果不然,将播放第2帧,实际上等于让飞机以10个坐标的速度递减。

在第4帧加入代码:

_https://www.doczj.com/doc/c610064820.html,mand_bl=true

_root.hittest_bl=false

_root.shot_bl=true

_root.shot_bl=true

_root.shot_sty=1

_root.shot_speed=10

_root.plane_speed=10

_root.missile_num.gotoAndPlay(1)

代码说明:

在前3帧中,实际是一个让主控飞机飞入场景的动画,而现在,为一些初始变量赋值。

在第30帧加入代码:

stop()

plane_mc._alpha=100

_https://www.doczj.com/doc/c610064820.html,mand_bl=true

_root.hittest_bl=true

代码说明:

在这一帧,我们设置透明度为100,主机可以被控制,碰撞测试也可以开始。

在第31帧加入代码:

_https://www.doczj.com/doc/c610064820.html,mand_bl=false

相关主题
文本预览
相关文档 最新文档