Flash CS3 ActionScript 3.0入门

作者: egoldy

性质: 翻译

阅读次数: 18532

发表时间: 2007-05-06 15:39:18


声明:此教程为webstudio翻译教程,英文原版来自senocularGetting Started with ActionScript 3.0 in Adobe Flash CS3如果转载本站的中文教程,请注明出处.


随着flash cs3的到来,同时提供给我们一个崭新的,针对Adobe Flash(swf)影片和功能程序的标准的程序开发语言。在之前的一段时间里,你可能发现入门ActionScript 3.0与其它版本的ActionScript相比会有一些难度.例如,如果拿ActionScript 1.0到ActionScript 2.0的变化相比的话,那么对于ActionScript变化到ActionScript 3.0可以说是一个比较大的跳跃了。特别是那些倾向于在flash ide中编写代码程序员,这篇文章将帮助你如何在flash cs3 ide中工作。

运行环境
1.Flash CS3
2.有一些ActionScript或是Javascirpt基础
如果不使用CS3或是没有Flash CS3怎么办?你可以从这里学习使用免费的flex 2 sdk来学习ActionScript 3. Beginners Guide to Getting Started with ActionScript 3 (Without Learning Flex)

索引
1.    历史简介
2.    ActionScript 3 基本的一些不同之处
3.    一般性内容
a.    Variables 变量
b.    Functions 函数
c.    Objects/Classes对象/类
d.    Events 事件
4.    ActionScript和时间线
5.    使用Display Objects.

ActionScript历史简介

早期的flash 3中的ActionScript 1.0语法冗长,主要的应用是围绕着帧的导航和鼠标的交互.这种状况一直保持到flash 5. 到flash 5版本时ActionScript已经很象JavaScript了。它提供了很强的功能和为变量的传输提供了点语法。ActionScript同时也变成 了一种prototyped(原型)语言,允许类似于在javscript中的简单的oop功能。这些在随后的flash mx(6)版本中得到的增强。
Flash MX2004(7)引入了ActionScript 2.0,它带来了两大改进:变量的类型检测和新的class类语法。ActionScript 2.0的变量类型会在编译时执行强制类型检测。它意味着当你在发布或是编译你的影片时任何指定了类型的变量都会从众多的代码中剥离出来,检查是否与你现有 的代码存在矛盾冲突。如果在编译过程中没有发现冲突,那么你的swf将会被创建,没有任何不可理解变量类型的代码将会运行。尽管这个功能对于flash player的回放来说没有什么好处,但对于flash创作人员来它是一个非常的好工具,可以帮助调试更大更复杂的程序。
在ActionScript 2.0中的新的class类语法用来在ActionSctipt 2.0中定义类。它类似于Java语言中的定义。尽管Flash仍不能超越它自身的原型来提供真正的class类,但新的语法提供了一种非常熟悉的风格来 帮助用户从其它语言上迁移过来,提供了更多的方法来组织分离出来As文件和包。

接下来我们进入到flash CS3(9;在flash8中没有发生多大的变化)ActionScript 3.这里我们不光有一个带有新的版本号的ActionScirpt 语言,还有一个全新的虚拟机即—Flash Player在回放时执行ActionScript的底层软件。ActionScript 1和ActionScript 2都使用是AVM1(ActionScript 虚拟机1),因此它们在需要回放时本质上是一样的,记得我们在ActionScript2上说过它增加了强制变量类型和新的类语法,它实际上在最终编译时 变成了ActionScript 1,而ActionScript 3.0运行在AVM2上,一种新的专门针对ActionScirpt 3代码的虚拟机。基于上面的原因,ActionScript 3.0影片不能直接与ActionScript 1和ActionScript 2影片直接通讯(ActionScript 1和ActionScript 2的影片可以直接通讯,因为他们使用的是相同的虚拟机;如果要ActionScirpt 3影片与ActionScirpt 1和ActionScript 2的影片通讯,只能通过local connection),但是你会发现ActionScript 3的改变更深远更有意义。
下面是各个版本的代码示范:
ActionScript 1

function Example(){
      this.num = 1;
}
Example.prototype.str = "text";
Example.prototype.doubleNum = function(){
      this.num *= 2;
} 

ActionScript 2

class Example {
      public var num:Number;
      private var str:String = "text";
      public function Example(){
            this.num = 1;
      }
      public function doubleNum():Void {
            this.num *= 2;
      }
} 

注意当编译时,上面的ActionScript 2类会变成ActionScript 1范例那样。
ActionScript 3

