在ActionScript中变量不需要声明,但是,声明变量是良好的编程风格,这便于掌握一个变量的生命周期,明确知道某一个变量的意义,有利于程序的调试。通常,在动画的第一桢就已经声明了大部分的全局变量并为它们赋予了初始值。每一个MC对象都拥有自己的一套变量,而且不同MC对象中的变量相互独立且互不影响。
变量名
变量名需符合以下几点:
1) 变量名必须是一个标识符,不能包含任何特殊符号;
2) 变量名不能是关键字及布尔值(true和flase)
3) 变量名在其作用域中唯一。
变量的类型
在Flash中不需要显式的声明一个变量的类型,当变量被赋值的时候,它的类型被动态的确定,当然,也可以把赋值语句理解为变量的声明语句,例如:
x = 3;
上面的表达式声明了一个x变量,其类型为number类型,并且x的值为3。对变量x的赋值可能还会改变它的数据类型:
x = "hello";
此时变量x将从number类型改变为string类型。这同C语言等其他高级语言好像有些不同,但其实Flash中的赋值语句不仅仅是一个赋值功能,它还起到了变量声明的作用。
声明了却没有被赋值的变量类型被称为无类型变量。
在特定的条件下,ActionScript可以自动将变量的类型进行转换。例如,当为trace语句传递一个值以后,这个值被自动转换成字符串类型输出到Output窗口中。在表达式中,ActionScript会根据需要对变量进行类型转换,如下例:
"The number is " + 7
ActionScript将数字7自动转换成字符串"7",并将它添加在前面字符串的末尾:
"The number is 7"
在调试脚本的时候,需要确切掌握一个变量的数据类型,因为数据类型决定了变量的行为,ActionScript中提供了typeof操作符,用于确定某一个变量的类型:
trace( typeof( aVariable ));
另外,Flash 5中提供了两个类型转换函数。Number函数可以将一个字符串转换成数字,相应的,String函数可以将一个数字转换成一个字符串,它们的用法比较简单,在Flash 5的脚本编辑面板中已经提供了充分的提示。
变量的作用域
ActionScript中有局部变量和全局变量之分,全局变量在整个动画的脚本中都有效,而局部变量只在它自己的作用域内有效。声明局部变量需要用到var语句。例如,在下面的例子中,i是一个局部的循环变量,它只在函数init中有效:
function init(){
var i;
for(i=0; i<10; i++){
randomArray[i] = random(100);
}
}
局部变量可以防止名字冲突,而名字冲突可能会导致致命的程序错误。例如,变量n是一个局部变量,它可以用在一个MC对象中计数,而另外一个MC对象中可能也有一个变量n,它可能用作一个循环变量,因为它们有不同的作用域,所以并不会造成任何冲突。
使用局部变量的好处在于减少程序错误发生的可能。比如,一个函数中使用局部变量,那么这个变量只会在函数内部被改变,而一个全局变量可以在整个程序的任何位置被改变,使用错误的变量可能会导致函数返回错误的结果,甚至使整个系统崩溃。
此外,函数的参数也将作为该函数的一个局部变量来使用,例如:
x=3;
function test(x)
{
x=1;
a=x;
}
test(x)
程序执行之后的结果是a=1,x=3。从这个例子可以看出test函数中的x参数的确是作为函数内部的局部变量来处理了。
变量的声明
在程序中,给一个变量直接赋值或者使用setVariables语句赋值就相当于声明了全局变量;局部变量的声明需要用var语句。在一个函数体内用var语句声明变量,该变量就成了这个函数的局部变量,它将在函数执行结束的时候被释放;在根时间轴上使用var语句声明的变量也是全局的,它们在整个动画结束的时候才会被释放掉。
在声明了一个全局变量之后,紧接着再次使用var语句声明该变量,那么,这条var语句无效,例如:
aVariable = 10;
var aVariable;
aVariable += 1;
在上面的脚本中,变量aVariable被重复声明了两次,其中var语句的声明被视为无效,脚本执行后,变量aVariable的值将为11。
注:call语句同样会为它调用的程序块生成一个局部变量作用域,当被调用的脚本结束的时候,这个局部作用域也同时消失。Flash 5中call语句可以用with语句取代。
使用trace语句可以检测变量的值,例如trace(aVariable)将变量aVariable的值转换成字符串传递到Output窗口中,在调试模式下,还可以随时改变和获取某一个变量的值。
变量的使用
在引用一个变量的时候,必须先进行声明(使用var语句或者直接赋值),如果变量没有得到初始化,那么,在下面的例子中,将会产生错误:
gotoAndPlay( aFrame );
其中aFrame是一个标签,因为aFrame没有被声明,gotoAndPlay将会被错误的执行,跳转到一个不确定的位置。
变量的内容可以随时被改变,变量的类型决定了它们的行为。请注意下面一段关于变量类型的说明,其中一些特征是ActionScript中所特有的。
简单数据类型传递的是变量的值,就是说,变量的内容会被拷贝一份之后才被传递出去,不论是在赋值语句中,还是作为参数传递给一个函数都是一样:
var x = 4;
var y = Math.sqrt(x);
上面例子中,变量x的值被复制后传递给sqrt函数,并将返回结果2赋值给变量y,变量x的值保持不变。 对象数据类型包含有大量复杂的信息,具有这种数据类型的变量并不保存对象的实际内容,它们保存的只是一个指向对象的指针,当调用对象的属性或者方法的时候,根据这个指针找到该对象实际的位置并返回所需要的内容。
下面是一个通过指针进行传递的例子:
var myArray = ["Holly", "Tom"];
var newArray = myArray;
myArray[1] = "Marry";
trace(newArray);
上面的例子中,一个数组对象myArray有两个元素,newArray被赋值为指向myArray的指针,当myArray的第二个元素被改变之后,所有指向它的其它变量内容也会改变,最后的trace语句将会把["Marry", "Tom"]输出到输出窗口中。
下面是一个将对象类型的变量作为参数传递给函数的例子:
function initArray(newArray){
var i;
for ( i=0; i<10; i++ ){
newArray[i] = random( 100 );
}
}
var myArray = new Array();
initArray( myArray );
上例中,myArray被传递到函数initArray中,因为传递的是对象指针,所以在函数内,数组myArray将被初始化。
在ActionScript中,对一般对象的引用称为强引用,对MC动画的引用称为弱引用。强引用是指只要还有一个指针指向该对象,那么这个对象就不能被释放;弱引用是指如果MC动画结束之后,所有指向该MC动画的指针将随之而不再有效。
Action Script编辑环境
简介
熟悉VB的读者可能会发现,Flash 4中的脚本语言有很多地方跟VB Script极为相似,比如赋值语句、条件语句,字符串的操作等等,然而,Flash 4中的脚本并不够严格,所实现的功能相对来说也很有限。
在Flash 5中,我们很高兴的发现,Macromedia公司对其中的脚本语言进行了全面的完善,并且使用更为流行的类Java Script语法,这对于偏爱Java Script的朋友来说,实在是一件值得高兴的事情。
除了比较完善的语法之外,还增加了许多实用函数,不仅如此,您还可以编写自定义的函数呢,不用再像从前那样找一个空白桢并定义一个Label来实现函数调用了(其实我觉得这种方法也挺方便);吸取了面向对象编程方法的一些思想,提供了十几个对象,您可以方便的定义一些实例并且调用其内部函数以及常量;加强了对鼠标的控制,您不必再需要拖拽一个MC来获得鼠标坐标了,Flash 5中已经增加了两个全局属性_xmouse和_ymouse,而且您还可以控制是否隐藏鼠标;Flash 5中还增加了对XML的支持,今后,可以直接通过 XML 读取数据库;另外,Flash 5还支持一些额外的外挂库功能,增加脚本排错功能(Debug),支持对象表和关系树,以便于用户检查错误等等。
这些对编程功能的增强,将为Flash增加更多的魅力,令Flash动画更加精彩!
编辑窗口功能简介
还记得Flash 4中的脚本编辑窗口吗?还记得它给您带来过的编程上的不便吧!太小了,而且必须经常要一会儿用鼠标一会儿用键盘,大大降低了编程效率,而您又不能在Notepad 中编写,因为无法粘贴到Flash中(反之则可以)。在Flash 5中,已经对这些弊病进行了改善。首先您将拥有一个可以调整大小的编辑窗口了;编辑窗口的界面也进行了调整,但是,不用担心,您熟悉的一些按钮仍然保留下来了,只不过位置有所变化,另外还增加了几个新的按钮,所有的Actions放在了一个列表框中,您可以方便的从中选取您所需要的Action,参数栏则放到了窗口的下部;还有就是您可以从一个文本文件导入脚本或者将Flash中的脚本导出到一个文本文件中了,在您对Action Script熟悉之后,完全可以用Notepad写好程序然后导入到所需要的地方。
Action Script基本语法
变量与常量
变量的名字不可是使用特殊符号,而且要尽量避免使用flash中已经存在的关键字。
Flash 5中使用变量不需要预先申明,而且不区分局部变量和全局变量的申明。但是奇怪的是,Flash 5中却提供了var关键字,而且对var关键字说明是用于定义(局部)变量,但是笔者经过测试,发现完全不用使用var来申明一个变量,而且所谓传统意义上的局部变量申明根本不起作用。请看下面一段程序:
Function test(){
Var x;
x+=1;
}
x=1;
test();
程序执行完毕之后,x的结果将是2;
申明变量的好处在于可清楚掌握变量的生命周期,能增强程序的可调试性和易读性。Flash 5提供了delete关键字,在一个变量生命周期结束的时候可以用delete来释放这个变量。请看下面的程序:
var y;
function test(){
var x;
x=2;
y=x-1;
delete x;
}
test();
执行结果为y=1,变量x被释放;这样看起来x好象起到了局部变量的作用。但是假如您在程序中还有一个全局变量x的话,test函数中的var变量申明将会被忽略,对x的任何引用和赋值都是针对全局变量x,如果不注意的话,将导致程序的异常。
但是,还有一种特殊的情况,局部变量和全局变量将被区分开来。那就是函数调用时候的参数,将作为函数中的一个局部变量,对参数变量的任何赋值并不会影响同名的全局变量。如下所示的例子:
x=3;
function test(x)
{
x=1;
a=x;
}
test(x)
程序执行之后的结果是a=1,x=3。从这个例子可以看出test函数中的x参数的确是作为函数内部的局部变量来处理了。
除了上面的特例之外,在Flash 5中,并非没有局部变量的概念。局部变量只能存在于某一个Movieclip之中,换一句话说,就是一个MC中定义的变量相对于整个场景来说将成为该MC的局部变量。比如一个名字为test的MC,其中定义了一个MC参数x,那么这个参数x将只会在该MC范围内起作用,在该MC中对x的赋值将不会影响全局变量x,也当然不会影响其它MC中的x变量喽。
Flash 5还提供了一些常量,使用非常方便。如常量对象Mouse、Key、Math等。这些对象不可以用来初始化一个实例对象,只能被直接调用,如Mouse.hide()就可以隐藏鼠标,而Math.PI就代表圆周率了。关于这些对象的详细说明请参看附录。
操作符
Flash 5提供的操作符全部列表在下面,用法完全相同于Java script。
算术操作符
* 乘号 + 加号 - 减号 / 除号
++ 变量自加一 -- 变量自减一 % 取余数
逻辑操作符
! 逻辑非 != 不等于 && 逻辑与 < 小于
<= 小于等于 <> 不等于 == 相等 > 大于
>= 大于等于 and 逻辑与 not 逻辑非 or 逻辑或
| | 逻辑或
位操作符
& 位与 | 位或 ~ 补位 ^ 位异或
<< 位左移 >> 位右移 >>> 位右移(无符号)
复合操作符
%= A%=B 等效于 A=A%B
&= A&=B 等效于 A=A&B
*= A*=B 等效于 A=A*B
+= A+=B 等效于 A=A+B
-= A-=B 等效于 A=A-B
/= A/=B 等效于 A=A/B
<<= A<<=B 等效于 A=A<<B
>>= A>>=B 等效于 A=A>>B
>>>= A>>>=B 等效于 A=A>>>B
^= A^=B 等效于 A=A^B
|= A|=B 等效于 A=A|B
字符串操作符
add 连接两个字符串
eq A eq B 字符串A值与字符串值B相等
ge A ge B 字符串A值大于等于字符串B值
gt A gt B 字符串A值大于字符串B值
le A le B 字符串A值小于等于字符串B值
lt A lt B 字符串A值小于字符串B值
ne A ne B 字符串A值不等于字符串B值
其它
"" 字符串 () 括号 = 赋值
typeof 返回变量类型
条件语句
if语句
if语句的一般形式是:
if(条件表达式)
{…}
else{…}
else if(判断条件){…}
….
else if语句可以有无限多个。
Flash 4中使用的是VB Script语法: if… else if… end if,在Flash 5中不再适用。
IfFrameLoaded语句
IfFrameLoaded语句的一般形式是:
ifFrameLoaded(<场景名称>,<桢编号>)
{…}
该语句为Flash特有的条件语句,用于判定某个桢是否已经被载入。
该语句的详细解释及其例子请参看附录。
Flash 5中不支持switch语句。
循环语句
Flash 5提供了四种循环语句,其中前三种是大家所熟悉的Java script循环语句,而第四种却是Flash 5所特有的循环语句。
Do语句
Do语句的一般形式是:
Do
循环体
while(条件表达式);
while语句
while语句的一般形式是:
while(条件表达式)
循环体
for语句:
for语句的一般形式有两种:
for(初始化语句;条件表达式;递增语句)
循环体
for(递增语句 in 对象)
循环体
流终止语句
在Flash 5中提供了三种流终止语句。Bread语句用于退出循环语句和标号块。continue语句用于跳转道循环体末尾最后一行语句。Return语句用于退出一个方法或程序体。他们的用法与Java script中用法相同。
跳转语句
Flash 5中提供了goto语句,值得注意的是它是Flash 5特有的语句,其用法并不同于其它高级语言中的goto语句。Flash 5中的goto语句是专门用于在不同的桢和场景中进行切换的。根据所填写参数的不同,goto语句还有几种不同的变形形式,如下:
gotoAndPlay( [场景名,]<桢编号|桢标签|表达式>);
根据编号或者标签或者表达式结果,跳转到某一特定场景的某一个特定桢,并且继续动画的播放。
gotoAndStop( [场景名,]<桢编号|桢标签|表达式>);
根据编号或者标签或者表达式结果,跳转到某一特定场景的某一个特定桢,并且停止动画的播放。
gotoAndPlay( <桢编号|桢标签|表达式> );
根据编号或者标签或者表达式结果,在同一个场景中跳转到某一特定桢,并且继续动画的播放。
gotoAndStop( <桢编号|桢标签|表达式> );
根据编号或者标签或者表达式结果,在同一个场景中跳转到某一特定桢,并且在该桢停止动画的播放。
nextFrame();
跳转并停止在下一桢。
prevFrame();
跳转并停止在上一桢。
nextScene();
跳转到下一场景。
prevScene();
跳转到前一场景。
通过goto语句可以灵活的实现场景的切换和桢流的控制,特别是在结合标签的使用后。
标签
Flash 5中的标签是专门用于标识一个桢的,程序中无法定义一个标签。标签的唯一用途就在于给一个桢起一个有意义的名字。标签的合理利用可以大大提高程序的可阅读性和可维护性,不仅是利于掌握动画流程,而且利于程序的结构化和代码重用。当然,在Flash 5中已经提供了定义函数的方法,但是标签所起到的作用却仍然是不可替代的。利用标签来控制动画流要比用桢编号好的多,相信有经验的用户都已经深有体会;而用标签来实现一个函数的定义和调用也是相当的简洁明了的,您至少可以很快的找到您所定义的函数在什幺地方,而这是function所定义的函数所不能达到的。但是,用一个标签结合一个桢定义函数不能够传递参数,唯一的方法就是通过全局变量来实现。
引用一个标签的Action只有goto语句和call语句。
函数
Flash 5中函数定义的一般形式是:
function <函数名> (参数表)
{ 函数体 }
Flash 5中的函数无需定义返回类型,但是它可以返回任何一种类型的值。函数只可以传递值参,参数只在函数体内起作用,相当于该函数内部的局部变量,它们的生命周期随着函数生命周期的结束而结束。为函数返回一个值可以使用return语句。函数不支持递归调用,但是当递归调用函数的时候,语法检查并不报错,只是递归函数执行结果将与预期的结果不同。
例:
function test( x, y )
{
x=1;
y=2;
return x+y;
}
x=3;
y=4;
a=test(x,y);
b=x+y;
程序运行后结果如下:
x=3, y=4, a=3, b=7;
除了自定义函数以外,Flash 5还提供了一些所谓的“库函数”,至于库函数有哪些,请参看附录。
对象
Flash 5中提供了一些已经封装好的对象,包括一些常量对象。虽然我们还不能在程序中定义自己的对象,但是还是有一个变通的方法来实现的,请看后面的关于如何实现自定义对象的章节。这里我们先简单的说明一下已有的对象及其初始化方法。
名称 是否可初始化实例
Array 数组对象 是
Boolean 布尔数 是
Color 颜色对象 是
Date 日期 是
Key 键盘 否
Math 数学函数 否
Movieclip MC对象 是
Mouse 鼠标 否
Number 数字 是
Object 对象 是
Selection 选择区 否
Sound 声音 是
String 字符串 是
XML 可扩充性标记语言 是
XMLSocket XML套接口 是
这些对象的用法请参看附录和相关的章节。
注释
注释语句(即comment语句)必须以“//”开头,而且只能够注释一行。
为程序加注释是良好编程风格的标志。
文件包括语句
文件包括语句指的是一个程序文件将另一个制定文件内容包含进来,为此使用的预处理语句是:
#include “filename”
它被称为文件包括语句。其中filename是一个文件名,与处理程序处理文件包括语句时将相应文件的内容复制插入到该语句位置。它的用法同C语言中的文件包括语句用法一致。被引用的文件名字没有特殊的要求,只要它是一个符合Flash 5语法的文本文件就能够被正确引用。
例子:
假设在和已生成的swf文件同一目录下存在有两个已经成功通过编译的文件test1.txt和test2.txt,他们的内容如下:
文件test1.txt:
#include “test1.txt”
x1=1;
function test1(x)
{
return x+1;
}
文件test2.txt:
x2=2;
function test2(x)
{
return x-1;
}
在Flash 5中,使用以下语句来引用test1.txt和test2.txt中定义的变量和函数:
#include “test1.txt”
如果一个文件是在某个场景(scene)的一个桢的actions中被引用的,那幺,被引用文件中的变量和函数将在全局范围内起作用;如果一个文件是在某一个Movieclip中引用的,那幺,被引用文件中的变量和函数将只在这个Movieclip中起作用,全局变量中的同名变量或者函数在这个Movieclip中将会被覆盖,在Movieclip中对该变量的赋值和引用都只在这个Movieclip范围内有效。
另外,细心的读者可能发现了在test1.txt中也包含有一个文件包括语句:
#include “test2.txt”
那么在Flash中,任何包括了test1.txt文件的地方,同时也就包括了test2.txt,也就是说Flash 5中的include语句支持嵌套模式(功能真是强大)。
Action Script事件
在Flash 4中,只有通过按钮才可以控制响应事件。但是Flash 5中增强了对键盘事件的响应,除了使用on命令以外,程序中还可以通过对象key动态判断某一个键是否被按下;而且,MC除了也可以响应鼠标和键盘事件,还可以响应桢事件。
on语句
进入一个按钮的Action Script编辑窗口,选择Actionson命令双击,将在右边的编辑栏出现下面的语句就是on语句的一般形式:
on (<事件>){
}
在参数栏中将出现一些复选框,可以选择的事件有8种:
Press 当鼠标在按钮上按下时激发
Release 当鼠标在按钮上松开时激发
Release Outside 当鼠标在按钮上按下并在按钮以外区域松开时激发
Roll Over 当鼠标移动到按钮上时激发
Roll Out 当鼠标从按钮上移出时激发
Drag Over 当鼠标在拖拽状态下移动到按钮上时激发
Drag Out 当鼠标在拖拽状态下从按钮上移出时激发
Key Press 当按下键盘上的某个有效键时激发
当按下某一个键的时候,会激发按钮的Key Press事件。在on语句中,以下按钮不能激发Key Press事件。
Esc、F1-F12、Ctrl、Alt、Shift、Num Lock、Caps Lock、Print Scrn、Scroll Lock、Pause、Windows专用键。除了这些键之外,也不能够响应任何的组合键。 键盘对象Key:
在Flash 5中Key中定义了一些键值常量和函数如下所示
BACKSPACE Backspace(<-)键
CAPSLOCK CapsLock键
CONTROL Ctrl键
DELETEKEY Delete(Del)键
DOWN 方向下键
END End键
ENTER Enter(回车)键
ESCAPE Esc键
getAscii 获取最后一个按下或松开的键的对应字符的Ascii码
getCode 获取最后一个被按下的键的键盘扫描码
HOME Home键
INSERT Insert(Ins)键
isDown 当指定键被按下时返回True值
isToggled 当指定键被锁定时返回True值
LEFT 方向左键
PGDN PageDown(PGDN)键
PGUP PageUp(PGUP)键
RIGHT 方向右键
SHIFT Shift键
SPACE 空格键
TAB Tab键
UP 方向上键
从以上的定义中可以看到,对象Key中提供了四个非常有用处的函数getAscii,getCode,isDown和isToggled。通过这四个函数,我们可以在动画中的任何一个位置来响应用户的按键,大大增强了程序与用户的交互性。关于如何通过对象Key来实现用户与Flash动画之间的交互,请看后面的实例。
鼠标对象Mouse
而对鼠标事件的响应只能通过按钮来实现。但是Flash 5中也增强了对鼠标的控制。对象Mouse中提供了两个函数:
Hide 隐藏鼠标指针
Show 显示鼠标指针
除了提供了一个Mouse对象之外,还提供了两个属性_xmouse和_ymouse,通过引用这两个属性,可以实时得到鼠标指针的x和y坐标。但是不能通过对它们赋值来改变数标志桢的位置。
onClipEvent语句
进入一个MC的Action Script编辑窗口,选择ActionsonClipEvent命令双击,将在右边的编辑栏出现下面的语句就是onClipEvent语句的一般形式:
onClipEvent(<事件>){…}
MC可以响应的事件一共有9种,您可以在参数栏中选择的事件如下:
load 载入MC的时候激发
enterFrame 载入MC后播放第一桢时激发
unload 卸载MC的时候激发
mouseDown 鼠标按钮按下时激发
mouseUp 鼠标按钮释放时激发
mouseMove 鼠标移动时激发
keyDown 按下键盘任意键的时候激发
keyUp 放开键盘任意键的时候激发
data 不明
利用onClipEvent语句,我们可以非常容易的实现一些特殊效果,比如鼠标轨迹跟踪,鼠标坐标的实时显示,还有MC之间的同步等。
Movie Clip的控制
Movie Clip简称MC,在Flash中,MC是非常重要的一部分,灵活合理巧妙的使用MC,可以使您的Flash动画更加精彩,更加具有动感!在Flash 5中,MC给人的印象就好像是C++语言中的对象一样,它可以定义自己的“私有”变量,可以定义自己的函数,而且它可以响应事件并处理它,MC之间可以传递消息,相互控制和同步,定义一个MC可以复制成多个具有相同特征的MC,尽管MC不可以继承,但是我想,把MC叫做动画对象也是不过分的吧。MC的制作在前面的章节中已经有过详细的讲述,在本节主要介绍一下Flash中提供的一些与MC相关的函数和对象。
与Move Clip相关的函数及其一般形式
duplicateMovieClip(<target>,<new name>,<depth>)
复制一个现有的MC,其中target参数为现有MC的名字,new name是复制出来的MC的名字,depth是新MC所在的深度,值得注意的是每个MC的depth不可以相同,否则会造成显示混乱,depth大的MC将覆盖depth小的MC。
removeMovieClip(<target>)
删除一个复制出来的MC,其中target为复制出来的MC的名字。非复制出来的MC不可以被remove。删除的意思是指从内存和显示画面上同时清除。该Action只能与duplicateMovieClip配对使用。
loadMovie(<url>,<level|target>[,”GET”|”POST”])
从一个url地址载入一个MC,用法不详。
unloadMovie(<level|target>)
卸载一个已经载入的MC,它只能跟loadMovie配对使用。
startDrag(<target>[,True|False][,left,top,right,bottom])
开始拖拽一个MC,target为该MC的名字,第二个参数表示是否要将数标指针所定到该MC的中心,left,top,right,bottom四个参数表示MC只能在这两个坐标所定义的方框之内被拖拽。这四个参数可以是一个数值常量,也可以是一个算术表达式。
stopDrag()
停止鼠标对MC的拖拽。
onClipEvent(<事件>)
MC事件响应语句。请看前面的介绍。
swapDepths(<target>,<target>)
交换两个MC的深度值,这个语句是Flash 5新增语句,MC之间的控制更加方便了。
tellTarget(<target>)
这是一条非常有用的语句。它用于MC之间的相互控制和协调。比如一个MC可以告诉另一个MC什么时候需要跳转到哪一桢,一个MC还可以控制何时载入另一个MC,何时显示它,何时卸载它等等。合理的利用tellTarget语句,可以使您的动画更具有观赏性。
Movie Clip对象
Flash 5提供了一个Movie Clip对象,在上面所提到的前6个函数都在这个对象中重新进行了定义,它们完全可以取代前面那6个函数了。Movie Clip对象的定义如下:
attachMovie(<idName>,<new name>,<depth>)
绑定一个Movie,产生一个库中MC的实体,其中的idName是库中MC的名字,new name是新生成MC的名字,depth为深度。好像构造函数似的。
duplicateMovieClip(<new name>,<depth>)
复制当前MC为新的MC,参数的意义同上。
getURL(<url>,<window>,<method>)
使浏览器浏览指定页面。Flash 5中已经单独提供了getURL函数,不知道封装到这里有什么特殊的含义??参数的意义请参看getURL函数的说明。
gotoAndPlay(<frame>)
跳转到指定帧并播放。frame参数可以是数值常量,字符串常量或者是算术表达式。
gotoAndStop(<frame>)
跳转到指定帧并停止播放。frame参数可以是数值常量,字符串常量或者是算术表达式。
loadMovie(<url>,<method>)
引入一个外部电影到指定层。url是一个web地址,method可以是空,GET,POST三个之一。
loadVariables(<url>,<method>)
从url地址指定的web服务器引入外部变量值。参数解释同上。
nextFrame()
相当于gotoAndStop(下一帧)。
play()
从当前桢开始播放当前的MC。
prevFrame()
相当于gotoAndStop(前一帧)。
removeMovieClip()
删除当前的MC,且该MC是用duplicateMovieClip函数创建的。
startDrag(<True|False>,<left>,<top>,<right>,<bottom>)
开始拖动当前的MC。第一个布尔参数表示是否将鼠标锁定在当前MC的中心位置,left,top,right,bottom四个参数定义了一个矩形,MC只能在这个矩形范围之内拖动。
stop()
停止当前MC的播放。
stopDrag()
停止拖动当前MC。
unloadMovie()
卸载当前的Movie,且当前Movie必须是由loadMovie载入的。
声音的控制
动画如果没有声音,效果必定大打折扣。读者想必也看过一些比较优秀的Flash动画吧,画面可能并不复杂,甚至可能是比较粗糙的,但是在好的声效配合下,您看了后也觉得颇有震撼力哩。还有当按钮动作时,您可能也希望能加上些音效吧。毕竟,现在已经是多媒体的时代了嘛,网站上只有动画没有声音,怎么能吸引的了眼球呢?
在Flash 4中,对声音的控制非常简单,您不需要任何干涉,只要在需要的桢上面加上您喜欢的声音就可以了,而且Flash 4中您可以简单地调整声音的效果,比如左右声道、由小变大效果、由大变小效果等等。您还可以控制是否允许播放声音。虽然这已经能达到一定的效果了,但是,我们对声音的控制总体上来说还是相当薄弱的。
Flash 5中对声音的控制进行的加强,特别是增加一个声音对象,利用它,您可以随时随处播放任何一段你想要的声音,而不必非要依附于桢了。而且您还可以调整声音的播放效果、强度,控制声音的播放时间等等。
与声音有关的函数及其一般形式
stopAllSounds()
立刻停止播放整个动画中的所有声音。
声音对象Sound
声音对象的定义如下:
attachSound(<idName>)
直接绑定库中的一个声音,idName是该声音在库中的名字。
getPan()
获取声音的混音值。
getTransform(<sxForm>)
获取当前声音的变换量。
getVolume()
获取当前声音的音量(百分比)
new Sound()
新建声音实例。
setPan(<pan>)
设置声音的混音值。
setTransform(<sxForm>)
设置当前声音的变换量。
setVloume(<volumn>)
设置当前声音的音量,volumn为一个百分比,范围在0-100。
start()
开始播放当前声音。
stop()
停止播放当前声音。
变量名
变量名需符合以下几点:
1) 变量名必须是一个标识符,不能包含任何特殊符号;
2) 变量名不能是关键字及布尔值(true和flase)
3) 变量名在其作用域中唯一。
变量的类型
在Flash中不需要显式的声明一个变量的类型,当变量被赋值的时候,它的类型被动态的确定,当然,也可以把赋值语句理解为变量的声明语句,例如:
x = 3;
上面的表达式声明了一个x变量,其类型为number类型,并且x的值为3。对变量x的赋值可能还会改变它的数据类型:
x = "hello";
此时变量x将从number类型改变为string类型。这同C语言等其他高级语言好像有些不同,但其实Flash中的赋值语句不仅仅是一个赋值功能,它还起到了变量声明的作用。
声明了却没有被赋值的变量类型被称为无类型变量。
在特定的条件下,ActionScript可以自动将变量的类型进行转换。例如,当为trace语句传递一个值以后,这个值被自动转换成字符串类型输出到Output窗口中。在表达式中,ActionScript会根据需要对变量进行类型转换,如下例:
"The number is " + 7
ActionScript将数字7自动转换成字符串"7",并将它添加在前面字符串的末尾:
"The number is 7"
在调试脚本的时候,需要确切掌握一个变量的数据类型,因为数据类型决定了变量的行为,ActionScript中提供了typeof操作符,用于确定某一个变量的类型:
trace( typeof( aVariable ));
另外,Flash 5中提供了两个类型转换函数。Number函数可以将一个字符串转换成数字,相应的,String函数可以将一个数字转换成一个字符串,它们的用法比较简单,在Flash 5的脚本编辑面板中已经提供了充分的提示。
变量的作用域
ActionScript中有局部变量和全局变量之分,全局变量在整个动画的脚本中都有效,而局部变量只在它自己的作用域内有效。声明局部变量需要用到var语句。例如,在下面的例子中,i是一个局部的循环变量,它只在函数init中有效:
function init(){
var i;
for(i=0; i<10; i++){
randomArray[i] = random(100);
}
}
局部变量可以防止名字冲突,而名字冲突可能会导致致命的程序错误。例如,变量n是一个局部变量,它可以用在一个MC对象中计数,而另外一个MC对象中可能也有一个变量n,它可能用作一个循环变量,因为它们有不同的作用域,所以并不会造成任何冲突。
使用局部变量的好处在于减少程序错误发生的可能。比如,一个函数中使用局部变量,那么这个变量只会在函数内部被改变,而一个全局变量可以在整个程序的任何位置被改变,使用错误的变量可能会导致函数返回错误的结果,甚至使整个系统崩溃。
此外,函数的参数也将作为该函数的一个局部变量来使用,例如:
x=3;
function test(x)
{
x=1;
a=x;
}
test(x)
程序执行之后的结果是a=1,x=3。从这个例子可以看出test函数中的x参数的确是作为函数内部的局部变量来处理了。
变量的声明
在程序中,给一个变量直接赋值或者使用setVariables语句赋值就相当于声明了全局变量;局部变量的声明需要用var语句。在一个函数体内用var语句声明变量,该变量就成了这个函数的局部变量,它将在函数执行结束的时候被释放;在根时间轴上使用var语句声明的变量也是全局的,它们在整个动画结束的时候才会被释放掉。
在声明了一个全局变量之后,紧接着再次使用var语句声明该变量,那么,这条var语句无效,例如:
aVariable = 10;
var aVariable;
aVariable += 1;
在上面的脚本中,变量aVariable被重复声明了两次,其中var语句的声明被视为无效,脚本执行后,变量aVariable的值将为11。
注:call语句同样会为它调用的程序块生成一个局部变量作用域,当被调用的脚本结束的时候,这个局部作用域也同时消失。Flash 5中call语句可以用with语句取代。
使用trace语句可以检测变量的值,例如trace(aVariable)将变量aVariable的值转换成字符串传递到Output窗口中,在调试模式下,还可以随时改变和获取某一个变量的值。
变量的使用
在引用一个变量的时候,必须先进行声明(使用var语句或者直接赋值),如果变量没有得到初始化,那么,在下面的例子中,将会产生错误:
gotoAndPlay( aFrame );
其中aFrame是一个标签,因为aFrame没有被声明,gotoAndPlay将会被错误的执行,跳转到一个不确定的位置。
变量的内容可以随时被改变,变量的类型决定了它们的行为。请注意下面一段关于变量类型的说明,其中一些特征是ActionScript中所特有的。
简单数据类型传递的是变量的值,就是说,变量的内容会被拷贝一份之后才被传递出去,不论是在赋值语句中,还是作为参数传递给一个函数都是一样:
var x = 4;
var y = Math.sqrt(x);
上面例子中,变量x的值被复制后传递给sqrt函数,并将返回结果2赋值给变量y,变量x的值保持不变。 对象数据类型包含有大量复杂的信息,具有这种数据类型的变量并不保存对象的实际内容,它们保存的只是一个指向对象的指针,当调用对象的属性或者方法的时候,根据这个指针找到该对象实际的位置并返回所需要的内容。
下面是一个通过指针进行传递的例子:
var myArray = ["Holly", "Tom"];
var newArray = myArray;
myArray[1] = "Marry";
trace(newArray);
上面的例子中,一个数组对象myArray有两个元素,newArray被赋值为指向myArray的指针,当myArray的第二个元素被改变之后,所有指向它的其它变量内容也会改变,最后的trace语句将会把["Marry", "Tom"]输出到输出窗口中。
下面是一个将对象类型的变量作为参数传递给函数的例子:
function initArray(newArray){
var i;
for ( i=0; i<10; i++ ){
newArray[i] = random( 100 );
}
}
var myArray = new Array();
initArray( myArray );
上例中,myArray被传递到函数initArray中,因为传递的是对象指针,所以在函数内,数组myArray将被初始化。
在ActionScript中,对一般对象的引用称为强引用,对MC动画的引用称为弱引用。强引用是指只要还有一个指针指向该对象,那么这个对象就不能被释放;弱引用是指如果MC动画结束之后,所有指向该MC动画的指针将随之而不再有效。
Action Script编辑环境
简介
熟悉VB的读者可能会发现,Flash 4中的脚本语言有很多地方跟VB Script极为相似,比如赋值语句、条件语句,字符串的操作等等,然而,Flash 4中的脚本并不够严格,所实现的功能相对来说也很有限。
在Flash 5中,我们很高兴的发现,Macromedia公司对其中的脚本语言进行了全面的完善,并且使用更为流行的类Java Script语法,这对于偏爱Java Script的朋友来说,实在是一件值得高兴的事情。
除了比较完善的语法之外,还增加了许多实用函数,不仅如此,您还可以编写自定义的函数呢,不用再像从前那样找一个空白桢并定义一个Label来实现函数调用了(其实我觉得这种方法也挺方便);吸取了面向对象编程方法的一些思想,提供了十几个对象,您可以方便的定义一些实例并且调用其内部函数以及常量;加强了对鼠标的控制,您不必再需要拖拽一个MC来获得鼠标坐标了,Flash 5中已经增加了两个全局属性_xmouse和_ymouse,而且您还可以控制是否隐藏鼠标;Flash 5中还增加了对XML的支持,今后,可以直接通过 XML 读取数据库;另外,Flash 5还支持一些额外的外挂库功能,增加脚本排错功能(Debug),支持对象表和关系树,以便于用户检查错误等等。
这些对编程功能的增强,将为Flash增加更多的魅力,令Flash动画更加精彩!
编辑窗口功能简介
还记得Flash 4中的脚本编辑窗口吗?还记得它给您带来过的编程上的不便吧!太小了,而且必须经常要一会儿用鼠标一会儿用键盘,大大降低了编程效率,而您又不能在Notepad 中编写,因为无法粘贴到Flash中(反之则可以)。在Flash 5中,已经对这些弊病进行了改善。首先您将拥有一个可以调整大小的编辑窗口了;编辑窗口的界面也进行了调整,但是,不用担心,您熟悉的一些按钮仍然保留下来了,只不过位置有所变化,另外还增加了几个新的按钮,所有的Actions放在了一个列表框中,您可以方便的从中选取您所需要的Action,参数栏则放到了窗口的下部;还有就是您可以从一个文本文件导入脚本或者将Flash中的脚本导出到一个文本文件中了,在您对Action Script熟悉之后,完全可以用Notepad写好程序然后导入到所需要的地方。
Action Script基本语法
变量与常量
变量的名字不可是使用特殊符号,而且要尽量避免使用flash中已经存在的关键字。
Flash 5中使用变量不需要预先申明,而且不区分局部变量和全局变量的申明。但是奇怪的是,Flash 5中却提供了var关键字,而且对var关键字说明是用于定义(局部)变量,但是笔者经过测试,发现完全不用使用var来申明一个变量,而且所谓传统意义上的局部变量申明根本不起作用。请看下面一段程序:
Function test(){
Var x;
x+=1;
}
x=1;
test();
程序执行完毕之后,x的结果将是2;
申明变量的好处在于可清楚掌握变量的生命周期,能增强程序的可调试性和易读性。Flash 5提供了delete关键字,在一个变量生命周期结束的时候可以用delete来释放这个变量。请看下面的程序:
var y;
function test(){
var x;
x=2;
y=x-1;
delete x;
}
test();
执行结果为y=1,变量x被释放;这样看起来x好象起到了局部变量的作用。但是假如您在程序中还有一个全局变量x的话,test函数中的var变量申明将会被忽略,对x的任何引用和赋值都是针对全局变量x,如果不注意的话,将导致程序的异常。
但是,还有一种特殊的情况,局部变量和全局变量将被区分开来。那就是函数调用时候的参数,将作为函数中的一个局部变量,对参数变量的任何赋值并不会影响同名的全局变量。如下所示的例子:
x=3;
function test(x)
{
x=1;
a=x;
}
test(x)
程序执行之后的结果是a=1,x=3。从这个例子可以看出test函数中的x参数的确是作为函数内部的局部变量来处理了。
除了上面的特例之外,在Flash 5中,并非没有局部变量的概念。局部变量只能存在于某一个Movieclip之中,换一句话说,就是一个MC中定义的变量相对于整个场景来说将成为该MC的局部变量。比如一个名字为test的MC,其中定义了一个MC参数x,那么这个参数x将只会在该MC范围内起作用,在该MC中对x的赋值将不会影响全局变量x,也当然不会影响其它MC中的x变量喽。
Flash 5还提供了一些常量,使用非常方便。如常量对象Mouse、Key、Math等。这些对象不可以用来初始化一个实例对象,只能被直接调用,如Mouse.hide()就可以隐藏鼠标,而Math.PI就代表圆周率了。关于这些对象的详细说明请参看附录。
操作符
Flash 5提供的操作符全部列表在下面,用法完全相同于Java script。
算术操作符
* 乘号 + 加号 - 减号 / 除号
++ 变量自加一 -- 变量自减一 % 取余数
逻辑操作符
! 逻辑非 != 不等于 && 逻辑与 < 小于
<= 小于等于 <> 不等于 == 相等 > 大于
>= 大于等于 and 逻辑与 not 逻辑非 or 逻辑或
| | 逻辑或
位操作符
& 位与 | 位或 ~ 补位 ^ 位异或
<< 位左移 >> 位右移 >>> 位右移(无符号)
复合操作符
%= A%=B 等效于 A=A%B
&= A&=B 等效于 A=A&B
*= A*=B 等效于 A=A*B
+= A+=B 等效于 A=A+B
-= A-=B 等效于 A=A-B
/= A/=B 等效于 A=A/B
<<= A<<=B 等效于 A=A<<B
>>= A>>=B 等效于 A=A>>B
>>>= A>>>=B 等效于 A=A>>>B
^= A^=B 等效于 A=A^B
|= A|=B 等效于 A=A|B
字符串操作符
add 连接两个字符串
eq A eq B 字符串A值与字符串值B相等
ge A ge B 字符串A值大于等于字符串B值
gt A gt B 字符串A值大于字符串B值
le A le B 字符串A值小于等于字符串B值
lt A lt B 字符串A值小于字符串B值
ne A ne B 字符串A值不等于字符串B值
其它
"" 字符串 () 括号 = 赋值
typeof 返回变量类型
条件语句
if语句
if语句的一般形式是:
if(条件表达式)
{…}
else{…}
else if(判断条件){…}
….
else if语句可以有无限多个。
Flash 4中使用的是VB Script语法: if… else if… end if,在Flash 5中不再适用。
IfFrameLoaded语句
IfFrameLoaded语句的一般形式是:
ifFrameLoaded(<场景名称>,<桢编号>)
{…}
该语句为Flash特有的条件语句,用于判定某个桢是否已经被载入。
该语句的详细解释及其例子请参看附录。
Flash 5中不支持switch语句。
循环语句
Flash 5提供了四种循环语句,其中前三种是大家所熟悉的Java script循环语句,而第四种却是Flash 5所特有的循环语句。
Do语句
Do语句的一般形式是:
Do
循环体
while(条件表达式);
while语句
while语句的一般形式是:
while(条件表达式)
循环体
for语句:
for语句的一般形式有两种:
for(初始化语句;条件表达式;递增语句)
循环体
for(递增语句 in 对象)
循环体
流终止语句
在Flash 5中提供了三种流终止语句。Bread语句用于退出循环语句和标号块。continue语句用于跳转道循环体末尾最后一行语句。Return语句用于退出一个方法或程序体。他们的用法与Java script中用法相同。
跳转语句
Flash 5中提供了goto语句,值得注意的是它是Flash 5特有的语句,其用法并不同于其它高级语言中的goto语句。Flash 5中的goto语句是专门用于在不同的桢和场景中进行切换的。根据所填写参数的不同,goto语句还有几种不同的变形形式,如下:
gotoAndPlay( [场景名,]<桢编号|桢标签|表达式>);
根据编号或者标签或者表达式结果,跳转到某一特定场景的某一个特定桢,并且继续动画的播放。
gotoAndStop( [场景名,]<桢编号|桢标签|表达式>);
根据编号或者标签或者表达式结果,跳转到某一特定场景的某一个特定桢,并且停止动画的播放。
gotoAndPlay( <桢编号|桢标签|表达式> );
根据编号或者标签或者表达式结果,在同一个场景中跳转到某一特定桢,并且继续动画的播放。
gotoAndStop( <桢编号|桢标签|表达式> );
根据编号或者标签或者表达式结果,在同一个场景中跳转到某一特定桢,并且在该桢停止动画的播放。
nextFrame();
跳转并停止在下一桢。
prevFrame();
跳转并停止在上一桢。
nextScene();
跳转到下一场景。
prevScene();
跳转到前一场景。
通过goto语句可以灵活的实现场景的切换和桢流的控制,特别是在结合标签的使用后。
标签
Flash 5中的标签是专门用于标识一个桢的,程序中无法定义一个标签。标签的唯一用途就在于给一个桢起一个有意义的名字。标签的合理利用可以大大提高程序的可阅读性和可维护性,不仅是利于掌握动画流程,而且利于程序的结构化和代码重用。当然,在Flash 5中已经提供了定义函数的方法,但是标签所起到的作用却仍然是不可替代的。利用标签来控制动画流要比用桢编号好的多,相信有经验的用户都已经深有体会;而用标签来实现一个函数的定义和调用也是相当的简洁明了的,您至少可以很快的找到您所定义的函数在什幺地方,而这是function所定义的函数所不能达到的。但是,用一个标签结合一个桢定义函数不能够传递参数,唯一的方法就是通过全局变量来实现。
引用一个标签的Action只有goto语句和call语句。
函数
Flash 5中函数定义的一般形式是:
function <函数名> (参数表)
{ 函数体 }
Flash 5中的函数无需定义返回类型,但是它可以返回任何一种类型的值。函数只可以传递值参,参数只在函数体内起作用,相当于该函数内部的局部变量,它们的生命周期随着函数生命周期的结束而结束。为函数返回一个值可以使用return语句。函数不支持递归调用,但是当递归调用函数的时候,语法检查并不报错,只是递归函数执行结果将与预期的结果不同。
例:
function test( x, y )
{
x=1;
y=2;
return x+y;
}
x=3;
y=4;
a=test(x,y);
b=x+y;
程序运行后结果如下:
x=3, y=4, a=3, b=7;
除了自定义函数以外,Flash 5还提供了一些所谓的“库函数”,至于库函数有哪些,请参看附录。
对象
Flash 5中提供了一些已经封装好的对象,包括一些常量对象。虽然我们还不能在程序中定义自己的对象,但是还是有一个变通的方法来实现的,请看后面的关于如何实现自定义对象的章节。这里我们先简单的说明一下已有的对象及其初始化方法。
名称 是否可初始化实例
Array 数组对象 是
Boolean 布尔数 是
Color 颜色对象 是
Date 日期 是
Key 键盘 否
Math 数学函数 否
Movieclip MC对象 是
Mouse 鼠标 否
Number 数字 是
Object 对象 是
Selection 选择区 否
Sound 声音 是
String 字符串 是
XML 可扩充性标记语言 是
XMLSocket XML套接口 是
这些对象的用法请参看附录和相关的章节。
注释
注释语句(即comment语句)必须以“//”开头,而且只能够注释一行。
为程序加注释是良好编程风格的标志。
文件包括语句
文件包括语句指的是一个程序文件将另一个制定文件内容包含进来,为此使用的预处理语句是:
#include “filename”
它被称为文件包括语句。其中filename是一个文件名,与处理程序处理文件包括语句时将相应文件的内容复制插入到该语句位置。它的用法同C语言中的文件包括语句用法一致。被引用的文件名字没有特殊的要求,只要它是一个符合Flash 5语法的文本文件就能够被正确引用。
例子:
假设在和已生成的swf文件同一目录下存在有两个已经成功通过编译的文件test1.txt和test2.txt,他们的内容如下:
文件test1.txt:
#include “test1.txt”
x1=1;
function test1(x)
{
return x+1;
}
文件test2.txt:
x2=2;
function test2(x)
{
return x-1;
}
在Flash 5中,使用以下语句来引用test1.txt和test2.txt中定义的变量和函数:
#include “test1.txt”
如果一个文件是在某个场景(scene)的一个桢的actions中被引用的,那幺,被引用文件中的变量和函数将在全局范围内起作用;如果一个文件是在某一个Movieclip中引用的,那幺,被引用文件中的变量和函数将只在这个Movieclip中起作用,全局变量中的同名变量或者函数在这个Movieclip中将会被覆盖,在Movieclip中对该变量的赋值和引用都只在这个Movieclip范围内有效。
另外,细心的读者可能发现了在test1.txt中也包含有一个文件包括语句:
#include “test2.txt”
那么在Flash中,任何包括了test1.txt文件的地方,同时也就包括了test2.txt,也就是说Flash 5中的include语句支持嵌套模式(功能真是强大)。
Action Script事件
在Flash 4中,只有通过按钮才可以控制响应事件。但是Flash 5中增强了对键盘事件的响应,除了使用on命令以外,程序中还可以通过对象key动态判断某一个键是否被按下;而且,MC除了也可以响应鼠标和键盘事件,还可以响应桢事件。
on语句
进入一个按钮的Action Script编辑窗口,选择Actionson命令双击,将在右边的编辑栏出现下面的语句就是on语句的一般形式:
on (<事件>){
}
在参数栏中将出现一些复选框,可以选择的事件有8种:
Press 当鼠标在按钮上按下时激发
Release 当鼠标在按钮上松开时激发
Release Outside 当鼠标在按钮上按下并在按钮以外区域松开时激发
Roll Over 当鼠标移动到按钮上时激发
Roll Out 当鼠标从按钮上移出时激发
Drag Over 当鼠标在拖拽状态下移动到按钮上时激发
Drag Out 当鼠标在拖拽状态下从按钮上移出时激发
Key Press 当按下键盘上的某个有效键时激发
当按下某一个键的时候,会激发按钮的Key Press事件。在on语句中,以下按钮不能激发Key Press事件。
Esc、F1-F12、Ctrl、Alt、Shift、Num Lock、Caps Lock、Print Scrn、Scroll Lock、Pause、Windows专用键。除了这些键之外,也不能够响应任何的组合键。 键盘对象Key:
在Flash 5中Key中定义了一些键值常量和函数如下所示
BACKSPACE Backspace(<-)键
CAPSLOCK CapsLock键
CONTROL Ctrl键
DELETEKEY Delete(Del)键
DOWN 方向下键
END End键
ENTER Enter(回车)键
ESCAPE Esc键
getAscii 获取最后一个按下或松开的键的对应字符的Ascii码
getCode 获取最后一个被按下的键的键盘扫描码
HOME Home键
INSERT Insert(Ins)键
isDown 当指定键被按下时返回True值
isToggled 当指定键被锁定时返回True值
LEFT 方向左键
PGDN PageDown(PGDN)键
PGUP PageUp(PGUP)键
RIGHT 方向右键
SHIFT Shift键
SPACE 空格键
TAB Tab键
UP 方向上键
从以上的定义中可以看到,对象Key中提供了四个非常有用处的函数getAscii,getCode,isDown和isToggled。通过这四个函数,我们可以在动画中的任何一个位置来响应用户的按键,大大增强了程序与用户的交互性。关于如何通过对象Key来实现用户与Flash动画之间的交互,请看后面的实例。
鼠标对象Mouse
而对鼠标事件的响应只能通过按钮来实现。但是Flash 5中也增强了对鼠标的控制。对象Mouse中提供了两个函数:
Hide 隐藏鼠标指针
Show 显示鼠标指针
除了提供了一个Mouse对象之外,还提供了两个属性_xmouse和_ymouse,通过引用这两个属性,可以实时得到鼠标指针的x和y坐标。但是不能通过对它们赋值来改变数标志桢的位置。
onClipEvent语句
进入一个MC的Action Script编辑窗口,选择ActionsonClipEvent命令双击,将在右边的编辑栏出现下面的语句就是onClipEvent语句的一般形式:
onClipEvent(<事件>){…}
MC可以响应的事件一共有9种,您可以在参数栏中选择的事件如下:
load 载入MC的时候激发
enterFrame 载入MC后播放第一桢时激发
unload 卸载MC的时候激发
mouseDown 鼠标按钮按下时激发
mouseUp 鼠标按钮释放时激发
mouseMove 鼠标移动时激发
keyDown 按下键盘任意键的时候激发
keyUp 放开键盘任意键的时候激发
data 不明
利用onClipEvent语句,我们可以非常容易的实现一些特殊效果,比如鼠标轨迹跟踪,鼠标坐标的实时显示,还有MC之间的同步等。
Movie Clip的控制
Movie Clip简称MC,在Flash中,MC是非常重要的一部分,灵活合理巧妙的使用MC,可以使您的Flash动画更加精彩,更加具有动感!在Flash 5中,MC给人的印象就好像是C++语言中的对象一样,它可以定义自己的“私有”变量,可以定义自己的函数,而且它可以响应事件并处理它,MC之间可以传递消息,相互控制和同步,定义一个MC可以复制成多个具有相同特征的MC,尽管MC不可以继承,但是我想,把MC叫做动画对象也是不过分的吧。MC的制作在前面的章节中已经有过详细的讲述,在本节主要介绍一下Flash中提供的一些与MC相关的函数和对象。
与Move Clip相关的函数及其一般形式
duplicateMovieClip(<target>,<new name>,<depth>)
复制一个现有的MC,其中target参数为现有MC的名字,new name是复制出来的MC的名字,depth是新MC所在的深度,值得注意的是每个MC的depth不可以相同,否则会造成显示混乱,depth大的MC将覆盖depth小的MC。
removeMovieClip(<target>)
删除一个复制出来的MC,其中target为复制出来的MC的名字。非复制出来的MC不可以被remove。删除的意思是指从内存和显示画面上同时清除。该Action只能与duplicateMovieClip配对使用。
loadMovie(<url>,<level|target>[,”GET”|”POST”])
从一个url地址载入一个MC,用法不详。
unloadMovie(<level|target>)
卸载一个已经载入的MC,它只能跟loadMovie配对使用。
startDrag(<target>[,True|False][,left,top,right,bottom])
开始拖拽一个MC,target为该MC的名字,第二个参数表示是否要将数标指针所定到该MC的中心,left,top,right,bottom四个参数表示MC只能在这两个坐标所定义的方框之内被拖拽。这四个参数可以是一个数值常量,也可以是一个算术表达式。
stopDrag()
停止鼠标对MC的拖拽。
onClipEvent(<事件>)
MC事件响应语句。请看前面的介绍。
swapDepths(<target>,<target>)
交换两个MC的深度值,这个语句是Flash 5新增语句,MC之间的控制更加方便了。
tellTarget(<target>)
这是一条非常有用的语句。它用于MC之间的相互控制和协调。比如一个MC可以告诉另一个MC什么时候需要跳转到哪一桢,一个MC还可以控制何时载入另一个MC,何时显示它,何时卸载它等等。合理的利用tellTarget语句,可以使您的动画更具有观赏性。
Movie Clip对象
Flash 5提供了一个Movie Clip对象,在上面所提到的前6个函数都在这个对象中重新进行了定义,它们完全可以取代前面那6个函数了。Movie Clip对象的定义如下:
attachMovie(<idName>,<new name>,<depth>)
绑定一个Movie,产生一个库中MC的实体,其中的idName是库中MC的名字,new name是新生成MC的名字,depth为深度。好像构造函数似的。
duplicateMovieClip(<new name>,<depth>)
复制当前MC为新的MC,参数的意义同上。
getURL(<url>,<window>,<method>)
使浏览器浏览指定页面。Flash 5中已经单独提供了getURL函数,不知道封装到这里有什么特殊的含义??参数的意义请参看getURL函数的说明。
gotoAndPlay(<frame>)
跳转到指定帧并播放。frame参数可以是数值常量,字符串常量或者是算术表达式。
gotoAndStop(<frame>)
跳转到指定帧并停止播放。frame参数可以是数值常量,字符串常量或者是算术表达式。
loadMovie(<url>,<method>)
引入一个外部电影到指定层。url是一个web地址,method可以是空,GET,POST三个之一。
loadVariables(<url>,<method>)
从url地址指定的web服务器引入外部变量值。参数解释同上。
nextFrame()
相当于gotoAndStop(下一帧)。
play()
从当前桢开始播放当前的MC。
prevFrame()
相当于gotoAndStop(前一帧)。
removeMovieClip()
删除当前的MC,且该MC是用duplicateMovieClip函数创建的。
startDrag(<True|False>,<left>,<top>,<right>,<bottom>)
开始拖动当前的MC。第一个布尔参数表示是否将鼠标锁定在当前MC的中心位置,left,top,right,bottom四个参数定义了一个矩形,MC只能在这个矩形范围之内拖动。
stop()
停止当前MC的播放。
stopDrag()
停止拖动当前MC。
unloadMovie()
卸载当前的Movie,且当前Movie必须是由loadMovie载入的。
声音的控制
动画如果没有声音,效果必定大打折扣。读者想必也看过一些比较优秀的Flash动画吧,画面可能并不复杂,甚至可能是比较粗糙的,但是在好的声效配合下,您看了后也觉得颇有震撼力哩。还有当按钮动作时,您可能也希望能加上些音效吧。毕竟,现在已经是多媒体的时代了嘛,网站上只有动画没有声音,怎么能吸引的了眼球呢?
在Flash 4中,对声音的控制非常简单,您不需要任何干涉,只要在需要的桢上面加上您喜欢的声音就可以了,而且Flash 4中您可以简单地调整声音的效果,比如左右声道、由小变大效果、由大变小效果等等。您还可以控制是否允许播放声音。虽然这已经能达到一定的效果了,但是,我们对声音的控制总体上来说还是相当薄弱的。
Flash 5中对声音的控制进行的加强,特别是增加一个声音对象,利用它,您可以随时随处播放任何一段你想要的声音,而不必非要依附于桢了。而且您还可以调整声音的播放效果、强度,控制声音的播放时间等等。
与声音有关的函数及其一般形式
stopAllSounds()
立刻停止播放整个动画中的所有声音。
声音对象Sound
声音对象的定义如下:
attachSound(<idName>)
直接绑定库中的一个声音,idName是该声音在库中的名字。
getPan()
获取声音的混音值。
getTransform(<sxForm>)
获取当前声音的变换量。
getVolume()
获取当前声音的音量(百分比)
new Sound()
新建声音实例。
setPan(<pan>)
设置声音的混音值。
setTransform(<sxForm>)
设置当前声音的变换量。
setVloume(<volumn>)
设置当前声音的音量,volumn为一个百分比,范围在0-100。
start()
开始播放当前声音。
stop()
停止播放当前声音。
回复Comments
作者:
{commentrecontent}