Entries

AS3 で stageを参照する場合の注意点

今日ずっと苦戦してました

・stageの参照は、myDisplayObject.stage プロパティから
・addChildする前に参照するとnull
・removeChildした後に参照するとnull

removeChildした後に、そのdisplayObjectからresizeイベントとかremoveしようとするとエラー
リスナ系はウィークリファレンスを用いて対処するか、直接removeしないでkill()のような関数でイベントを殺すのとremoveをセットにする。

ルートのコンストラクタ生成タイミングでstageを参照しているswfを外部からロードするとnullでエラー
ドキュメントクラスで

if( this.stage!=null ){
init()
}

のように書き、外部でロードする場合は、Event.COMPLETEを確認後に外からinitを呼ぶようにすると、単独でもロードされた場合も動作する。

・っていうかaddChildしたDisplayObjectからしか参照できないのは不便
StageReferenceクラスのようなものを作って対処する

public class StageReference{
public static var stage:Stage

public static function get stageWidth():Number{
return (stage!=null)? stage.stageWidth : DEFAULT_STAGE_WIDTH
}

public static function get stageHeight():Number{
return (stage!=null)? stage.stageHeight : DEFAULT_STAGE_HEIGHT
}
}

で、ドキュメントのコンストラクタでこのクラスにStageの参照を渡してやれば、以後全てのクラスはaddChildしたか否かにかかわらずstageの参照をチェックできる。個々のDisplayObjectがリサイズ追随にstageを参照すると事故死する可能性が高いのでできるだけ、直接stageを参照しない。
getter経由で値をとって、stageが参照できない場合はディフォ値を返すようにすると安全。