Flash MX游戏
制作常用代码解析
Flash MX(以下简称
Flash)在
网络中的地位如日中天,各种使用
Flash制作的
广告、
Flash MTV数不胜数,同时无论是自娱还是商业用途,
Flash方便的界面
制作和丰富的ActionScript控制为大家
制作Flash游戏提供了更多的空间。
下面,我们讨论
Flash游戏
制作中最常用的一些ActionScript,并配以精彩的实例讲解,以方便大家在
制作中查阅。
一、获得随机数
随机函数在
Flash游戏
制作中很常用,例如在拼图游戏中,每次开始新的游戏时,可以利用随机函数使图块获得新的位置,试想一个千篇一律的游戏谁会有兴趣玩下去呢?
我们有两种产生随机数的方式:random()和Math.random()。举例来讲,如果我们随机赋给x一个0~5的数,可以使用x=random(6)或者x=Math.random()*5。
但这两种方式产生的随机数是有区别的。用random(6)方法返回的x是0<=x<=5的整数,而另外一种返回的x则是0<=x<5的小数。
试着在第一帧中写入下面的ActionScript,并在第二帧创建内容帧以形成循环:
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
…
区别一目了然。
二、获得鼠标及MC(MovieClip)的位置
另外一个在Flash游戏制作使用频率比较高的参数就是坐标了,鼠标的坐标和MC的坐标的获得方式是不同的。鼠标的坐标可以用_xmouse和_ymouse获得,MC的坐标可以用MovieClip._x和MovieClip._y获得。
值得注意的是,在获得坐标时,要考虑实际需要的坐标值是相对的还是绝对的。
下面给出了一个典型的获得鼠标相对坐标和绝对坐标的例子。如图1所示。
其中,浅色的正方形是一个被命名为mc的MovieClip,四个文本框属性均被设置为Dynamic Text,场景中的两个用于获得变量x_timeline和y_timeline(绝对坐标),正方形中的两个用于获得变量x_movieclip和y_movieclip(相对坐标),为了获得变量,需要在文本框的属性面板中的Var属性中分别填入相应的变量名,与上面例子形成循环的方式一样,在第一帧中写下面的ActionScript,第二帧创建为内容帧:
x_timeline = _root._xmouse;
y_timeline = _root._ymouse;
x_movieclip = mc._xmouse;
y_movieclip = mc._ymouse;
注意:场景的坐标原点为其左上角,坐标值向右向下递增,为正值(这与我们通常意义的坐标并不相同);MC的坐标原点是编辑MC时的中心,坐标象限如图2所示。
获得MC坐标的方法与上面说的大同小异,我们将在下面的MC属性简介中做介绍。
三、MC常用属性
获取和控制MC的各种属性如位置、色彩、大小、帧数等在Flash游戏制作相当重要。
MC常用的属性大致如下表所示:
属 性用 法说 明可获得可设置取值范围
_x
_yMC._x
MC._y返回/设置MC的横纵坐标值YY数值
_xscale
_yscaleMC._xscale
MC._yscale返回设置MC的x/y轴缩放比例YY数值
_alphaMC._alpha返回/设置MC的透明度YY0~100
_visibleMC._visible返回/设置MC的可见性YYTrue;False
_width
_heightMC._width
MC._height返回/设置MC的宽/高值YY数值
_rotationMC._rotation返回/设置MC的角度YY数值
_currentframeMC._currentframe返回MC的当前帧YN-
_totalframesMC._totalframes返回MC的总帧数YN-
_framesloadedMC._framesloaded返回已下载帧数YN-
_nameMC._name返回/设置MC的名称YY-
具体使用方法参看下例,如图3所示。
完整的源代码:
onClipEvent (enterFrame) {
with (this) {
_root.mw = _width;
_root.mh = _height;
_root.mr = _rotation;
_alpha = _root.al.textinput.value.text;
_xscale = _root.xs.textinput.value.text;
_yscale = _root.ys.textinput.value.text;
if (_x>=330 && _x<=470) {
_x += _root.xInt;
} else {
_x = 400;
}
if (_y>=40 && _y<=165) {
_y += _root.yInt;
} else {
_y = 100;
}
_rotation += _root.rInt;
}
}
需要说明的是:MC的_width和_height属性是基于场景坐标系的(这就是为什么在旋转MC时其_width和_height的值会发生变化的原因);而_xscale和_yscale属性则是基于MC自己的坐标系的,拖拽上例中的_xscale或_yscale控制柄,会看到MC以自身的坐标进行缩放变化。
四、判断按键
既然是游戏,当然就要响应玩家的各种反应。除了鼠标,最直接的就是键盘了。
响应键盘无非是判断玩家按下了哪一个键或者组合键,要实现这些其实很简单,我们既可以通过按钮或MC的事件来响应按键,也可以通过帧上的动作来响应。
1.按钮的keyPress方法
先说按钮,按钮除了响应鼠标的一些动作(如rollOver,release……)之外,还有几个是响应固定按键的(如Enter,Left,Home,PageDown……),下面我们就来制作一个。
建立一个按钮,拖到场景中,捆绑下面的ActionScript:
on (keyPress "") {
trace("按下了Left键");
}
这样在测试的环境下,按下左方向键后,output窗口就会显示出“按下了Left键”。
2.MC响应单个按键
onClipEvent (keyDown) {
if (Key.isDown(72)) {
trace("按下了H键");
}
}
这样在测试的环境下,按下H键,output窗口就会显示出“按下了H键”,其中72是H键的keyCode值(其他按键的keyCode值将在后面的对照表中给出),如果不知道某个键的keyCode值也没关系,Flash为我们提供了getCode函数,将上面ActionScript中的72替换成Key.getCode("H")会得到同样的效果。如图4所示。
完整的源代码:
onClipEvent (load) {
// 初始化瓢虫移动的速度
speed = 5;
}
onClipEvent (enterFrame) {
// 垂直/水平方向
if (Key.isDown(Key.LEFT) && !Key.isDown(Key.RIGHT)) {
_x -= speed;
_rotation = 270;
}
if (Key.isDown(Key.RIGHT) && !Key.isDown(Key.LEFT)) {
_x += speed;
_rotation = 90;
}
if (Key.isDown(Key.UP) && !Key.isDown(Key.DOWN)) {
_y -= speed;
_rotation = 0;
}
if (Key.isDown(Key.DOWN) && !Key.isDown(Key.UP)) {
_y += speed;
_rotation = 180;
}
//
// 倾斜方向
if (Key.isDown(Key.LEFT) && Key.isDown(Key.UP) && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.DOWN)) {
_rotation = 315;
}
if (Key.isDown(Key.RIGHT) && Key.isDown(Key.UP) && !Key.isDown(Key.LEFT) && !Key.isDown(Key.DOWN)) {
_rotation = 45;
}
if (Key.isDown(Key.LEFT) && Key.isDown(Key.DOWN) && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.UP)) {
_rotation = 225;
}
if (Key.isDown(Key.RIGHT) && Key.isDown(Key.DOWN) && !Key.isDown(Key.LEFT) && !Key.isDown(Key.UP)) {
_rotation = 135;
}
//
// 保证瓢虫在视线内

