CGArt

搜索
热搜: 活动 交友 discuz
CGArt 首页 CG学院 Flash动画 ActionScript 查看内容

ActionScript高级编程完全攻略

2005-3-24 13:49| 发布者: 零度雪茵| 查看: 2106| 评论: 0|原作者: 白雪飘扬|来自: CGerCN

动作脚本的语法规则

Flash5终于推出了令人欣喜的脚本编辑器,而脚本的功能也与往日不可同日而语了。总的来说,新的ActionScript共有三项重大改进:
  - 与Java和C/C++几乎完全相同的语法风格;
  - 强大的库函数支持;
  - 包含直接代码编辑的集成脚本编辑器。
Flash ActionScript终于从尝试走向完善。

  废话暂时就先说到这儿,下面我们就来仔细讨论一下新的ActionScript的语法和书写规范。熟悉此项的大虾们也请看一下,说不定有你所不知道的呢!

1、脚本构成

  和C++语言一样,Flash脚本也是由对象和函数构成的,只不过FAS里的“对象”实际上是影片片段而已(FAS本身的对象含义不象C++中的对象,倒更象是结构体,因为它没有真正意义上的成员函数,此点我们以后细说)。但它们之间又有本质区别。

  首先,C++中的对象是由类实例化得来的,类可以被继承;而FAS中没有类的概念,所有的影片片段都是现成的,最多只能用attachMovie来动态生成一个非现成的影片片段,或用duplicateMovieClip来复制一个已有的影片片段。

  其次,C++中成员函数定义在类声明里,可以被重载,且没有先后顺序;而FAS中所有的函数都定义在某个特定的影片片段中,这也就是说,如果定义函数的那个影格未被播放,函数就不存在;另外FAS中的函数不能被重载,只能被覆盖,系统始终只保留最近被执行的脚本中的函数定义。比如:
  function myFunctionAngel {
    trace("1");
  }
  function myFunction(a,b) {
    trace("2");
  }
  myFunction(1);
输出的是2而不是1。

  第三,FAS中的影片片段全都是嵌套的,有着深厚的层次关系,只要写明其路径,就能直接调用任何影片片段的成员函数或变量等;而C++中虽然也有对象的嵌套,但只有外层的对象可以直接调用内层对象的公有成员。

2、基本元素

  Flash脚本的基本元素有:变量、数组、对象、影片片段、影片片段)属性和函数。其中数组(一种特殊的对象)、对象(包括一些预定义对象,如Math)和自定义函数是Flash5中新增的内容。另外,老版本中的一些指令,象:
  setPropery (target,property,value);
等,我们现在也把它们称为函数。这样一来,其余就只剩下为数不多的一些关键词了,下面一一列出:
code:--------------------------------------------------------------------------------  #include "..." var
  new delete
  if...else... ifFrameLoaded(...)...
  for(...)... for(...in...)...
  do...while(...) while(...)...
  break continue
  tellTarget(...)... with(...)...
  function ...(...){...} return
  on(...){...} onClipEvent(...){...}
--------------------------------------------------------------------------------
其中写明要{}的必须加上{},其他如if等在子过程只有一条语句时可省略{}。具体应用放到以后细讲。

3、语句书写格式

  Flash脚本的语句书写基本上与Java和C/C++语言相同。一条语句可分几行写,也可在同一行中写多个语句。不同之处有以下几点:

  (1)当不会与后一语句产生歧义时,语句末尾的“;”可以省略,但为了分隔同一行内的多个语句则必须要加。比如:
  a = b =
  c = 1
  traceAngel; traceBeer; traceCoffee;
不过我们为了统一起见,还是提倡一律如C语言那样加上分号。

  (2)变量、对象等无须定义(用var可定义其局部性)就可直接赋值使用,在未赋值前所有标识符都代表一个值为空的无类型变量。同一标识符可反复赋予不同类型的值。

  (3){}可以在任何地方成对加,但无任何实际效果(var只对函数体有效,这在后面会讲到),不象C/C++语言那样有局部作用域功能。比如:
  a = 1;
  if (a==1) {
    var a = 0;
  }
  traceAngel;
