tips of the Day(as3.0 Do...)

1. 动态改变帧频: 
 // change frame rate to 12 fps:
 stage.frameRate = 12;

2. Abstract Classes
as3不支持抽象类,但是有几个内置的抽象类
DisplayObject
InteractiveObject
DisplayObjectContainer
Graphics

as3中这意味着不能实例化这些类,也不能继承他们 ,以下为错误操作:

// 错误1
var myObj:InteractiveObject = new InteractiveObject(); // ERROR

// 错误2
package {
 import flash.display.DisplayObject;
 public class MyDisplay extends DisplayObject{
 public function MyDisplay (){
 // ERROR
 }
 }
}

3. Deep Object Copies with ByteArray

as3中很容易使用(flash.utils.ByteArray)类来进行对象的深拷贝,深拷贝不只拷贝引用,而是拷贝整个相关对象,

例如一个array里包含一个object引用,这个object也将被拷贝

注意:这个方法通常用来拷贝一般的object

拷贝函数:

function clone(source:Object):* {
 var copier:ByteArray = new ByteArray();
 copier.writeObject(source);
 copier.position = 0;
 return(copier.readObject());
}

使用方法:
newObjectCopy = clone(originalObject);



4. Determine Instance Class or Superclass

as3中可以很容易的获取某个实例所属的类和父类的类名,使用这两个方法

getQualifiedClassName (flash.utils.getQualifiedClassName).
getQualifiedSuperclassName (flash.utils.getQualifiedSuperclassName)
var sprite:Sprite = new Sprite();
trace(getQualifiedClassName(sprite)); // "flash.display::Sprite
trace(getQualifiedSuperclassName(sprite)); // "flash.display::DisplayObjectContainer"

你甚至可以由字符串获得类的引用,使用这个方法

getDefinitionByName (flash.utils.getDefinitionByName).
getDefinitionByName("flash.display::Sprite")); // [class Sprite]

5. Multiple Arguments in trace()

as3
trace(value1, value2, value3);
as1,as2
trace([value1, value2, value3]);


6. Loading Text and XML with URLLoader

var loader:URLLoader;
// ...
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, xmlLoaded);

var request:URLRequest = new URLRequest("file.xml");
loader.load(request);
//...
function xmlLoaded(event:Event):void {
 var myXML:XML = new XML(loader.data);
 //...
}

7.Get Sound Spectrum Information

(flash.media.SoundMixer)类的computeSpectrum静态方法可以把正在播放的声谱信息转成ByteArray,由此你可以想到办法把声谱可视化显示出来

// play sound...
var spectrumInfo:ByteArray = new ByteArray();
SoundMixer.computeSpectrum(spectrumInfo);
// spectrumInfo is now a byte array with sound spectrum info

8. Garbage Collection: Reference Counting & Mark and Sweep

垃圾回收机制包含两个关键:

(1)Reference Counting (引用数) :

引用数就是在内存中引用同一个object的变量多少,每增加一个变量引用该object,引用数就+1
var a:Object = new Object(); // new Object in memory given reference count of 1
var b:Object = a; // Object now has reference count of 2
无论什么时候,当没有变量引用该object的时候,垃圾回收就会把他们回收了
delete a; // Object has reference count of 1
delete b; // Object has reference count of 0, removed from memory
注意delete只能删除非成员变量,而且删除的是引用该object的变量而不是将object从内存中删除,那是垃圾回收器要做的事
看下边这种情况:
var a:Object = new Object(); // reference(a) count 1
var b:Object = new Object(); // reference(b) count 1
a.b = b; // reference(b) count 2
b.a = a; // reference(a) count 2
delete a; // reference(a) count 1
delete b; // reference(b) count 1
虽然a和b变量被删除了,而且我们再也不能用程序访问到他们了,但他们仍然存留在内存中~这种情况下垃圾回首器就没有办法了吗?错!这是记号清理要做的!

(2)Mark and Sweep (记号清理):

Mark and Sweep简单来说就是一种扫描机制,如下图,从root开始,扫到对象就mark一下,并扫描这个对象,等待全扫描完了,没有mark的自然是没有用的了,就会被从内存中删掉了.
[root] <- scan...
[objectRef (marked)] <- scan...
[objectRef (marked)] <- scan...
[objectRef (marked)] <- scan...
[objectRef (marked)] <- scan...
[objectRef (marked)] <- scan...
...
[delete all objects not marked]
当然这种扫描是昂贵的,需要很长时间才能发生一次,所以不要指望他了,编程的时候多注意引用数就可以了

9. Weak References

