跳到主要內容

stage與AddedToStage

無法取存 null 的參考屬性或方法
這大概是 AS3 最常出現的 error
最容易發生在 stage 的屬性使用
所有的 DisplayObject 物件都有
parent(上一層的容器)
root(該swf的最上一層容器)
stage(唯一的 Stage 類別)
但這三個屬性一開始都是 null
一定要當該可視物件被加入到清單裡, 屬性才會有值
var _mc:MovieClip = new MovieClip();
_mc.parent;
_mc.root;
_mc.stage;
//通通都是 null

var _spr:Sprite = new Sprite();
_spr.addChild(_mc);
_mc.parent; //可以得到 _spr物件, 因為被加入了
//但root和stage還是null

//this是主時間軸
this.addChild(_spr);
//這時_mc.root, _mc.stage才會有值。
而在寫 Class 時也一樣
package  {  
import flash.display.Sprite; 
import flash.events.Event;
public class Main extends Sprite {    
public function Main()  {   
trace(stage);
//如果直接執行該swf, stage是有值的
//但如果是被載入, stage一開始是null
//要避免這樣的問題, 就直接偵聽 AddedToStage 事件即可   
if (stage) init(null);
else addEventListener(Event.ADDED_TO_STAGE , init);
}    
private function init(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
//把要做的事寫在這兒
//這樣就可以確保 stage 屬性一定有值
}
} 
}

留言

Gino寫道…
原來如此~~很實用喔!
高見龍寫道…
這就不得不提一下FlashDevelop了,它在建立好一個空的AS3 project的時候,就會自動幫忙建好奶綠大說的這段東西,真的是威力強大又貼心的AS編輯器 :)
milkmidi寫道…
真的, 我也是最近才發現這個功能
FlashDevelop推