将输出0,而在C/C++中会输出1。

  (4)函数可以在任何地方定义。甚至可以把一个函数定义在另一个函数的体内,就象下面这段程序:
  function myFunction1() {
    function myFunction2() {
      trace("2");
    }
    trace("1");
  }
  myFunction1();
  myFunction2();
将输出:
  1
  2

二、点语法对象与目标路径的使用

  Flash ActionScript里最基础但也往往是最不容易搞清楚的恐怕就要算点语法对象和目标路径的使用了。不用说初学者常常不知道什么时候该用点语法对象,什么时候该用目标路径,就连能熟练运用三维显示技术的闪客高手有时也会因为概念混淆而用错,而这种错误又往往是最难发现的。所以,我把它放在第二节来介绍,同时也顺带讲一下与此密切相关的一些指令和函数的使用。

1、形式与含义

  形如 a.b.c 的表达形式即为点语法对象。它可以指代变量、数组和对象,也可以指代影片片段、属性和函数。比如:
  anyObject.a
  b[12].anyArray
  _root.anyMovieClip._x
  anyMovieClip.anyFunction
等都是合法的点语法对象形式。一般把这种表示形式与Java或C/C++语言中的类与成员、成员函数的表达相类比,但要注意的是FAS里更强调的是对象的层次,甚至还有_parent、_root之类相对路径的表示形式,它并没有继承等面向对象语言的标准概念。所以说把它理解为地址或者路径似乎更为恰当一些。

  形如 "a.b/c" 或 "a/b:c" 的为目标路径。它是一个字符串,可以指代变量和对象,也可以指代影片片段和属性,但不能指代数组和函数。它的分隔符可以有"."、"/"和":"三种,其中"/"后跟对象和影片片段,":"后跟变量和属性,"."则都可。不同的分隔符可以混合使用。比如:
  "anyObject:a"
  "_root/anyMovieClip._x"
等都是合法的目标路径形式。除了点语法对象是变量形式而目标路径是字符串形式这一根本区别外,它们所表示的含义完全相同,只是在使用上各有侧重而已。

2、具体使用

  当我们要对某一已知名称的变量或对象等操作时,应选择点语法对象表达。比如对变量或属性赋值:
  myMovieClip._xscale = 150;
  myObject.index = 16;
  _parent.myObjectArray[14].index = 10;
又比如调用函数:
  myMovieClip._x = myMath.square(length);

  当我们要对某一不定名称的变量或对象等操作时,应选择目标路径表达。比如对一批影片片段的某一属性赋值:
  for (i=1;i<10;i++) {
    set ("myMovieClip"+i+"._x",20*i); // 2.1式
  }

  有时我们又要把它们联合起来使用,以弥补点语法对象无法表达不定名称及目标路径无法表达数组和函数的不足。比如对一批影片片段下的某一对象数组赋值:
  for (i=1;i<10;i++) {
    eval("myMovieClip"+i+".myObjectArray")[0].index = i; // 2.2式
  }
这是Flash5中所提倡的用法。所以,从某种意义上来说,目标路径可以看作是在表示源代码。

  注意:有时点语法对象也被当成字符串来用,比如:a = anyMovieClip+"1",a的值就为"_level0.anyMovieClip1"。但本质上其实是系统在执行+"1"前自动内部执行了String(anyMovieClip)而已。其他情况也是一样。

3、相关函数与指令

  eval(expression)是与点语法对象和目标路径的使用有关的最常用的函数。它的实质是把目标路径转化成点语法对象。系统先把expression自动转化成字符串,相当于调用了一次String(expression),得到"expression_string"的形式。这时的"expression_string"必须为目标路径形式(否则无返回值),然后返回"expression_string"所指代的内容。

  为什么说是内容而不说是值呢?这是因为eval(expression)的返回值实际上是一个点语法对象。比如:
  eval("anyMovieClip"+1)._x = 200;
仍是合法的语句。如果说._x的左边是一个值似乎就不合适了。类似的如前面提到的2.2式。故对于形如:
  c = a+eval("b");
