Flash 5 ActionScript交互动画简明教程(上)

Author: 莫治雄 Date: 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
      说明:使用这两个属性可以获取动画中鼠标指针的位置。