使用弱引用来引用对象,不会被垃圾回收器视为有效的引用数。这样可以帮助垃圾回收器的工作
所以使用弱引用这是一种比较好的编程习惯,使你不会在不经意间错误的引用到了某个object导致这个object不能被从内存中卸载~~~
但不是哪里都可以使用弱引用的,as3中有两处可以使用:
(1)在Directionary类的构造函数中传入true
var dict:Dictionary = new Dictionary(true); // use weak references as keys
var obj:Object = new Object();
dict[obj] = true;
delete obj; // 虽然dict中有引用到obj,但并不是一个有效引用,所以obj仍然会被垃圾回收

(2)在EventDispatcher的addEventListener 的第5个参数指定true
// addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
addEventListener(MouseEvent.CLICK, clickHandler, false, 0 true); // use weak references

10. MXMLC: SWF Metadata Tag

如果你用mxmlc编译swf的话,可以使用swf metadata tag来指定swf的一些属性

支持以下属性:

width
height
frameRate
backgroundColor

例子:

package {
 [SWF(width="500", height="450", frameRate="24", backgroundColor="#FFFFFF")]
 public class MyApp extends Sprite {

 }
}

11.TextField.appendText()

(flash.text.TextField)类多了一个appendText()方法

var my_tf = new TextField();
my_tf.text = "Hello";
my_tf.appendText(" world!"); // my_tf.text == "Hello world!"

相当于以前的my_tf.text+=" world!" ,只是效率提高了

12. Access to stage and root

* 在as3中,当swf被loaded到player中时 stage object 是最顶端的容器,所有其他东西都在它里边,包括root在内

* 一个application中只有一个stage,却可以有若干个 root ,比如有外部内容被Loader类加载近来的时候

* 所有的DisplayObject (flash.display.DisplayObject)都有 stage 和 root 属性,但只有当他们被直接或间接的加入到display list 中的时候才有值,否则他们都为 null 。

* stage 属性 如果有值,那么他一直指向 stage 对象 , root 却不同 ,具体哪不同,下边懒得翻引用原话 - -b

技巧1: 写一个TopLevel类,让Document类继承它,通过TopLevel类访问stage
 package {
 
 import flash.display.DisplayObject;
 import flash.display.MovieClip;
 import flash.display.Stage;
 
 public class TopLevel extends MovieClip {
 
 public static var stage:Stage;
 public static var root:DisplayObject;
 
 public function TopLevel() {
 TopLevel.stage = this.stage;
 TopLevel.root = this;
 }
 }
}
package {
 
 public class MyDocumentClass extends TopLevel {
 
 public function MyDocumentClass() {
 // code
 }
 }
}
package {
 
 public class RandomClass {
 
 public function RandomClass() {
 trace(TopLevel.stage); // [object Stage]
 }
 }
}

当然这很不oo也很不雅观~~~如果别人的Document类没继承TopLevel类就会有问题出现

技巧2 : 传递引用

类似这样通过构造函数将stage传进去

package {
 
 import flash.display.Stage;

 public class CustomObject {
 
 private var stage:Stage;
 
 public function CustomObject(stageRef:Stage) {
 
 // stage access through
 // constructor argument
 stage = stageRef;
 }
 }
}

作者给了一个 StageDetection 类
地址:http://www.senocular.com/flash/actionscript.php?file=ActionScript_3.0/com/senocular/events/StageDetection.as

好象是用于检测某个display object 的 stage 或 root 属性是否存在,然后才能把stage的引用传给非display object

13. No More Color Class; Use ColorTransform

as3 中彻底没了flash8就不推荐使用了的 Color类 改用 ColorTransform类

注意ColorTransform 的rgb属性已经改名为color

// creates a red square
var square:Shape = new Shape();
square.graphics.beginFill(0x000000);
square.graphics.drawRect(0, 0, 100, 100);

var colorTransform:ColorTransform = square.transform.colorTransform;
colorTransform.color = 0xFF0000;
square.transform.colorTransform = colorTransform;

addChild(square);

14. Array.indexOf (Array.lastIndexOf())

Array类多了两个方法 indexOf 和 lastIndexOf

AS3 function indexOf(searchElement:*, fromIndex:int = 0):int
AS3 function lastIndexOf(searchElement:*, fromIndex:int = 0x7fffffff):int

跟String类的同名方法差不多 ,返回指定元素位置,如果没有返回 -1

var sprite:Sprite = new Sprite();
var object:Object = new Object();
var boolean:Boolean = true;
var number:Number = 10;

var array:Array = new Array(sprite, object, number);
trace(array.indexOf(sprite)); // 0
trace(array.indexOf(number)); // 2
trace(array.indexOf(boolean)); // -1

15. System.totalMemory

System 类 (flash.system.System) 有一个新属性叫做 totalMemory,返回当前flash player占用的内存

