从基础开始深入FlashAS3教程译文.doc

上传人:scccc 文档编号:13383795 上传时间:2021-12-24 格式:DOC 页数:12 大小:100.50KB
返回 下载 相关 举报
从基础开始深入FlashAS3教程译文.doc_第1页
第1页 / 共12页
从基础开始深入FlashAS3教程译文.doc_第2页
第2页 / 共12页
从基础开始深入FlashAS3教程译文.doc_第3页
第3页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《从基础开始深入FlashAS3教程译文.doc》由会员分享,可在线阅读,更多相关《从基础开始深入FlashAS3教程译文.doc(12页珍藏版)》请在三一文库上搜索。

1、从基础开始深入 Flash AS3 教程 (1)(译文)在 AS3 中,你可以使用 Stage 类动态的修改影片的帧频。Stage类(flash.display.Stage)的stage对象是所有的 sprite和MovieClip以及其他在安全沙箱 里的所有元件的舞台。 stage 对象的帧频可以是 0.01 到 1000 之间的任何一个数。要修改帧 频,使用下面的代码:/ 将帧频修改到 12 帧每秒( FPS)stage.frameRate = 12;类方法的作用域和类绑定在一起AS3 完全基于类构造。当一个类被创建的时候, 类中的参数,变量,方法或任何实例都同时 被创建。和 AS2 不同

2、, AS3 中的方法在执行的时候,将使用和类同样的作用域。例如下面 的代码:package import flash.display.Sprite;public class ClassScope extends Sprite public function ClassScope() traceThis(); / 输出 "Class Instance"var obj:Object = new Object();obj.traceThis = traceThis;obj.traceThis(); / 输出"Class Instanee"traceThis.c

