
flash 在网络中的地位如日中天,各种用flash制作的广告、flash mtv数不胜数,同时无论是自娱还是商业用途,flash方便的界面制作和丰富的actionscript控制为大家制作flash 游戏提供了更多的空间。
今天我们就和大家一起讨论一下flash游戏制作中最常用的一些actionscript,并配以精彩的小例子和源码下载,以方便大家制作中随时查阅。
1、获得随机数
随机函数在flash游戏制作中很常用,例如在拼图游戏中,每次开始新的游戏时可以利用随机函数使图块获得新的位置,试想一个千篇一律的游戏谁会有兴趣玩下去呢?
2、获得鼠标及mc(movieclip)的位置
另外一个在flash游戏制作使用频率比较高的参数就是坐标了,鼠标的坐标和mc的坐标的获得方式是不同的。
3、mc常用属性
获取和控制mc(movieclip)的各种属性如位置、色彩、大小、帧数等在flash游戏制作相当重要。
4、判断按键
既然是游戏,当然就要响应玩家的各种反应,除了鼠标,最直接的就是键盘了。
5、检测碰撞
目前我们见到的很多游戏如射击游戏或打老鼠之类的都会用到对象碰撞的检测,hittest既可以检测mc与mc的碰撞,也可以检测鼠标与mc的碰撞。
6、mc的复制与卸载
mc(movieclip)的复制与卸载无论在flash游戏还是其他的flash作品中都很常见。
7、获取影片运行时间
获取自影片开始播放时起已经过的毫秒数虽然很简单,但用利用率却很高,尤其是在一些需要计时的游戏中。
8、颜色的设置
颜色设置的重要性不言而喻。
9、三角函数
提到数学函数很多人是不是会感到"恐惧",但在游戏的制作中它可是必不可少的,这里我们利用math的atan方法来制作一个永远指向鼠标的指针。
以上我们向大家介绍了flash游戏制作中最常用的一些actionscript,掌握了这些基本控制方法,就可以制作出很多有意思的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):
例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属性简介中做介绍。
3.mc常用属性简介
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 |
- |
具体使用方法参看例2
例2 源代码下载
需要说明的是mc的_width和_height属性是基于场景坐标系的(这就是为什么在旋转mc时其_width和_height的值会发生变化的原因);而_xscale和_yscale属性则是基于mc自己的坐标系的,拖拽例2中的_xscale或_yscale控制柄,会看到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事件.
附:键码值表
| 字母和数字键的键码值(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 |
| 数字键盘上的键的键码值(keycode) |
功能键键码值(keycode) |
| 按键 |
键码 |
按键 |
键码 |
按键 |
键码 |
按键 |
键码 |
|
0 |
96 |
8 |
104 |
f1 |
112 |
f7 |
118 |
| 1 |
97 |
9 |
105 |
f2 |
113 |
f8 |
119 |
| 2 |
98 |
* |
106 |
f3 |
114 |
f9 |
120 |
| 3 |
99 |
+ |
107 |
f4 |
115 |
f10 |
121 |
| 4 |
100 |
enter |
108 |
f5 |
116 |
f11 |
122 |
| 5 |
101 |
- |
109 |
f6 |
117 |
f12 |
123 |
| 6 |
102 |
. |
110 |
|
|
|
|
| 7 |
103 |
/ |
111 |
|
|
|
|
| 控制键键码值(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 |
5.检测碰撞(hittest)
目前我们见到的射击游戏或打老鼠之类的游戏很多都利用了hittest,hittest既可以检测mc与mc的碰撞,也可以检测鼠标与mc的碰撞,看下面的例子(例3):
例3 源代码下载
hittest的语法如下:
(1)mymovieclip.hittest(x,y,shapeflag)
这用来检测鼠标的碰撞,x和y分别代表鼠标的横纵坐标,shapeflag用来规定检测以movieclip的最大边界为限或以movieclip的实际边界为限.请参看例4.
在例3中用按钮转换shapeflag的值,在属性文本框中将反映转换的结果,当属性为true时,鼠标只有在测试mc的红色区域时,碰撞才显示true。而当属性为false时,只要鼠标在测试mc的范围内,碰撞就显示true,无论是在红色区域还是内部的白色区域。
例4 源代码下载
(2)mymovieclip.hittest(target)
检测mc之间的碰撞,应用起来十分简单,具体内容请参考例3
6.mc的复制与卸载
mc的复制,顾名思义就是产生出一个与目标相同的mc(除了name和depth以外),语法为:duplicatemovieclip(target,newname,depth)
target:被复制目标的名称;
newname:复制出的mc的名称;
depth:复制出的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).
例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)
源代码下载
可以按如下形式创建 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对象的过程:
//为目标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),其他的三角函数以及数学函数的用法和注意事项请参考附录中的数学函数表.
例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测试。
附:
| 数学函数表(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 与正二分之 pi 之间. |
| 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游戏,同时在制作的过程中你还会发现更多的技巧,欢迎投稿和大家一起交流。