配色: 字号:
游戏制作常用代码解析
2014-06-18 | 阅:  转:  |  分享 
  
FlashMX游戏制作常用代码解析

分类:flashas32007-10-0516:531241人阅读评论(0)收藏举报FlashMX(以下简称Flash)在网络中的地位如日中天,各种使用Flash制作的广告、FlashMTV数不胜数,同时无论是自娱还是商业用途,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,四个文本框属性均被设置为DynamicText,场景中的两个用于获得变量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

_y MC._x

MC._y 返回/设置MC的横纵坐标值 Y Y 数值 _xscale

_yscale MC._xscale

MC._yscale 返回设置MC的x/y轴缩放比例 Y Y 数值 _alpha MC._alpha 返回/设置MC的透明度 Y Y 0~100 _visible MC._visible 返回/设置MC的可见性 Y Y True;False _width

_height MC._width

MC._height 返回/设置MC的宽/高值 Y Y 数值 _rotation MC._rotation 返回/设置MC的角度 Y Y 数值 _currentframe MC._currentframe 返回MC的当前帧 Y N - _totalframes MC._totalframes 返回MC的总帧数 Y N - _framesloaded MC._framesloaded 返回已下载帧数 Y N - _name MC._name 返回/设置MC的名称 Y Y - 具体使用方法参看下例,如图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;

}

//

//保证瓢虫在视线内:D

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)

按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 3 51 D 68 M 77 V 86 4 52 E 69 N 78 W 87 5 53 F 70 O 79 X 88 6 54 G 71 P 80 Y 89 7 55 H 72 Q 81 Z 90 8 56 I 73 R 82 0 48 9 57 (2)数字键盘上的键的键码值(keyCode)

按键 键码 按键 键码 按键 键码 按键 键码 0 96 4 100 8 104 Enter 108 1 97 5 101 9 105 - 109 2 98 6 102 106 . 110 3 99 7 103 + 107 / 111 (3)功能键键码值(keyCode)

按键 键码 按键 键码 按键 键码 按键 键码 F1 112 F4 115 F7 118 F10 121 F2 113 F5 116 F8 119 F11 122 F3 114 F6 117 F9 120 F12 123 (4)控制键键码值(keyCode)

按键 键码 按键 键码 按键 键码 按键 键码 BackSpace 8 Esc 27 RightArrow 39 -_ 189 Tab 9 Spacebar 32 DownArrow 40 .> 190 Clear 12 PageUp 33 Insert 45 /? 191 Enter 13 PageDown 34 Delete 46 `~ 192 Shift 16 End 35 NumLock 144 [{ 219 Control 17 Home 36 ;: 186 /| 220 Alt 18 LeftArrow 37 =+ 187 ]} 221 CapeLock 20 UpArrow 38 ,< 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参数是通过newObject构造函数创建的通用对象它具有指定颜色的红、绿、蓝和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=newObject();

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=newColor(MC);

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

myColorTransform=newObject;

//为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=newColor(_root.mc);

myTransform=newObject();

//判断数值是否在规定范围内

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=newColor(mc)

reColor.setRGB(0xff0000)

mc._alpha=100

}

}

九、三角函数

提到数学函数很多人是不是会感到“恐惧”,但在游戏制作中它可是必不可少的,这里我们利用Math的atan方法来制作一个永远指向鼠标的指针。

三角函数属于Flash中的顶级对象──Math,它在我们制作游戏中必不可少。

这里我们利用Math的atan方法来制作一个永远指向鼠标的指针,如图9所示。其他的三角函数以及数学函数的用法和注意事项请参考数学函数表。

新建一个MC,画一个长度为70的水平指向右侧的箭头(箭头根部放在中心点上),回到场景,按下Ctrl+J键修改影片的大小为200200,将指针从库中拖入场景,命名为“pointer”,修改坐标为100100,在主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);

}elseif(x>=0&&y<0){

r=Math.round(360+tan);

}else{

r=Math.round(180+tan);

}

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

pointer._rotation=r;

//将r值付给_rotation

放置一个用来显示r值的文本框属性为DynamicText,获取变量(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之间的值)。必须以弧度为单位指定角度x Math.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<1 Math.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游戏,同时在制作的过程中你还会发现更多的技巧。



献花(0)
+1
(本文系愚_石首藏)