3、all(new Sprite(); / 输出"Class Instanee"public override function toString():String return "Class Instance"public function traceThis():void trace(this); 图形对象和绘图 API 和AS1和AS2 一样,AS3也提供了绘图 API来绘制矢量线段和图形。但是在AS3中,绘图API 将独立于显示对象( display objects:MoiveClip , sprites 等)而被定义为图形对象 (flash.dis

4、play.Graphics )。图形对象拥有各种绘图方法用来在内部绘制图形。和以前一样,图形内容将在所有对象的最下层。同时,在 AS3 中有一些新的方法来帮助你方便的绘制简 单的图形。包括:园: drawCircle(x:Number, y:Number, radius:Number):void 椭圆: drawEllipse(x:Number, y:Number, width:Number, height:Number):void 矩形: drawRect(x:Number, y:Number, width:Number, height:Number):void 圆 角 矩 形 : draw

5、RoundRect(x:Number, y:Number, width:Number, height:Number, ellipseWidth:Number, ellipseHeight:Number):void代码举例:/ 绘制一个蓝色的圆角矩形var square:Sprite = new Sprite(); square.graphics.beginFill(0xFF);square.graphics.drawRoundRect(0, 0, 100, 50, 10, 10); square.graphics.endFill();addChild(square);4,新的变量类型AS3 中

6、有许多新的数据类型。其中有些类型是以前没有出现的。 AS3 中的基本数据类型如 下:简单数据类型:Booleanint null Number String uint undefined 复杂数据类型: Object Array Date ErrorFunctionRegExpXMLXMLList新的数据类型通过类来定义,例如:Matrix (flash.geom.Matrix)Shape (flash.display.Shape)URLRequest (.URLRequest)等等。注意: 特殊类型 Void 在 AS3 中被改成了全小写: void 。 “* ”可以用来代表所有数据类型。如

7、下:var anything:*;AS3 中的 XML 和 AS1 和 AS2 中完全不一样。 以前的 XML 类型(对象)被定义为 XMLObject 。 AS3 中的 XML 是标准的 E4X-based XML 对象。int 和 uint 是 number 类型的新扩展, int 表示整型(没有小数) , unit 是无符号整型(不能是 十进制,不能是负数) 。 使用 int 型比使用 Number 能稍微的提升运行效率,而 uint 型只应 该使用在必须的地方,比如颜色值。5,显示对象AS3 有一个新的集合: 显示对象。 这个集合包含了所有可以在舞台上看到或者可以被添加到 显示列表中的

8、对象,包括以前的 MovieClip , button 和 textField 对象。 AS3 的显示对象有: AVM1MovieBitmapLoaderMorphShape* MovieClipShapeSimpleButtonSpriteStaticText*TextFieldVideo有 * 的表示此对象必须在舞台上手动创建,不能直接通过AS 创建。AVM1Movie 是使用 AS1 和 AS2 创建的 Movie ,AS3 创建的 Movie 需要通过 AVM2 来播放。 因此用 AS1 和 AS2 创建的 Movie 在 AVM2 中被作为一个显示对象来播放。但是不能和 AS 合使用

9、。Bitmaps 是位图对象。 可以通过 BitmapData 对象来指定显示效果, 也可以通过位图文件来设 定。Loader 对象用来加载和显示外部的 image 和 swf 影片文件。MorphShapes 是在时间轴上创建的图形。虽然不能通过 AS 创建,但是可以通过 AS 来引用 和控制。MovieClips 人人都会用Shapes是从MovieClip中分离出来一个只有graphics对象的图形容器。在shape中可以通过graphics对象使用绘图 API绘制各种图形。使用 shape代替MovieClip可以减少内存负担。Sprite 是没有时间轴的 MovieClip ,在 A

10、S3 使用中,可能会在很多地方使用 sprite 代替 MovieClip ,尤其在创建自定义的显示组件时。StaticText 和 MorphShapes 一样,不能通过 AS 创建,这是在时间轴上创建的文本对象。TextField,文本对象。Video 对象,播放 flash 视频。6,新的 import 标识AS3 中的 import 标识和 AS2 中有一些不同。 在 AS2 中, import 被用来代理引用类的长名称, 在类中并不是必须的。因此在 AS2中,如果你不使用import,你也可以使用类的长名称来 引用,例如:/ ActionScript 2var myPoint:fla

11、sh.geom.Point = new flash.geom.Point(0,0);在 AS3 中, import 标识是访问类的必须标识。在使用到其他类的时候,也可以使用类的长 名称,但是 import 不能省略掉。例如:/ ActionScript 3import flash.geom.Point;var myPoint:flash.geom.Point = new flash.geom.Point(0,0);和 AS2 一样, import 中可以使用通配符( *)来导入整个包:import flash.geom.*;类型转换和 as 操作符AS 允许在需要的时候,将对象的类型改成另外一

12、种匹配的类型,这就是类型转换。AS2 和AS3都支持通过像“ type(object) ”这样的方式进行类型转换。例如,现定义一个数据类型为Object,你可以通过使用类型名称的语法将这个数据转换成另外一种数据类型。如:var obj:Object = getMyCustomObject();vay customObj:MyClass = MyClass(obj);AS3引入了一种新的操作符“as”来进行类型转换。as操作符代替了类型名称语法来改变对象的数据类型。如:var obj:Object = getMyCustomObject();vay customObj:MyClass = obj

13、 as MyClass;as操作符的工作方式和AS2中的非常类似。如果转换不可能进行,那么转换的返回值是null。AS3 依旧支持通过 type(object) 的方式来转换类型,但是,这种方式和以前有一点细微的不 同。以前转换失败是返回 null ,现在转换失败后将抛出一个类型错误(TypeError )。当尝试转换两种对立的数据类型的时候就会失败。 例如将一个数据类型转换成另外一个不可能通过 联合和继承而得到的类型。注意:AS上的全局转换方法Class(object)的优先级依旧高于type(object)转换方法。这些方法包括 String() , Number() ,和 Array()

14、 等。7,唯一的类变量(本文非直接翻译,原文如下: )In ActionScript 2, variables defined within a class's body were defined in the class's prototype object. This was an efficient means to handle variable definitions but it also meant that complex data types (such as Arrays) had a tendency to be "shared" am

15、ong instances if not explicitly defined for instances within the class constructor. This is no longer a problem with ActionScript 3. Class variables defined in the class body are now unique to each class instance so this problem no longer occurs.在 AS2 中,复杂数据类型(比如数组) ,如果在类体之中,方法之外直接初始化,而不在构 造器中初始化,会被

16、理解为“共享”的数据,而被所有的实例共享使用(类似于static的效果)。但是在 AS3 中不存在这个问题。类变量是每个实例独有的,唯一的变量。如下:class myClassprivate var list:Array = 1,2,3; / 在 AS2 中会有一定问题, AS3 中就很好public function myClass()/在 AS2 中,应该在这里初始化 list8,新的 MouseMove 行为mouseMove 行为在 AS3 中有所改变。以前, mouseMove 动作是一个全局概念,也就是说不 管鼠标在 FlashMovie 的任何一个地方,只要移动了,就会触发任何一

17、个MovieClip 的mouseMove 行为。在AS3中,Mouse对象不再用来分派(dispath)鼠标行为。对于 mouseMove行为来说,你 应该监听一个InteractiveObject的实例,比如 Sprites, MovieClip和Stage。所以,你可能需 要使用 InteractiveObject 来代替 Mouse 接收监听。 对于每一个 InteractiveObject 实例, mouseMove行为只在这个对象的所在范围内执行。如果你要使用全局的mouse事件监听,则需要对stage添加监听。因此,在使用 mouseMove 来拖动一个对象的时候,当你的鼠标离开

18、的脱离对象,对该对象 的 mouseMove 事件就会失效,拖动效果也就同时实效了。这个时候,你可能需要对stage添加 move 行为来进行监听:stage.addEventListener(MouseEvent.MOUSE_MOVE, dragMyObject);10, delete 关键字和类成员delete 关键字在 Flash 中是用来删除定义的变量,但是并不将对象从内存中清除掉(这是垃 圾收集器的工作) 。它只是将一个变量的引用设置成无效,让内存中的这个对象无法再被引 用和使用,也无法再使用 for in 来枚举。事实上,垃圾处理器(GC)将在特定的时候,自动的从内存中删除那些不再

19、被引用和使用的变量。比如,你创建了两个对象引用A和B,都指向了对对象 ObjectX的引用,如果delete 了 A ,并不会让垃圾收集器把 ObjectX 从内存中删除,因为 B 的引用还是指向了这个对象。 如果将A和B都delete,则不再有对 ObjectX的引用,ObjectX也将被垃圾收集器回收。例 如:var a:Object = new Object();var b:Object = a; / b 和 a 引用同一个 new Object。; delete a;trace(b); / 输出 object Object - 在内存中还是存在delete b;/ GC 将回收 obj

20、ect这个特性在Flash8和9( AS123)中几乎都是一样的,但是在 Flash8中,GC的一些特性得 到改善并能更好的工作。 (注意,垃圾收集不是即时的)虽然GC在AS3中并没有什么本质上的改变, 但是因为使用了新的虚拟机,delete关键字的行为有所改变。 现在, delete 关键字只能针对类的动态属性和非公有成员有效。 而在 AS1 和 2 中, delete 能被用在所有的东西上。/ ActionScript 2class DeleteVarClass public var myVar:Number;function DeleteVarClass() myVar = 1;trac

21、e(myVar); / 1delete myVar; trace(myVar); / undefined/ ActionScript 3 package public class DeleteVarClass public var myVar:Number;public function DeleteVarClass() myVar = 1; trace(myVar); / 1 delete myVar; trace(myVar); / 1在上面的AS3例子中,因为 myVar变量是一个公有成员,所以不能用 delete来删除这个变 量。尽管在 AS3 中不能删除类成员,但是如果你想删除一个对

22、象的所有引用,可以通过将变量设置为null来代替delete。如:myVar = null;如果一个对象的所有引用都是null,GC将自动的从内存中删除这个对象。11 , Dictionary 类AS3 中的 Dictionary 类( flash.utils.Dictionary )是一个新的 AS 类。 Dictionary 类和 Object 唯 一的区别在于: Dictionary 对象可以使用非字符串作为键值对的键。例如:var obj:Object = new Object(); obj"name" = 1; / 键是字符串 "name" o

23、bj1 = 2; / 键是 1 (被转换成字符串 "1")objnew Object() = 3; / 键是 new Object() ,被转传成字符串 "object Object" for (var prop:String in obj) trace(prop); / 输出: object Object, 1, name trace(objprop); / 输出: 3, 2, 1也就是说, 无论用什么类型的变量作为键,都将被转换成字符串。 同时,如果你使用了不同 的对象作为键,都会北转换成字符串 "object Object" 作

24、为键,因此而指向了同一个数据。例 如:ActionScript Code: var a:Object = new Object(); var b:Object = new Object(); var obj:Object = new Object();obja = 1; / obj"object Object" = 1;objb = 2; / obj"object Object" = 2; for (var prop:String in obj) trace(prop); / traces: object Object trace(objprop); /

25、 traces: 2Dictionary 类将没有这个限制,你可以将键设置成任何一种数据类型。例如: import flash.utils.Dictionary;var a:Object = new Object();var b:Object = new Object();var dict:Dictionary = new Dictionary();dicta = 1; / dicta = 1;dictb = 2; / dictb = 2;for (var prop:* in dict) trace(prop); / traces: object Object, object Object t

26、race(dictprop); / traces: 1, 2虽然在 trace 的时候,输出的还是 object Object ,但是这个结果是对象的 toString 的结果。 在 Dictionary 对象中,代表的是不同的对象引用。注意,这里的 prop 的类型是 * 。这是很重要的, 因为 dict 对象中的键可能是任何数据类型的。 12,标签申明在 AS3 中引入了标签,新的标签可以和循环体一起使用。例如,现在有两个嵌套的循环体, 如果想要在内循环体中 break 掉外循环,一般使用下面的方法:var i:Number;var j:Number;var exit:Boolean =

27、false; for (i=0; i<10; i+) for (j=0; j<10; j+) if (i > 3 && j > 3) exit = true; break; if (exit) break; 在引入了新的标签以后,可以使用下面的方法从内循环体中直接break 掉外循环体:var i:Number;var j:Number; mainLoop: for (i=0; i<10; i+) for (j=0; j<10; j+) if (i > 3 && j > 3) break mainLoop;在第一个

28、循环体上设置了 mainLoop 的标签,因此在循环体内任何地方使用 break mainLoop 直接中止外循环。13,检测鼠标离开 Movie 的动作在以前的 AS 版本中,你无法做到检测鼠标是否还在 Flash Movie 上。因此影片不能检测到 用户是否在关注着当前的 Movie 。另外一个问题是,如果使用了自定义的鼠标样式,在鼠标 移出 Movie 后,自定义的鼠标还是继续停留在影片上,而不能正确的显示鼠标当前的位置。 现在, AS3 允许你通过监听 stage 的 mouseLeave 行为来捕获鼠标移出 Movie 的动作。 mouseLeave 行为在鼠标移出 Movie 的时

29、候执行。但是现在并没有 mouseEnter 事件,不过你 可以通过使用 mouseMove 来设置。下面的例子中使用了一个方框来作为自定义的鼠标: package import flash.display.Sprite;import flash.events.Event;import flash.events.MouseEvent;import flash.ui.Mouse;public class Test extends Sprite private var cursor:Sprite = new Sprite(); public function Test() cursor.graph

30、ics.beginFill(0xFF); cursor.graphics.drawRect(0, 0, 25, 25); addChild(cursor);stage.addEventListener(Event.MOUSE_LEAVE, cursorHide); stage.addEventListener(MouseEvent.MOUSE_MOVE, cursorFollow); Mouse.hide();public function cursorHide(evt:Event):void cursor.visible = false;public function cursorFollo

31、w(evt:MouseEvent):void if (!cursor.visible) cursor.visible = true;cursor.x = stage.mouseX;cursor.y = stage.mouseY; evt.updateAfterEvent();当鼠标离开 Movie 的时候,鼠标指针将被隐藏。当鼠标再次移动到 Movie 上的时候, mouseMove 会被执行,然后显示鼠标。14, SimpleButton 实例AS3 现在有一个新的类: SimpleButton ( flash.display.SimpleButton )。这个类允许你通过 AS 创建一个按

32、钮。var myButton:SimpleButton = new SimpleButton();SimpleButton 类有 4 个属性分别代表按钮的四个不同状态:upState,overState, downState和 hitAreaState 。你可以为每一个状态创建一个新的显示对象,然后将显示对象赋予SimpleButton 的各种状态: myButton.upState = mySprite1;myButton.overState = mySprite2; myButton.downState = mySprite3;myButton.hitAreaState = mySprit

33、e4; 15,数组定义中的逗号 本文非直接翻译,原文解释部分如下:When defining arrays in ActionScript 3 using the shorthand array access operator (brackets), you can now have a trailing comma following the last element without causing an error (like in PHP). This makes working with multi-line array definitions a little less error-

34、prone when rearranging elements.先来看一个例子: var myList:Array = "The","quick","brown","fox",;在 AS1 和 2 中, "fox" 后的逗号会导致一个编译错误,但是在 AS3 中不会了。注意,这个逗号只是在使用定义数组的时候有效,使用Array()或new Array()的时候是无效的。16,包块AS3中的包定义方式和 AS2中有所不同。在 AS3中,包路径不再是类定义的一部分,而是使用一个包块来包含类。定义包块

35、使用的是 package 标签,如下:package my.package.path class MyClass 而在 AS2 中,应该是下面的样式:/ ActionScript 2:class my.package.path.MyClass 实际上,在 AS3 中,所有的类都必须定义在包里面,如果一个类不属于任何一个包,也需 要使用空的包路径来定义:package class NotInAPackageClass 每一个包块可以将一些有关联的类或者方法包含在一个文件里面。 文件中包块里的类或方法 必须使用和文件名相同的名称:package com.kirupa.utils function

36、StripString(str:String):void / .上面的代码应该保存在一个名称为 StripString.as 的文件中,并放在路径为 com/kirupa/utils 的文件夹里。17,一个文件中的多个类一般来说,一个.as文件中就一个类,但是在 AS3中,现在允许在一个文件中定义多个类用 来辅助主类。在.as文件中的辅助类,必须定义在类包以外,并且只针对此文件中的主类和其他辅助类可见。例如:package class MyClass function MyClass() var helper:MyHelper = new MyHelper();class MyHelper f

37、unction MyHelper() var helper:HelpersHelper = new HelpersHelper();class HelpersHelper function HelpersHelper () 注意, 在包块中最多只能定义一个类。 在同一个文件中的辅助类不是包块的一部分, 并且只 能在此文件中可见和被使用。18,访问属性AS3 为类和类成员引入了两个新的访问属性来扩展 AS2 中的 private 访问属性。在 AS3 中, 现在有下面的访问控制属性:publicprotectedprivate internal (默认 )public :public 属性和 A

38、S2 中一样。在任何地方定义的 public 属性,能在任何地方和被任何 成员引用。构造器必须定义成 public 。应用程序类必须是 public 的。protected:protected 是一个新的属性。 被 protected 指定的成员, 只能被其本身或其子类访问。 如果外部类尝试访问被 protected 的成员,将会抛出编译错误。类和构造器不能被声明为 protected。private :AS2 中已经有 private 属性,但是在 AS2 中,子类成员可以任意的访问父类的 private 成员。现在在 AS3 中, private 属性只能在类内部被访问,其他类包括子类都不

39、能直接访问 此成员。 也就是说, 在子类中可以定义一个名称和父类某成员名称一样的成员, 只要父类的 此成员是声明为 private 的。类和构造器不能被定义为 private 。internal :internal 和 public 比较类似,不同的地方在于类成员只能被同一个包中的成员所访 问,而其他包中的成员不能访问。internal 是除了构造器以外的所有类和类成员的默认声明。 辅助类的访问控制有所不同。由于辅助类不属于任何包, internal 的声明将限制其被访问只 能是当前文件之内。 注意:主类不能继承辅助类, 只有辅助类能继承辅助类,并且要在同一 个文件内。访问控制的错误,并不仅仅

40、是编译时错误,有时候也是运行时错误,在 AS2 中用来访问隐 藏方法的方式,在 AS3 中不能用了,如:package import flash.display.Sprite;/ 应用类必须定义成 public ( 默认是 internal)public class AccessControl extends Sprite / 构造器总是 public 的function AccessControl() / 只有在这个文件中才能访问辅助类var helper:Helper = new Helper(); trace(helper.pubNum); / OK/ trace(helper.prot

41、Num); / Error - 错误,不能访问 protected 成员/ trace(helper.privNum); / Error - 错误,不能访问 private 成员 trace(helper.interNum); / OK/ 辅助类默认是 internal class Helper / public 声明允许在任何地方被访问/ 变量通常被设置为 private 的,然后通过声明 public 的 get set 方法来访问 public var pubNum:Number = 1;/ protected 声明只允许在子类中被访问 protected var protNum:Num

42、ber = 2;/ private 声明只能在类内部被访问private var privNum:Number = 3;/ internal 声明只允许在同一个包中被访问/ 但是对于辅助类来说,只能在同一个文件类被访问 internal var interNum:Number = 4;/ 构造器永远都是 public 的 function Helper() / 子辅助类默认是 internal 的/ 可以继承其他辅助类class SubHelper extends Helper / 构造器, public function SubHelper() trace(pubNum); / OK tra

43、ce(protNum); / OK - 继承得到的 / trace(privNum); / Error - 不能访问 private trace(interNum); / OK 另外一个例子: package import flash.display.Sprite;import containers.*;/ Application class needs to be public (internal by default)public class AccessControl extends Sprite / constructors are always publicfunction Acce

44、ssControl() / can access classes in other packages/ only if publicvar bowl:Bowl = new Bowl(); / OK/ var basket:Basket = new Basket(); / Error - cannot access internal trace(bowl.pubNum); / OK/ trace(bowl.protNum); / Error - cannot access protected/ trace(bowl.privNum); / Error - cannot access privat

45、e/ trace(bowl.interNum); / Error - cannot access internalActionScript Code: package containers / public class accessible anywherepublic class Bowl / public access granted anywherepublic var pubNum:Number = 1;/ protected access granted only for/ subclasses in that class protected var protNum:Number =

46、 2;/ private access granted only in this class private var privNum:Number = 3;/ internal access granted only in the same package internal var interNum:Number = 4;/ constructors are always publicfunction Bowl() / can access inteneral classes if in same package var basket:Basket = new Basket();trace(b

47、asket.pubNum); / OK/ trace(basket.protNum); / Error - cannot access protected/ trace(basket.privNum); / Error - cannot access private trace(basket.interNum); / OK - same package/ clone using public methodvar basketCopy:Basket = basket.clone();ActionScript Code: package containers / interal only accessible/ from other classes in package internal class Basket / public access granted anywherepublic var pubNum:Numbe

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1