的理解(设b的值为1)不应为c=a+1,而应该是c=a+b。在处理形如上述2.1式的表达式时,Flash5推荐使用eval函数,即写成:
  for (i=1;i<10;i++) {
    eval("myMovieClip"+i)._x = 20*i;
  }
另当"expression_string"指代的是一个影片片段时,返回的是形同_level0.anyMovieClip的绝对路径形式,所以就不能使用如_root.eval(expression)之类的调用了。

  with与tellTarget也是与点语法对象和目标路径密切相关的指令。其中with是Flash5中新增加的。它们的使用格式相同:
  with (expression) {
    ...
  }
  tellTarget (expression) {
    ...
  }
expression可以是点语法对象,也可以是目标路径。对于with来说,expression可指代对象和影片片段,而对于tellTarget来说,expression只能是影片片段。

  虽然它们形式上极为相仿(尤其当expression同指影片片段时),但处理过程却并不相同。试比较(a非myMovieClip的成员变量):
  a = 1;
  with (myMovieClip) {
    traceAngel; // 2.3式
  }

  a = 1;
  tellTarget (myMovieClip) {
    traceAngel; // 2.4式
  }
前者输出1,而后者输出空值。原因是tellTarget对它所包含的语句中的所有变量、对象等都加上expression所表示的路径,而with只对其中expression所指对象或影片片段内已经定义过的变量、对象等加上expression所表示的路径。所以2.3式就相当于with外的:
  traceAngel;
而2.4式就相当于tellTarget外的:
  trace(myMovieClip.a);
当然,如果a本就是myMovieClip的成员的话,二者的输出就一样了。

Flash5ActionScript教程 3

--------------------------------------------------------------------------------

7.预定义对象
  可以使用Flash 5的预定义对象来访问和管理某些类型的信息。下面列出一些预定义对象:

Math(数学)对象:它的重要作用是对内建数学常数和函数的全面补充,例如E(Euler常数)、cos(余弦)和atan(反正切)。

Date(日期)对象:使用Date对象可以获取运行Flash播放器的系统的日期和时间信息。

Sound(声音)对象:使用Sound对象可以在动画中添加声音,能够在播放动画时控制声音。例如,可以调整音量(setVolume)或平衡(setPan)。

Mouse(鼠标)对象:使用Mouse对象可以隐藏标准光标,让你能够使用自定义光标。

MovieClip(电影剪辑)对象:使用MovieClip对象,可以控制电影剪辑而无需使用打包动作(如tellTarget)。可以使用点语法(如myMovieClip.play())调用电影剪辑实例的方法(如play、loadMovie或 duplicateMovieClip)。

8.剪辑动作
  可以使用onClipEvent动作直接给编辑区中的电影剪辑实例分配动作。onClipEvent动作有load、enterFrame、mouseMove和data等事件,利用它可以创建新的高级交互性。
9.新动作
  Flash 5增加了一些新动作,可以使用这些新增的动作(如do..while和 for)创建复杂的循环。另一些新动作则以MovieClip对象的方法来补充,如getBounds、attachMovie、hitTest、 swapDepths和globalToLocal等。
10.调试器
  使用调试器可以查看和修改在测试动画模式、Flash独立播放器或浏览器中播放的动画的变量和属性值。这样,你就可以很容易发现动作脚本中的问题。
11.XML支持
  使用预定义的XML对象可以把ActionScript转换为XML文档,然后传递到服务器端应用中。也可以用XML对象把XML文档载入Flash动画中并加以解释。使用预定义的XML Socket对象可以创建不间断的服务器连接,为实时应用传递XML数据。
12.提供上下文敏感帮助
  Flash 5包含有Actions面板中可用的每个动作的上下文敏感帮助。在编写脚本的过程中,可以获得与正在使用的动作有关的信息。方法是:从Actions面板的工具箱列表中选择一种动作,然后单击面板上边的Help按钮,与选定动作相关的主题即显示在浏览器中。