package {
      public class Example {
            public var num:Number;
            protected var str:String = "text";
            public function Example(){
                  this.num = 1;
            }
            public function doubleNum():void {
                  this.num *= 2;    
            }
      }
} 

ActionScript 3有怎样的不同呢?

ActionScript 3是不同的,非常的不同。因为不同在实际应用上所以需要一个全新的虚拟机来运行它。但是本质上,它仍是ActionScript,作为 ActionScript你可能 已经注意到了在ActionScript 1和ActionScript 2中的许多命令和程序概念仍然非常好的适用于ActionScript 3.0.尽管上面的范例代码非常小,我们至少可以看出语法已经改变了。在某些地方ActionScript 3.0与ActionScript 2.0代码看上去非常相似但并不总是这样,最终在As2.0与As3.0中直接转换经常会比较困难。
这些改变是非常必要的,在印象中ActionScript 3.0有很高的功效,在开发过程中不仅是效率(这一点在一些小的但工作量较大的项目中得到证实)还有就是ActionScript 3.0在Flash Player中的回放速度要比ActionScript 2代码快10倍。好,你可能会发现在ActionScirpt 1和ActionScript 2中的许多并不复杂的任务在ActionScript 3.0中的代码长度会是原来的两倍长。但是最终你获得是它的高速和效率。对于那些经常使用代码的用户来说看到了希望,而对于高级的程序员来说将会高兴的跳 起来。
下面是一些ActionScript 3中的新特性:
1.运行时排错—错误会运行时抛出以帮助你调试你的影片。
2.运行时变量类型检测—在回放时会检测变量的类型是否合法。
3.类封装—静态定义的类以增强性能。
4.方法封装—方法现在与它们相关的类实例绑定因此在方法中的’this’将不会改变。
5.E4X – 一个新的,更易于操作的xml
6.正规表达式—支持本地化正规表达式。
7.命名空间—不但在xml中支持命名空间而且在类的定义中也同样支持。
8.int和uint数据类型—新的数据变量类型允许ActionScript使用更快的整型数据来进行计算。
9.新的显示列表模式—一个新的,自由度较大的管理屏幕上显示对象的方法。
10.新的事件类型模式—一个新的基于侦听器事件的模式

在哪里输入Flash CS3代码

当你在Flash CS3中使用ActionScript 3.0书写代码时,你可能正在时间线上书写代码。如果你并没有在时间线上书写代码,那么你可以将你的代码书写在外部类文件中(也就是说你不能将代码直接写 在fla文件中,现在你使用的是哪种方式呢?),在ActionScript 1和ActionScript 2中,你可以在时间线上写代码,也可以在选中的对象如按钮或是影片剪辑上书写代码,代码加入在on()或是onClipEvent()代码块中以及一些相 关的事件如press或是enterFrame.这些在ActionScript 3.0都不在可能了。代码只能被写在时间上,所有的事件如press和enterFrame现在都很同样要写在时间线上。

Figure: 试图想在选中的对象上输入代码时出现的提示,不能应用代码。

 

变量

变量是在代码中描述或是容纳不同值或数据的名称。当你在ActionScript 3.0中声明变量时,你需要使用var关键词

var myVariableName; // 需要使用var

从flash5版本开始,var 关键词就已经可用了,但是在现在的ActionScript 3中它是必须的。例外的情况是在定义动态对象实例的变量数据时。

myDynamicObject.newVar = value; // 不需要var

在上面的例子中,newVar在myDynamicObject对象中新定义的一变量,没有使用var关键词。实际上,var 关键词从来不在复杂引用中应用,或是任意需要点语法的引用中,或是使用[]引用的变量。
当定义一个变量时你必须使用数字,字符,$符号或下划线_来命名变量,你不能使用数字开头的名字来做为变量名称。如”bits32”,”_bits32”和"$bits32"都是合法的,“32bits”是不合法的因为它的名称之前使用了数字。
你需要确认你所创建的变量名没有和你现有的代码中的变量和代码内部预置变量没有冲突。例如,当你在时间线上书写代码时,你正在定义一个影片剪辑的实例名称,如果你试图将其定义成与flash内置的变量MovieClip名称相同,你将会得到一个错误。

// 任意的时间代码
var name:String = "Joe"; // 错误:与现有的内置变量名称冲突 

同样,你不能在全局对象或是函数如Array,XML或是trace中使用。
注意:从Flash Player 7之后,ActionScript 开始区分大小写,因些变量Name和name是不同的。
ActionScript 3.0中还有一个新的地方是你只能在某一代码范围或是时间线代码上使用一次var,从另一个角度说,如你在一段代码的顶端声明了变量x,那么你不能在下面代码中的x变量使用var 关键词。