var o:Object = new Object();
trace(System.totalMemory); // 4960256
var o:MovieClip = new MovieClip();
trace(System.totalMemory); // 4964352

16. Closing Net Connections

as1,2时候,当loading开始后,你就不能关闭这个连接了,在as3世界里,即使loading开始了,你也可以停止它

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("image.jpg");
loader.load(request);
addChild(loader);

// 如果3秒钟还没loading完,就关闭连接
var abortID:uint = setTimeout(abortLoader, 3000);

// abort the abort when loaded
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, abortAbort);

function abortLoader(){
 try {
 loader.close();
 }catch(error:Error) {} //注意这里有可能抛出IOError
}
function abortAbort(event:Event){
 clearTimeout(abortID);
}

17. AVM2 (AS3) to AVM1 (AS2/AS1) Communication via LocalConnection

由于as3与as1,2虚拟机的不同导致as1,2 与as3不能直接沟通,如果需要的话必须要间接的使用

LocalConnection AS2
http://livedocs.macromedia.com/flash/8/main/00002338.html

LocalConnection AS3 (flash.net.LocalConnection)
http://livedocs.macromedia.com/flex/2/langref/flash/net/LocalConnection.html

在as2中
// ActionScript 2 file, AS2animation.fla
// one movie clip animation named animation_mc on the timeline

// local connection instance to receive events
var AVM_lc:LocalConnection = new LocalConnection();

// stopAnimation event handler
AVM_lc.stopAnimation = function(){
 animation_mc.stop();
}

// listen for events for "AVM2toAVM1"
AVM_lc.connect("AVM2toAVM1");

as3中

// ActionScript 3 file, AS3Loader.fla

// local connection instance to communicate to AVM1 movie
var AVM_lc:LocalConnection = new LocalConnection();

// loader loads AVM1 movie
var loader:Loader = new Loader();
loader.load(new URLRequest("AS2animation.swf"));
addChild(loader);

// when AVM1 movie is clicked, call stopPlayback
loader.addEventListener(MouseEvent.CLICK, stopPlayback);

function stopPlayback(event:MouseEvent):void {
 // send stopAnimation event to "AVM2toAVM1" connection
 AVM_lc.send("AVM2toAVM1", "stopAnimation");
}

as3 movie把as2的movie加载进来然后调用as2的stopAnimation


 

18. Class member enumeration

as3中只有dynamic class 中的dynamic definitions才可以被枚举(就是for in ),例如下边的class就没有可枚举的成员

package {
 
 public class EnumerateClass {
 
 public var variable:String = "value";
 public function method():void {}
 }
}
var example:EnumerateClass = new EnumerateClass();
for (var key:String in example) {
 trace(key + ": " + example[key]); // 没有输出
}

即使上边的class改成dynamic的,也是没有输出,为什么呢?

因为里边的变量和方法是他们自己的,而并不是动态(dynamic)填加的,只有动态填加的属性可以被for in

Object类有个 setPropertyIsEnumerable方法,可以控制某个属性是否可枚举,但它只对dynamic属性有效

package {
 
 public dynamic class EnumerateClass {
 
 public var variable:String = "value";
 public function method():void {}
 
 public function EnumerateClass(){
 this.dynamicVar = 1;
 this.dynamicVar2 = 2;
 this.setPropertyIsEnumerable("dynamicVar2", false);
 }
 }
}

上边的dynamic类有两个dynamic属性, dynamicVar 和 dynamicVar2 ,满足条件,都应该是可枚举的

但调用 setPropertyIsEnumerable("dynamicVar2", false);阻止了枚举 dynamicVar2

var example:EnumerateClass = new EnumerateClass();
for (var key:String in example) {
 trace(key + ": " + example[key]); // dynamicVar: 1
}

propertyIsEnumerable方法可以测试某一属性是否可枚举

trace(example.propertyIsEnumerable("variable")); // false
trace(example.propertyIsEnumerable("dynamicVar")); // true
trace(example.propertyIsEnumerable("dynamicVar2")); // false

19. Key.isDown in AS3

在as1,2时代,尤其是游戏中经常会用到 Key.isDown ,但到了as3,Key类已经不存在了,但我们可以通过些技巧实现这个类

 
package {
 
 import flash.display.Stage;
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 public class Key { 
     private static var initialized:Boolean = false; // marks whether or not the class has been initialized
     private static var keysDown:Object = new Object(); // stores key codes of all keys pressed
     public static function initialize(stage:Stage) {
     if (!initialized) {
     // assign listeners for key presses and deactivation of the player
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
     stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
     stage.addEventListener(Event.DEACTIVATE, clearKeys);
     initialized = true;
     }
 }
 public static function isDown(keyCode:uint):Boolean {
     if (!initialized) {
     // throw an error if isDown is used
     // prior to Key class initialization
     throw new Error("Key class has yet been initialized.");
 }
     return Boolean(keyCode in keysDown);
 }
 private static function keyPressed(event:KeyboardEvent):void {
      keysDown[event.keyCode] = true;
 }

private static function keyReleased(event:KeyboardEvent):void {
 if (event.keyCode in keysDown) {
     // delete the property in keysDown if it exists
     delete keysDown[event.keyCode];
     }
 }
private static function clearKeys(event:Event):void {
     // clear all keys in keysDown since the player cannot
     // detect keys being pressed or released when not focused
     keysDown = new Object();
     }
   }
}

 