使用ActionScript编写脚本

  ActionScript是Flash的脚本语言。使用ActionScript可以给Flash动画添加交互性。我们可以对自己制作的动画进行设置,让用户事件(如按钮单击和按钮)触发脚本,告诉动画执行什么动作。例如,你可以编写一个脚本告诉Flash,依据用户选择的导航按钮,把不同的动画载入Flash播放器中。
一、用ActionScript编写脚本的基本步骤 (相信大部分读者均非菜鸟,略)
二、脚本的规划和调试
  当你为整个动画编写脚本时,脚本的数量和种类可能很大。决定使用哪些动作,怎样有效地构造脚本,脚本应该放在何处,所有这些都要仔细规划和调试,特别是在动画复杂的情况下更应如此。
  在开始编写脚本之前,首先要明确目标和要达到的目的。从写出你希望在动画中发生什么事情开始着手,如下例所示:

我想用Flash创建我的整个网站。

需要询问网站浏览者的姓名,并把这些信息用之于整个网站的消息中。

本网站将设置一个可拖放的导航栏,该导航栏中应有一些链接到本网站各个部分的按钮。

当一个按钮被单击时,新的部分将淡入舞台中心。

一个场景将包含一个联系表单,表单中已经填写了用户的姓名。

  当你明确了自己的设计目标之后,你就可以创建对象,编写控制这些对象的脚本了。要让脚本能够按照你的要求工作,常常需要多次修改、测试和调试。最好的方法是从简单开始,并经常测试你编写的脚本。当你编写的一部分脚本能正常工作时,选择Save As(另存为)命令,保存文件的版本(如myMovie01.fla),然后再开始编写余下的部分。当你编写更为复杂的脚本时,这种方法有助于你有效地发现错误,确保你的动作脚本“稳固”。
三、面向对象的脚本编写
  在面向对象的脚本编写中,通过把信息分为组(称为类) 来组织信息。可以创建一个类的多个实例(称为对象),用于你的脚本之中。可以使用ActionScript的预定义类,也可以创建自己的类。
  在创建类时,要定义该类创建的每个对象的所有属性和方法,就像定义现实世界中的对象一样。例如,一个人拥有诸如性别、身高、发色等属性和谈吐、走路、投掷等方法。在本例中,“人”是一个类,每一个人就是一个对象或该类的一个实例。
  ActionScript中的对象可以包含数据或作为电影剪辑以图像形式出现在编辑区中。所有的电影剪辑都是预定义类MovieClip的实例。 每个电影剪辑实例均包含MovieClip类的所有属性(例如_height、_rotation、_totalframes)和方法(如gotoAndPlay、loadMovie、startDrag)。
  要定义一个类,就要定义一个函数(称为构造函数)。预定义类拥有已经定义的构造函数。例如,如果你需要关于动画中自行车骑士的信息, 你就要创建一个构造函数Biker,该构造函数拥有time(时间)、distance(距离)属性和rate(速度)方法,给出该骑士的旅行速度:

function Biker(t, d) {
this.time = t;
this.distance = d;
}
function Speed() {
return this.time / this.distance;
}
Biker.prototype.rate = Speed;
  然后,你可以创建该类的一个拷贝—即实例。下面的代码创建对象Biker的实例,称为emma和hamish。

emma = new Biker(30, 5);
hamish = new Biker(40, 5);
  实例之间可以互相通讯。对于Biker对象,你可以创建称为shove的方法,让一个骑士推另一个骑士。如果hamish靠得太进,实例emma可能会调用它的shove方法。要把信息传递到方法中,可以使用参数。例如,shove方法可能有两个参数who和howFar。在本例中,emma推hamish 10个像素:

emma.shove(hamish, 10);
在面向对象的脚本编写中,依据指定的顺序,类可以相互接收属性和方法,这称为继承。你可以利用继承来扩展或重定义一个类的属性和方法。从其它类继承而来的类称为子类,传递属性和方法到另一个类的类称为父类。一个类可以是子类,也可以是父类。

鲜花

握手

雷人

路过

鸡蛋
发表评论

最新评论

游客 2007-12-13 15:21
aa
返回顶部