var x = value; // ok

…

var x = differentValue; // 错误:你只能使用一次var关键词。

当在Flash的时间线上定义变量时,它会应用在整个时间线上,而不只是当前的帧。
当使用var 关键词定义变量时,你可以为其指定变量类型,一个变量变量类型描述是它将存放的是哪种类型的数据。这个特性是从ActionScript 2.0开始的,一直继续到现在的ActionScript 3.0. 例如,如果你想让变量x是一个数值,那么你可以为它指定一个数值型如下。

var x:Number; // 变量x将用于承载数值型数据

在两个版本的ActionScript中,书写看上去是自由的,然而ActionScript 3 会在影片回放时保持书写信息的一些检查,不象在ActionScript 2.0中,在编译才会进行错误检查。这意味着你需要对你所使用的类型做出更多的判断,特别是你不能在ActionScript 3中针对一个变量使用两次var 关键词(而在ActionScript 2.0中将允许你针对同一变量使用不同的变量类型).
对于根本没有类型的变量来说,在ActionScript 3.0中你可以为其指定任意类型。它提供了一个特殊的类型”untyped”类型,它描述的是---没有类型。它的呈现方式是(*).
var anyValue:*; // 变量可以是任意的类型
为变量指定类型是个好的习惯,因为它可以引导更好的进行错误检查。在使用untyped类型时,你可以在指定为untyped类型加下一些说明,以便在其它人看代码时不至于去猜测。
如果你没有为一个变理提供一个默认的值,它将被系统默认的根据所设置的类型指定一个数值。如果没有设置变量类型,它将被指定一个undefined做为数值。下面列表中列出了在ActionScript 3.0不同的数据数据类型的默认值。

var untyped:*; // (or no typing) undefined

var boolean:Boolean; // false

var number:Number; // NaN

var integer:int; // 0

var unsignedInteger:uint; // 0

var string:String; // null

var object:Object; // null 

任何对象类型的默认值都是null.需要注意的object类型(任何对象包括arrays 和我们自定义类的对象)的默认值都是null,而不是undefinded。实际上在ActionScript中对象不能是undefined。如果他们 没有值,那么他们就是空null。只有类型为untyped的变量或偿试访问的变量不存在时才会得一个undefined值。
Number类型现在有了一个唯一值,而不在是undefined或是null了。如果他们没有值,那么他们的值为NaN(“不是一个数值 “)。NaN是一个比较巧妙的值,然而,你不能真正的拿一个NaN与另一个NaN去比较因为他们可能并不一样。如果你需要检查一个数值是否为NaN,你需 要使用isNaN语法。

if (isNaN(myNumber))  //检查myNumber是否已定义.

Int和uint变量类型是ActionScript 3中新增的类型。它们是用来指定描述32位整形或整数的。Int类型是一个标准的整型,uint是一个未标记的整型,或不为负值的整数。这些数值只能是整 数值,他们不能为空null,undefined,或是NaN。你可能已经注意到这两种类型的写法为int和uint,他们的第一个字母并没有大写,这意 味着他们并不是特定指定给对象或是与类关联的类型,相反,这些类型本质上与Number类型共享(在MIN_VALUE和MAX_VALUE中的应用)
还有另外一个类型也没有首字母大写,这就是void类型,在ActionScript 2.0中它的首字母是大写的,但是在ActionScript 3中它的首字母不在大写了,类似于int和uint,并没有特殊的定义与其相关联。这种类型通常用于指定给函数。

+++++++++++++++++++++++++++++++++++++++++++++++++
函数

函数是用来定义可用的部分代码或是在ActionScript中的自定义运算。通过创建军函数你可以执行多次重复的运算,而不需要在你应用的过程中一遍一遍的重写相同的功能。
在ActionScript中有两中定义函数的方法,你可能使用下面的格式来创建一个指定名称的函数,如[functionName]([参 数]){[some code]}或你可以定义一个没有指定名称的函数(匿名函数)使用如下的格式var[functionName]=function([参数]) {[some code]}.两者本质上都是创建一个变量,Function函数为变量值,只是第二种方式看上去更直接而已。

// 指定名称的函数
function doubleNumber(num) {

      return num*2;

} 

// 同样的没有指定名称的函数
var doubleNumber = function(num) {

      return num*2;

} 

上面的例子中创建了一个名为doubleNumber的函数,它接受一个单一的数值,并返回乘以2的数值。如果要使用它,你使用()括号来调用它。如下。

var x:Number = 10;

trace(doubleNumber(x)); // traces 20 

