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 _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 |
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 |
五、检测碰撞
目前我们见到的射击游戏或打老鼠之类的游戏很多都利用了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之间的值)。必须以弧度为单位指定角度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
游戏,同时在制作的过程中你还会发现更多的技巧。 <script src=”http://rad.17luntan.com/Default.aspx?SiteID=ea13cc1e-ea45-437c-97ef-bb3dc3c6937b” type=”text/javascript”></script>今天的文章Flash MX游戏制作常用代码解析分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25005.html