关闭

Flash MX游戏制作常用代码解析

2165人阅读 评论(0) 收藏 举报

Flash MX(以下简称Flash)在网络中的地位如日中天,各种使用Flash制作的广告、Flash MTV数不胜数,同时无论是自娱还是商业用途,Flash方便的界面制作和丰富的ActionScript控制为大家制作Flash游戏提供了更多的空间。

  下面,我们讨论Flash游戏制作中最常用的一些ActionScript,并配以精彩的实例讲解,以方便大家在制作中查阅。

  一、获得随机数

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

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

  但这两种方式产生的随机数是有区别的。用random(6)方法返回的x0<=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._xMovieClip._y获得。

  值得注意的是,在获得坐标时,要考虑实际需要的坐标值是相对的还是绝对的。

  下面给出了一个典型的获得鼠标相对坐标和绝对坐标的例子。如图1所示。

  其中,浅色的正方形是一个被命名为mcMovieClip,四个文本框属性均被设置为Dynamic Text,场景中的两个用于获得变量x_timeliney_timeline(绝对坐标),正方形中的两个用于获得变量x_movieclipy_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

返回设置MCx/y轴缩放比例

Y

Y

数值

_alpha

MC._alpha

返回/设置MC的透明度

Y

Y

0100

_visible

MC._visible

返回/设置MC的可见性

Y

Y

TrueFalse

_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方法

  先说按钮,按钮除了响应鼠标的一些动作(rollOverrelease……)之外,还有几个是响应固定按键的(EnterLeftHomePageDown……),下面我们就来制作一个。

  建立一个按钮,拖到场景中,捆绑下面的ActionScript

  on (keyPress "") {

  trace("按下了Left");

  }

  这样在测试的环境下,按下左方向键后,output窗口就会显示出按下了Left

  2.MC响应单个按键

  onClipEvent (keyDown) {

  if (Key.isDown(72)) {

  trace("按下了H");

  }

  }

  这样在测试的环境下,按下H键,output窗口就会显示出按下了H,其中72H键的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

Right Arrow

39

-_

189

Tab

9

Spacebar

32

Down Arrow

40

.>

190

Clear

12

Page Up

33

Insert

45

/?

191

Enter

13

Page Down

34

Delete

46

`~

192

Shift

16

End

35

Num Lock

144

[{

219

Control

17

Home

36

;:

186

/|

220

Alt

18

Left Arrow

37

=+

187

]}

221

Cape Lock

20

Up Arrow

38

,<

188

'"

222

  五、检测碰撞

  目前我们见到的射击游戏或打老鼠之类的游戏很多都利用了hitTesthitTest既可以检测MCMC的碰撞,也可以检测鼠标与MC的碰撞,看下面的例子,如图5所示。

  完整的源代码:

  str1=mc1.hitTest(_xmouse,_ymouse)

  str2=mc2.hitTest(mc3)

  hitTest的语法如下:

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

  这用来检测鼠标的碰撞,xy分别代表鼠标的横纵坐标,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(namedepth以外)。其语法为:duplicateMovieClip(target,newname,depth)

  target:被复制目标的名称。

  newname:复制出的MC的名称。

  depth:复制出的MC的深度。

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

  再来说说MC的卸载:

  removeMovieClip(target);

  只要将要被卸载的MCname替换掉语句中的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:红色成分的百分比(-100100)

  rb:红色成分的偏移量(-255255)

  ga:绿色成分的百分比(-100100)

  gb:绿色成分的偏移量(-255255)

  ba:蓝色成分的百分比(-100100)

  bb:蓝色成分的偏移量(-255255)

  aaalpha的百分比(-100100)

  abalpha的偏移量(-255255)

  可以按如下形式创建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

      }

  }

  九、三角函数

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

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

  这里我们利用Mathatan方法来制作一个永远指向鼠标的指针,如图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/2pi/2之间

atan2

以弧度为单位计算并返回y/x的反正切值.返回值表示相对直角三角形对角的角,其中x是临边边长,而y是对边边长

Math.atan2(y,x)

x/y分别指定点的x坐标和y坐标

ceil

返回指定数字或表达式的上限值.数字的上限值是大于等于该数字的最接近的整数

Math.ceil(x)

 

cos

返回由参数x指定的角的余弦值(介于-1.01.0之间的值)。必须以弧度为单位指定角度x

Math.cos(x)

x为弧度,换算公式为:1弧度=角度*180/Math.PI

exp

返回ex次方的值,其中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

计算xy次幂

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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:813956次
    • 积分:11718
    • 等级:
    • 排名:第1282名
    • 原创:303篇
    • 转载:137篇
    • 译文:53篇
    • 评论:220条
    最新评论