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が参照できない場合はディフォ値を返すようにすると安全。

コメント / トラックバック 3 件

  1. memo» ブログアーカイブ » [AS]stageプロパティについて(取得する際の注意) より:

    [...] 参考1:AS3 で stageを参照する場合の注意点: 参考2:ステージの参照とシングルトン #1 [...]

  2. AS3でのstage参照 | SELFLASH Design より:

    [...] #1 http://www.scratchbrain.net/mt/mt-tb.cgi/359 AS3 で stageを参照する場合の注意点 http://fladdict.net/blog/2007/02/as3_stage.html [...]

  3. sinketu.com » Event.ADDED_TO_STAGEを使う理由 より:

    [...] 参考 fladdict blend AS3 で stageを参照する場合の注意点 Categories: ActionScript Tags:  Comments (0) Trackbacks (0) Leave a comment Trackback [...]

コメントをどうぞ