if (_y<0) {
_y = 300;
}
if (_y>300) {
_y = 0;
}
if (_x<0) {
_x = 300;
}
if (_x>300) {
_x = 0;
}
}
3.MC响应组合键
onClipEvent (keyDown) {
if (Key.isDown(72) && Key.isDown(17)) {
trace("您按下的组合键是Ctrl+H");
}
}
在测试的环境中按下Ctrl+H键,output窗口就会显示出“您按下的组合键是Ctrl+H”。
4.利用帧上的动作响应按键
新建一个Flash文件,利用上面讲过的:在第一帧写ActionScript,第二帧创建内容帧的方法,使影片形成循环以便随时进行判断,然后在第一帧中写入下面的几组代码,分别进行试验;你也可以不建立第二帧,而是用试验代码代替_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. 键码值对照表
下面,我们给出键码值,供读者速查。
(1)字母和数字键的键码值(keyCode)
按键键码按键键码按键键码按键键码
A65J74S83149
B66K75T84250
C67L76U85351
D68M77V86452
E69N78W87553
F70O79X88654
G71P80Y89755
H72Q81Z90856
I73R82048957
(2)数字键盘上的键的键码值(keyCode)
按键键码按键键码按键键码按键键码
09641008104Enter108
19751019105-109
2986102*106.110
3997103+107/111
(3)功能键键码值(keyCode)
按键键码按键键码按键键码按键键码
F1112F4115F7118F10121
F2113F5116F8119F11122
F3114F6117F9120F12123
(4)控制键键码值(keyCode)
按键键码按键键码按键键码按键键码
BackSpace8Esc27Right Arrow39-_189
Tab9Spacebar32Down Arrow40.>190
Clear12Page Up33Insert45/?191
Enter13Page Down34Delete46`~192
Shift16End35Num Lock144[{219
Control17Home36;:186\|220
Alt18Left Arrow37=+187]} 221
Cape Lock20Up Arrow38,<188';" 222
五、检测碰撞
目前我们见到的射击游戏或打老鼠之类的游戏很多都利用了hitTest,hitTest既可以检测MC与MC的碰撞,也可以检测鼠标与MC的碰撞,看下面的例子,如图5所示。
完整的源代码:
str1=mc1.hitTest(_xmouse,_ymouse)
str2=mc2.hitTest(mc3)
hitTest的语法如下:
1.myMovieClip.hitTest(x,y,shapeFlag)
这用来检测鼠标的碰撞,x和y分别代表鼠标的横纵坐标,shapeFlag用来规定检测以MovieClip的最大边界为限或以MovieClip的实际边界为限。请参看下例。
在图5所示的实例中,用按钮转换shapeFlag的值,在属性文本框中将反映转换的结果,当属性为True时,鼠标只有在测试MC的红色区域时,碰撞才显示True。而当属性为False时,只要鼠标在测试MC的范围内,碰撞就显示True,无论是在红色区域还是内部的白色区域。如图6所示。
完整的源代码:
on (release) {
_root.flag = not _root.flag;
}
2.myMovieClip.hitTest(target)
检测MC之间的碰撞,应用起来十分简单,具体内容请参考图5所示的实例代码。
六、MC的复制与卸载
MC的复制与卸载,无论在Flash游戏还是其他Flash作品中都很常见。
MC的复制,顾名思义,就是产生出一个与目标相同的MC(除name和depth以外)。其语法为:duplicateMovieClip(target,newname,depth)
target:被复制目标的名称。
newname:复制出的MC的名称。
depth:复制出的MC的深度。
需要注意,复制出来的新MC的name最好不要相同,也不要与被复制的MC的相同,因为这样会给控制带来不可预期的麻烦;另外depth也是一个相当重要的参数,如果新复制出的MC与前面某个复制的MC的depth属性相同(即位于通一深度),那么以前被复制的MC将被新复制的MC替换(不管它们是否属于同一被复制目标),这个特性经常被用来制作鼠标跟随的效果。
再来说说MC的卸载:
removeMovieClip(target);
只要将要被卸载的MC的name替换掉语句中的target就可以成功的完成卸载任务。
七、获取影片运行时间
获取自影片开始播放时起已经过的毫秒数虽然很简单,但其利用率却很高,尤其是在一些需要计时的游戏中。
getTimer();
这个函数用以返回自影片开始播放时起已经过的毫秒数,虽然是个很简单的函数,但用利用率却很高,尤其是在一些需要计时的游戏中。
需要说明的是:毫秒与秒的计算公式为1毫秒=1/1000秒;函数以影片第一次播放的开始时刻为0,不受任何其他因素影响。也就是说如果你想从头开始计时,那么只有重起player,或者定义一个变量来存放getTimer的值,然后用getTimer与变量做减法运算以便得到新的运行时间,看下面的例子,如图7所示。
完整源代码:
time_old=Math.round(getTimer()/1000)
time_new=time_old-tTime
八、颜色的设置
说到颜色必须先说说什么是对象,对象就是预先定义好的用来访问某些特定类型的信息的集合,大多数预定义对象都有自己的方法(被指派给一个对象的函数被称为这个对象的一个方法),你可以通过这些方法得到不同类型的返回值或执行某个动作。
预定义对象包括普通对象和顶级对象。普通对象在使用前需要创建(我们将要提到的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)。
可以按如下形式创建colorTransformObject参数:
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对象的过程,如图8所示。
//为目标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);.
完整源代码:
单击setTransform按钮,输入以下代码。
on (release) {
myColor = new Color(_root.mc);
myTransform = new Object();
//判断数值是否在规定范围内
with (_root) {
if (ra<-100) {
ra = -100;
}
if (ra>100) {
ra = 100;
}
if (rb<-255) {
rb = -255;
}
if (rb>255) {
rb = 255;
}
if (ga<-100) {
ga = -100;
}
if (ga>100) {
ga = 100;
}
if (gb<-255) {
gb = -255;
}
if (gb>255) {
gb = 255;
}
if (ba<-100) {
ba = -100;
}
if (ba>100) {
ba = 100;
}
if (bb<-255) {
bb = -255;
}
if (bb>255) {
bb = 255;
}
if (aa<-100) {
aa = -100;
}
if (aa>100) {
aa = 100;
}
if (ab<-255) {
ab = -255;
}
if (ab>255) {
ab = 255;
}
myTransform.ra = ra;
myTransform.rb = rb;
myTransform.ga = ga;
myTransform.gb = gb;
myTransform.ba = ba;
myTransform.bb = bb;
myTransform.aa = aa;
myTransform.ab = ab;
}
//将设置付给MC
myColor.setTransform(myTransform);
}
单击Reset按钮,输入以下代码。
on (release) {
with (_root) {
ra = 100;
rb = 255;
ga = 0;
gb = 0;
ba = 0;
bb = 0;
aa = 100;
ab = 0;
reColor=new Color(mc)
reColor.setRGB(0xff0000)
mc._alpha=100
}
}
九、三角函数
提到数学函数很多人是不是会感到“恐惧”,但在游戏制作中它可是必不可少的,这里我们利用Math的atan方法来制作一个永远指向鼠标的指针。
三角函数属于Flash中的顶级对象──Math,它在我们制作游戏中必不可少。
这里我们利用Math的atan方法来制作一个永远指向鼠标的指针,如图9所示。其他的三角函数以及数学函数的用法和注意事项请参考数学函数表。
新建一个MC,画一个长度为70的水平指向右侧的箭头(箭头根部放在中心点上),回到场景,按下Ctrl+J键修改影片的大小为200*200,将指针从库中拖入场景,命名为“pointer”,修改坐标为100*100,在主timeline的第一帧中写如下ActionScript:
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键测试。
下面,我们给出数学函数表(Math)。
方法描 述语 法说 明
Abs计算并返回由参数x指定的数字的绝对值Math.abs(x)
acos以弧度为单位计算并返回参数x中指定的数字的反余弦值Math.acos(x)-1.0<=x<=1.0
asin以弧度为单位计算并返回参数x中指定的数字的反正弦值Math.asin(x)-1.0<=x<=1.0
atan计算并返回参数 x 中指定的数字的反正切值Math.atan(x)返回值介于-pi/2与pi/2之间
atan2以弧度为单位计算并返回y/x的反正切值.返回值表示相对直角三角形对角的角,其中x是临边边长,而y是对边边长Math.atan2(y,x)x/y分别指定点的x坐标和y坐标
ceil返回指定数字或表达式的上限值.数字的上限值是大于等于该数字的最接近的整数Math.ceil(x)
cos返回由参数x指定的角的余弦值(介于-1.0与1.0之间的值)。必须以弧度为单位指定角度xMath.cos(x) x为弧度,换算公式为:1弧度=角度*180/Math.PI
exp返回e的x次方的值,其中e为自然对数的底 (e),x为参数x中指定的指数Math.exp(x)常数Math.E可以提供e的值
floor返回参数x中指定的数字或表达式的下限值。下限值是小于等于指定数字或表达式的最接近的整数Math.floor(x)表达式:Math.floor(12.5)将返回值:12
log返回参数 x 的自然对数Math.log(x) x>0
max返回两个数中最大者Math.max(x,y)
min返回两个数中最小者Math.min(x,y)
pow计算x的y次幂Math.pow(x)
random返回n,其中0<= n<1Math.random()获得a-b之间的随机整数的公式为:Math.floor(Math.random()*(b-a+1)+a)
round将参数x的值向上或向下舍入为最接近的整数并返回值Math.round(x)
sin计算并返回以弧度为单位指定的角度的正弦值Math.sin(x)换算公式参见cos
sqrt计算并返回指定数字的平方根Math.sqrt(x)x>=0
tan计算并返回指定角度的正切值Math.tan(x)换算公式参见cos
以上我们向大家介绍了Flash游戏制作中最常用的一些ActionScript,掌握了这些基本控制方法,就可以制作出很多有意思的Flash游戏,同时在制作的过程中你还会发现更多的技巧。