Flash 5 ActionScript交互动画简明教程(上) 莫治雄 2001年 60期 ActionScript是Flash 5的动作脚本语言。我们在网上经常见到的Flash动画有两种:简单动画和交互动画,在简单动画中,Flash按顺序播放动画中的场景和帧,用户只能“被动”观看;而在交互动画中,用户可以“主动”观看,可以使用键盘或鼠标与动画交互,这就大大增强了Flash动画的魅力。有了ActionScript,我们能创作出这种复杂的交互动画。   #1 一、Flash 5 ActionScript语言基础    (一)变量和数据类型    变量是存储数据的容器,数据类型说明一个变量或ActionScript元素可以存储数据的种类。由于变量可以存储不同的数据,所以变量也同样要区分不同的类型。    1.变量    在Flash 5中,变量可以存储数值型、字符型、逻辑型、对象型和电影剪辑型数据。在脚本中可以给变量赋值,依据其存储的值的不同,变量可以有以下6种类型:    (1)字符型(String):存储字符型数据。例如,name = ″孙悟空″。    (2)数值型(Number):存储数值型数据。例如,size = 100。    (3)逻辑型(Boolean):存储逻辑型数据。例如,rainning = true。    (4)对象型(Object):存储对象型数据。例如,myDate = new Date()。    (5)电影剪辑型(Movieclip) :存储电影剪辑型数据。例如,myClip = FishMovieclip。    (6)未定义型(Undefined):当一个变量没有赋予任何值时为未定义型。    在Flash中,给变量命名必须遵守以下规则:    ①变量名必须以字母或下划线开头,由字母、数字和下划线组成,中间不能包含空格。变量名不区分大小写。    ②变量名不能是一个关键字或逻辑常量(true 或false)。需要注意的是,Flash的关键字都是小写形式,如果写成大写,Flash把它视为普通字符而不作为关键字处理。例如for是一个关键字,而FOR则不属于关键字。    ③变量名在它的作用范围内必须是唯一的。    例如,BOOK、a2、firstName、_YPOSITION都是合法的变量名;if、for、var、3W、gb%c都是非法变量名。    在脚本中使用变量应遵循“先定义后使用”的原则。也就是说,在脚本中必须先定义一个变量,然后才能在表达式中使用这个变量。依据变量的作用范围,可以把变量分为全局变量和局部变量。两种变量的定义方法不同。    定义全局变量,可以使用set动作或赋值操作符(=) ,两个方法的结果相同。语法格式如下:    变量名 = 表达式;    set (变量名,表达式);    例如:    A1 = 20;    set(″A1″,20);    可以在定义变量时给变量赋值。在上例中,在定义变量A1时给它赋值20。注意:set语句中的变量名要用引号(双引号或单引号)括起来。    定义局部变量使用var语句。语法格式如下:    var 变量名;    var 变量名 = 表达式;    例如:    var K;    var book = ″ActionScript″;    2.数据类型    Flash 5的数据有数值型、字符型、逻辑型、对象型和电影剪辑型。    (1) 字符型    字符型数据是一个字符(字母、数字和标点符号)序列。在ActionScript语句中输入字符串,使用单引号或双引号括住。    Name = ″Ted″;    (2)数值型    数值型数据是一个双精度浮点数。可用数学运算符处理数值型数据。例如:    sum = 300+200;    I = I+1;    (3)逻辑型    逻辑型数据包括true(真)或false(假)。需要时,ActionScript 也把true和false转换为1和0。逻辑值与逻辑操作符一起,常常用在控制脚本流动的比较语句中。例如在下面的脚本中,如果password的值为true,动画播放:    onClipEvent(enterFrame) {    if (password == true){    play();    }    }    (4)对象    对象是属性的集合。每个属性都有名字和值。属性值可以是任何Flash数据类型,甚至可以是对象数据类型。这样就可以把一个对象嵌套在另一个对象之中。例如,在下面的代码中,china是一个对象,guangxi也是一个对象;而nanning是guangxi的属性,guangxi又是china的属性:    china.guangxi.nanning    (5)电影剪辑    电影剪辑是一种图符,这种图符可以在Flas动画中播放一个动画片段。它是唯一一种与图像元素有关的数据类型。你也可以把电影剪辑理解为一个“小型动画”。有了电影剪辑数据类型,我们就可以使用电影剪辑对象的方法控制电影剪辑图符。使用点操作符可以调用电影剪辑的方法,例如:    myClip.startDrag(true);    (二)运算符和表达式    在Flash 5中,运算符有很多种类,包括数值运算符、字符串运算符、比较运算符、逻辑运算符、相等运算符、赋值运算符、 点运算符、数组访问运算符和位运算符。    1.数值运算符    数值运算符就是对数值执行加、减、乘、除和其他算术运算。动作脚本语言中的数值运算符包括+(加)、-(减)、*(乘)、/(除)、%(取模)等。    需要注意的是,在Flash的ActionScript中,如果减、乘和除数值运算符的操作数中有一个是数字字符串,Flash会自动把该数字字符串转换为数值,然后执行相应的运算。例如:    y = ″12″ - 6; //结果y = 6    y = ″05″ * 6; //结果y = 30    2.比较运算符    比较运算符比较表达式的值,返回逻辑值true或false。比较运算符常常用在循环和条件语句之中。动作脚本语言中的比较运算符包括==(等于)、!=(不等)、<(小于)、>(大于)   <=(小于等于)、>=(大于等于)等。    3.逻辑运算符    逻辑运算符比较两个逻辑值(true和false),返回结果也是逻辑值。ActionScript的逻辑运算符包括&&(逻辑与)、||(逻辑或)、!(逻辑非)等。    在逻辑运算中,如果两个操作数的计算结果都是true,则逻辑与运算的返回结果为true;如果两个操作数的计算结果有一个是false,则逻辑与运算的返回结果为false。如果一个或两个操作数的运算结果是true,逻辑或运算的返回结果为true;如果两个操作数的计算结果都是false,则逻辑或运算的返回结果为false。如果操作数的计算结果是true,逻辑非运算的返回结果就是false;如果操作数的计算结果是false,逻辑非运算的返回结果就是true。    4.位运算符    位运算符用来处理浮点数,运算时先将操作数转化为32位的二进制数,然后对每个操作数分别按位进行运算,运算后再将二进制的结果按照Flash的数值类型返回运算结果。    ActionScript的位运算符包括 &(位与)、|(位或)、^(位异或)、~(位非)、<<(左移位)、>>(右移位)、>>>(填0右移位)等。    5.赋值运算符    赋值运算符的作用就是给变量、数组元素或对象的属性赋值。下表列出的是ActionScript的赋值运算符:    (^60090404a^)    6.表达式    Flash表达式是由常量、变量、函数、属性和运算符按照运算规则组合构成的式子。表达式的结果作为参数值出现在动作脚本语句中,是语句的重要组成部分。按照运算符和运算结果的不同,Flash表达式可以分为算术表达式、字符串表达式、关系表达式和逻辑表达式4种。例如:    算术表达式:3 + x * 6    字符串表达式:year + ″年″ + month + day + ″日″    (三)ActionScript的基本语法规则    像其他脚本语言一样,ActionScript也有它自己的语法规则。ActionScript允许用户创建自己的对象和函数。    1.点语法    在ActionScript中,点(.)被用来指明与某个对象或电影剪辑相关的属性和方法。它也用于标识指向电影剪辑或变量的目标路径。点语法表达式由对象或电影剪辑名开始,接着是一个点,最后是要指定的属性、方法或变量。例如:    myDate.getDate();//调用对象myDate的getDate()方法    _Xposition = tmpBomb._x //表达式tmpBomb._x指定电影剪辑实例tmpBomb的_X属性    fish.play(); //调用电影剪辑实例fish的play()方法    fish.color = ″red″ //设置电影剪辑实例fish的颜色属性    点语法使用两个特殊的别名:_root和_parent。别名_root是指主时间轴。可以使用_root别名创建一个绝对路径。例如,下面的语句调用主时间轴中电影剪辑fish的play()方法:    _root.fish.play();    Flash 5允许使用别名_parent来引用嵌套当前电影剪辑的电影剪辑(即父电影剪辑)。也可以用_parent创建一个相对目标路径。例如,如果电影剪辑dog被嵌套在电影剪辑animal之中,那么,在实例dog上的下列语句告诉animal电影剪辑停止播放:    _parent.stop();    2.大括号    ActionScript语句用大括号({ })分块,如下面的脚本所示:    on (release) {    myDate = new Date();    currentMonth = myDate.getMonth();    }    3.分号    ActionScript语句用分号(;)结束,但如果你省略语句结尾的分号,Flash仍然可以成功地编译你的脚本。    4.圆括号    定义一个函数时,要把参数放在圆括号中:    function myFunction (name, age, reader){    …    }    调用一个函数时,也要把要传递的参数放在圆括号中:    myFunction (″Steve″, 10, true);    圆括号也可以用来改变ActionScript的运算优先级,或使自己编写的ActionScript语句更容易阅读。    5.字母的大小写    在ActionScript中,只有关键字区分大小写。对于其余的ActionScript元素,可以使用大写或小写字母。例如,下面的语句是等价的:    cat.hilite = true;    CAT.hilite = true;    但是,遵守一致的大小写约定是一个好的习惯。这样,在阅读ActionScript代码时更易于区分函数和变量的名字。    6.注释    添加注释有助于别人对你编写的脚本的理解。注释语句用“//”开始。    7.关键字    ActionScript保留一些单词,专用与本语言之中。因此,不能用这些保留字作为变量、函数或标签的名字。下表列出了ActionScript中所有的关键字:    (^60090404b^)    注意:这些关键字都是小写形式,不能写成大写形式。    (五)控制语句    控制结构在程序设计中占有相当重要的地位,通过控制结构可以控制动作脚本的流向,完成不同的任务。控制结构包括条件判断控制结构和循环执行控制结构。    1.条件判断语句    条件判断结构在程序中用于条件判断,根据条件判断结果执行不同的动作。在Flash动作脚本语言中,使用if语句实现条件判断结构。If语句称为条件语句或“逻辑分支”。根据分支的多少,我们可以把if语句分为单分支条件判断结构和两分支条件判断结构。    (1)单分支条件判断语句    单分支条件判断语句的语法格式如下:    if(condition) {    statements;    }    当条件(condition)成立时,执行{}内的语句块(statements)。语句块可以是一到多个语句。例如:    if (X>0) {    fish.play();    }    在上面的条件判断结构中,x>0是条件。当x>0的条件成立(true)时,执行结构内的语句fish.play();当x>0的条件不成立(false)时什么也不做。    (2)两分支条件判断语句    两分支条件判断语句的语法格式如下:    if(condition) {    statement1;    }else {    statement2;    }    当条件成立时,执行if后面的语句块{statement1};当条件不成立时,执行{statement2}。例如:    if ((year%4 == 0) && (year%100<>0) || (year%400 == 0)) {    leap = year+″是闰年″;    } else {    leap = year+″不是闰年″;    }    上述两分支判断结构判断年份(year)“能被4整除且不能被100整除”或年份“能被400整除”两个条件。如果两个条件中有一个条件成立,则执行if后面的语句:leap = year+″是闰年″;如果两个条件都不成立,则执行else后面的语句:leap = year+″不是闰年″。    2.循环控制结构    循环是指对同一段脚本代码重复执行若干次。被重复执行的代码块称为循环体。    (1)while循环    while循环分为两种,一种是先判断条件是否满足,如果条件满足则执行循环体内的代码块,然后继续判断条件是否满足,直至条件不满足为止;另一种是先执行一次循环体内的代码块,才判断条件是否满足,如果满足则继续重复执行代码块,直至条件不满足为止。    在Flash动作脚本语言中while循环有以下两种语法格式:    while(condition) {    statement(s);    }    和    do {    statement(s);    } while (condition);    while语句是先判断后执行型,使用时应注意,格式中的条件可以是关系表达式或逻辑表达式,也可以是常数(非零视为true,零视为false);语句块由若干语句组成;while循环是先测试型,有可能一次也不执行循环体;编写脚本时一定要注意,务必使循环条件最终变为false,否则会成为死循环。    (2)for循环    for循环是Flash动作脚本语言中另一种形式的控制结构。在for循环中,循环变量的初值、循环条件和循环变量的增量均写在一起,结构更清晰,使用更方便。    For循环的语法格式如下:    for(init; condition; next) {    statement;    }    格式中的init用于给循环变量赋初值;condition是循环条件;next是循环增量。例如,要实现从1累加到10,可以用下面的代码实现:    var s = 0;    for (I=1; I<=10; I++){    s = s+I;    }    在for循环中,循环变量I从1变到10,每次循环I增加1,直到I>10为止,共进行了10次循环。在循环中实现将I累加到变量S中,结果S=1+2+……+10。    For循环与while循环一样,也是属于先判定后执行型。因此,如果一开始循环条件就不满足,循环内的代码块一次也不会执行。    (3)for…in循环    Flash 5的动作脚本语言是一种面向对象的编程语言。For…in循环是一种特殊的循环,它应用于对象,其作用是对对象的每个属性或数组的每个元素进行循环处理。    For…in循环的语法格式如下:    for(variableiterant in object){    statement(s);    }    语法格式中的变量(variableiterant)可以是任意合法的变量名;对象(object)可以是数组对象或其他对象,如日期对象、电影剪辑对象等等。    For…in循环的执行过程:首先取指定对象的第1个属性,并把属性名作为字符串存入变量中,然后对该属性执行代码块中指定的动作。对第1个属性处理完毕后,进入第2次循环,对第2个属性进行处理,依此类推,直至对指定对象的所有属性处理完毕。对数组元素的处理与此类同。For…in循环不需要显式指定循环控制变量来控制循环,因为循环次数是由指定对象的属性个数决定的。    (六)函数与对象    函数是每一种编程语言的基本组成部分。Flash 5的脚本语言也提供了一些常用的函数。可以把函数分为预定义函数(系统函数)和自定义函数。预定义函数是Flash系统提供的函数,可以直接调用。Flash 5允许用户根据自己的需要定义自己的函数,称为自定义函数。自定义函数用function动作定义。在自定义函数中,用户定义一系列语句,对传递过来的值进行运算,最后返回运算结果。    对象是面向对象编程语言的重要语言元素。对象一般都封装了一些属性和方法。通过读取或设置对象的属性,调用对象的方法,可以减少编程工作量,提高编程效率,轻松实现我们想要完成的任务。    1.函数    (1)int    函数功能:截取指定数值的整数部分。    语法格式:int(value)    应用举例:k1=int(2.3)    说明:参数value是一个要截取整数部分的数值、数值型变量或函数。    (2)number    函数功能:把指定的参数转换成数值。    语法格式:number(expression)    应用举例:N1=number("2001")    说明:参数expression可以是字符表达式、逻辑表达式或其它可以转换为数值的表达式。    (3)random    函数功能:产生0到指定整数之间的随机整数。    语法格式:random(value)    应用举例:b=random(10)    说明:参数value用来指定产生的随机整数的上限,下限是0。    (4)isFinite    函数功能:测试数值是否为有限数。    语法格式:isFinite(expression)    应用举例:f=isFinite(13/5e-1000000)    说明:参数expression可以是一个逻辑值、变量或其他表达式。函数的返回值是一个逻辑值。    (5)isNaN    函数功能:测试指定的参数是否为非数值。    语法格式:isNaN(expression)    应用举例:b=isNaN("2001")    说明:函数中的参数expression可以是一个逻辑值、变量或其他表达式。函数的返回值是一个逻辑值。    (6)parseFloat    函数功能:把字符串转换成浮点数。    语法格式:parseFloat(string)    应用举例:x=parseFloat("2001年9月20日")    说明:参数string是一个字符串。    (7)parseInt    函数功能:把字符串转换成整数。    语法格式:parseInt(expression, radix)    应用举例:b=parseInt("3.5")    说明:函数中的参数expression可以是字符串、浮点数或其它表达式;参数radix可选,表示数的进制,有效取值范围在2-36之间。    (8)string    函数功能:把指定参数转换成字符串。    语法格式:string(expression)    应用举例:c=string(12345)    说明:函数中的参数expression可以是数值、逻辑值、变量或对象。    (9)eval    函数功能:计算表达式的值。    语法格式:eval(expression)    应用举例:x = eval("a") //a是变量名    说明:参数expression代表字符串表达式,可以是变量名、属性名、对象名或电影剪辑名。    (10)getProperty    函数功能:读取电影剪辑实例指定属性的值。    语法格式:getProperty(instancename, property)    应用举例:manX = getProperty("_root.man", _x)    说明:参数instancename是电影剪辑实例名,property是电影剪辑实例的属性。    (11)getTimer    函数功能:返回动画开始播至现时的时间,单位是毫秒。    语法格式:getTimer()    应用举例:T1=getTimer()    说明:本函数为无参函数。    (12)getVersion    函数功能:返回Flash播放器版本号和运行平台的信息。    语法格式:getVersion()    应用举例:version=getVersion()    说明:本函数为无参函数。       2.属性    在Flash 5 ActionScript中,我们把物体称为对象,把物体的基本特征称为对象的属性。属性具有具体的值。Flash 5 ActionScript定义了以下一些系统属性。    (1) _alpha    作用:设置或返回电影剪辑实例的Alpha透明度。    应用举例:fly._alpha= 80    说明:取值范围是0-100,0表示全透明,100表示完全不透明。    (2) _height和_width    作用:设置或返回电影剪辑实例的高度和宽度,单位为像素(px)。    应用举例:fish._height = 100    说明:设置_height和_width属性,可以改变电影剪辑实例的大小。    (3) _name    作用:返回或改变电影剪辑实例名。    应用举例:fish._name = "bigfish"    说明:可以用_name属性读取或更改实例名。    (4) _rotation    作用:返回或设置电影剪辑旋转的角度。    应用举例:_rotation = random(360)    说明:设置值以度为单位。    (5) _visible    作用:设置或返回电影剪辑实例的可见性。    应用举例:plane._visible = false    说明:它的取值是逻辑值true或false。设为false时,电影剪辑不可见。    (6) _x和_y    作用:设置或返回电影剪辑实例位于父电影剪辑坐标系中的x和y坐标。    应用举例:spider_x = _root.web.spider._x    说明:如果一个电影剪辑实例位于主时间轴中,那么该电影剪辑实例的坐标系就以编辑区左上角作为坐标原点(0,0)。如果一个电影剪辑包含在另一个电影剪辑之中,那么该电影剪辑就位于父电影剪辑的坐标系中。父电影剪辑的坐标系以注册点为坐标圆点(0,0)。    (7) _xscale和_yscale    作用:设置或返回电影剪辑水平或垂直方向的缩放比例,以百分数表示。    应用举例:_root.web.spider._yscale = 200    说明:设置电影剪辑实例的_xscale和_yscale属性,可以按比例放大或缩小剪辑实例。电影剪辑实例的_xscale和_yscale属性的默认值为100,注册点的默认值为0。    (8) _currentframe    作用:返回正在播放的时间轴的当前帧号,或者说播放头所在帧的帧号。    应用举例:cf = _root.myInstance._currentframe    说明:这个属性的值随着播放头的移动而变化。    (9) _url    作用:返回下载动画文件的URL。    应用举例:movieclipurl = _root.web.spider._url    说明:读取_url属性值的方法是在属性前加上电影剪辑实例的路径。    (10) _framesloaded    作用:返回已载入的帧数。    应用举例:frameloaded = _root.web.spider._framesloaded;    说明:读取这个属性的方法是在属性前面添加实例名及其路径。    (11) _totalframes    作用:返回指定动画或剪辑实例的总帧数。    应用举例:totalframes = _root.web.spider._totalframes;    说明:读取这个属性的方法是在属性前面添加实例名及其路径。    (12) _xmouse和_ymouse    作用:返回鼠标指针的x坐标和y坐标。    应用举例:xmouse = _root._xmouse    说明:使用这两个属性可以获取动画中鼠标指针的位置。