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が参照できない場合はディフォ値を返すようにすると安全。
2008 年 12 月 24 日 9:14 AM
[...] 参考1:AS3 で stageを参照する場合の注意点: 参考2:ステージの参照とシングルトン #1 [...]
2009 年 8 月 15 日 12:09 PM
[...] #1 http://www.scratchbrain.net/mt/mt-tb.cgi/359 AS3 で stageを参照する場合の注意点 http://fladdict.net/blog/2007/02/as3_stage.html [...]