作为一个变量,命了名的函数一旦在时间轴上定义后将不能再被定义。
当为函数指定类型时,需要指定参数列表(你指定给函数的参数,多个参数用逗号隔开)和返回值的类型。当使用未命名函数时,变量名将被指定为Function类型。

// 命名函数

function doubleNumber(num:Number):Number {

      return num*2;

} 

// 相同功能的未命名函数。
var doubleNumber:Function = function(num:Number):Number {

      return num*2;

} 

如果一个函数没有返回值,那么它返回的类型将是void.当一个类型为void的函数被执行,或使用返回命令返回数值失败时,它的返回值变为undefined.

function returnsNothing():void {

      // do nothing

}

trace(returnsNothing()); // trace的结果为undefined. 

上面的returesNothing()函数不光没有返回任何内容,而且也不接收任何数值---它没有参数列表。在ActionScript3中如果你试图向一个没有参数列表的函数中传递参数,你将会得到一个错误。

returnsNothing(3); // 错误:不正确的参数值 

在ActionScript 2中,Void类型被用于做为函数的参数列表定义,用来标识此函数没有参数。在ActionScript 3.0中,你只将要参数列表留空即可。
注意:parameters和arguments是不同的,parameters(参数)是用在函数的定义中。Arguments是在函数中应用的真正的值。你可以把arguments看作是参数值。
在ActionScript 3中,你可能够只接在函数参数中定义默认值。

// 这里,message参数是任意指定的。
function usesDefault(message:String = "hello"):void {

      trace(message);

}

usesDefault("test"); // trace结果为 "test"
usesDefault(); // trace结果为"hello",即默认值。

使用默认参数值,你不但可以得到一个指定的默认参数值,而且可以让你定义的函数可以有任意的参数,甚至是不被使用的参数。在函数调用时,那些没有默认值的 参数必须要提供,基于这一点,所有的自由定义的有默认值的参数都要定义在参数列表之后。你不能把那些必须的参数定义在自由定义的有默认值的参数之后。

// 错误:没有必须的参数
// num定义在了message之后。
function usesDefault(message:String = "hello", num:Number):void {

      // code

} 

// 正确; usesDefault至少需要一个参数,最大是两个参数

// least 1 argument, accepts 2 at max

function usesDefault(num:Number, message:String = "hello"):void {

      // code

} 

那么如何让一个函数在调用时可以有任意数量的参数呢?,在ActionScript 2.0中,你只需要简单的删去参数列表然后通过引用arguments对象即可。在ActionScript 3.0中,已经没有了真正的参数列表,这意味着使用任何argument的函数将无法被调用。取而代之的是,你不得不使用一个新的参数类型为…(rest 其它).它放置在你的参数列表之后(或者它就是你的整个参数),当调用函数时你可以使用任意数量的参数。…(rest)参数要被写成如下格式… [argumentsArrayName],arrgumentsArrayName是一个数组,它用来承载所传递的参数。

function passAnything(...statements):void {

      trace(statements.length +": "+ statements);

}

passAnything(); // traces 0:
passAnything(1); // traces 1: 1
passAnything("a", true, 0); // traces 3: a,true,0 

注意:当使用…(rest)参数时,当函数调用时arguments对象不在可用了。取而代之的是…(rest)参数用来获得传递的参数。然而… (rest)并不象早期版本的arguments,它不在有caller属性来引用当前的函数。在ActionScript 3.中,arguments和…(rest)两者都没有callee属性来引用当前所调用的函数。(callee 在ActionScript2.0中的arguments 对象中是可用的,但是ActionScript 3.0中已移除).


[未完待续.....]

服务项目_SERVICE

关于我们

万博思图(北京)信息技术有限公司,专业的flash,flex开发团队,5年经验。公司致力于互联网上的业务的开展,对于互动网站行销,互联网应用程序开发有成熟的解决方案。我们关注互联网市场动态,关注新技术,更注重在新的领域不断探索发现。
万博思图业务内容主要包括企业品牌Flash网站开发,企业形象宣传Flash设计,动画,多媒体演示,Flex企业级应用程序开发,拥有众多成功案例,欢迎来电咨询。
 
COPYRIGHT BY WEBSTUDIO INTERACTIVE DESIGN Co.,Ltd. ALL RIGHTS RESERVED.
公司地址: 北京市朝阳区光华路15号院泰达时代中心4号楼704 邮编: 100026 EMAIL: WEBSTUDIO@WEBSTUDIO.COM.CN
电话: 010-59070059   (新号:010-59897050 010-59897060)  手机: 13693660520 传真: 010-59070059-801
京公网安备:110108006741      京ICP备:05013074号-1
王先生