20.Scale and Alpha Ranges

值得注意一下的是,as3中好多属性值的范围变化了,有些值原来范围是0 到 100 ,现在变成了0 到 1 ,例如下边几个,要留心一下

ActionScript 2.0 | ActionScript 3.0
_xscale: 0 - 100 | scaleX: 0 - 1
_yscale: 0 - 100 | scaleY: 0 - 1
_alpha: 0 - 100 | alpha: 0 - 1

21. Available ActionScript packages

AS3 package 概要

* flash 包 (player的核心类包,永远可用)
* mx 包 (flex 专用类包,flex 的组件们需要)
* fl 包 (flash 专用类包,flash组件等)
* adobe 包 (flash 专用类包,绘图工具扩展等)

更多详细包内容,看文档

Flex: http://livedocs.adobe.com/flex/201/langref/
Flash: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/
Apollo: http://livedocs.adobe.com/apollo/1.0/aslr/

注意: Apollo相关的类在 flash和mx包里

22. Numeric Calculations: Number vs. int Speed

比较Number类型和新出现的int类型速度

*只有在用到 bitwise operations (<<, >>, &, ^, and |) 的时候 int 类型比较快,例如

var valueN:Number = 10;
result = valueN << 2; // not so fast

var valueI:int = 10;
reesult = valueI << 2; // Fast!

*其他情况下声明为Number比较快

23. Getting Around globally accessible _root and _global

as1 ,2中任何地方都能访问到_root ,_global ,这样可以很简单的保存变量或函数到这里,但在as3中已经没有_global了,root 也只有Disobject在显示列表里时才会得到,如果你非要这么做的话,应该自己写一个glo类,里边用一个静态变量bal指向一个Object,下边是代码

package {
 public class glo {
 public static var bal:Object = new Object();
 }
}

现在可以把 gol.bal 当成以前的_root或_global用了

trace(glo.bal.foo); // undefined
glo.bal.foo = "bar";
trace(glo.bal.foo); // bar


24. ActionScript 2 to ActionScript 3 Converter

Patrick Mineault(http://www.5etdemi.com/blog/) 用php写了一个as2 -->as3 转换器,不是百分之百准确但也不错

online 版本 :http://www.5etdemi.com/convert

下载 :http://www.5etdemi.com/convert/convert.zip

25. Accessing FlashVars and HTML Parameters

你可以用HTML中的 object/embed 代码向镶入的SWF传递变量。

有两种方法:

1。在swf的url后边加变量(query string)

<!-- URL Variables -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="640" height="500" align="center">
  <param name="allowScriptAccess" value="sameDomain" />
  <param name="movie" value="flashMovie.swf?myVar=1" />
  <param name="quality" value="high" />
  <param name="bgcolor" value="#EFF7F6" />
  <embed src="flashMovie.swf?myVar=1" quality="high" bgcolor="#EFF7F6" width="640" height="500" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

2.使用FlashVars

<!-- FlashVars -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="550" height="400" align="center">
  <param name="allowScriptAccess" value="sameDomain" />
  <param name="movie" value="flashMovie.swf" />
  <param name="quality" value="high" />
  <param name="bgcolor" value="#FFFFFF" />
  <param name="FlashVars" value="myVar=1" /> 
  <embed src="flashMovie.swf" FlashVars="myVar=1" quality="high" bgcolor="#FFFFFF" width="550" height="400" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

在as2中这些变量会被简单的声明到_root上,但在as3中有所改变。现在这些变量被放到了root下的parameters对象下,上边HTML传的值可以这样访问:

root.loaderInfo.parameters.myVar;

ActionScript Speed Through Typing

One of the reasons ActionScript 3 is so fast is that it now supports runtime type annotations (typing) that allows values to be stored as native machine types allowing for best performance and usage of memory.

When possible, always appropriately type your variables

Similarly, sealed (non-dynamic) classes provide a fixed set of properties and improves memory usage by not requiring an internal hash table for each object instance resulting in improved performance.

When possible, avoid dynamic classes

By using sealed classes with appropriately typed variables, you will be able to maximize the performance of your flash application.


Go on.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值