Progressionではまったところ

  • 2008 年 12月 4 日
  • kosuke

Progressionを使っていて気づいたところが出てきたので記録。
Progrssionのドキュメントクラスを使ったSWFを子ファイルとしてloadして、unloadした時、内部で管理しているstageの参照が削除されるようなのですが、これのせいで前回のRESIZEまわりの拡張が動かなくなるっぽい。


Progressionが提供するドキュメントクラスは、CastDocumentもCastPreloaderもExDocumentを継承しているのだけれど、このExDocumentを見てみたらステージ上の表示リストに追加された時(Event.ADDED_TO_STAGEの時)、_addedToStageが実行されて_stageってstaticな変数にstageの参照を格納しています。
以下のところ。

private function _addedToStage( e:Event ):void {
	// stage の参照を保存する
	_stage = stage;
 
	// 初期化する
	stageWidth = _stageWidth;
	stageHeight = _stageHeight;
	align = _align;
	displayState = _displayState;
	quality = _quality;
	scaleMode = _scaleMode;
 
	// stage への設置を完了する
	_addedToStaged = true;
 
	_initialize();
}

で、内部的にはこの_stageに対して処理をしていると思うのですが、(stageもgetterになってて、この_stageを参照している)、表示リストから削除した時、以下の_removedFromStageが実行されて、_stageが空になります。

private function _removedFromStage( e:Event ):void {
	// stage の参照を削除する
	_stage = null;
}

これがまずいようで、ExDocumentを継承したドキュメントクラスを持つ、SWFを何ファイルか使って、そのSWFを読み込み、表示リストから削除したり、unloadしたりすると、_stageの参照が空なる。この_stageを他のSWFも参照しているので、_stageが空になった時、動かなくなるものが出てくるみたいです。
ExDocumentをドキュメントクラスに持つ複数のSWFをloadして、そのうち一つをunloadした時、動かなくなって気づきました。
前回のRESIZE関連のリスナーがエラーになるみたい。
_initializeと_resizeProgressで設定している、

_stage.addEventListener( Event.RESIZE, _resizeStart, false, int.MAX_VALUE, true );

がエラーになりました。

対策としては、

private function _removedFromStage( e:Event ):void {
	// stage の参照を削除する
	_stage.removeEventListener( Event.RESIZE, _resizeStart );
	//_stage = null;
}

と、_stageの空を削除したところ(一応_stageのリスナーも明示的に削除しています。)一応これで問題は解決した。これでいい……のかな??

“Progressionではまったところ” に 3 件のコメント

  1. Gravatar Icon kampei より:

    Progression始めたばかりで同じ現象につまずきました。
    メチャクチャ助かりました!ありがとうございます。
    これバグなんですかね??

  2. Gravatar Icon kosuke より:

    kampeiさん。コメントありがとうございます。
    CastDocumentまわりの拡張がされないのですが、読み込まれる側のドキュメントクラスをCastMovieClipかCastSpriteにしてもこの現象を回避できると思います。バグかどうか…。うーん、意図あっての設計かもしれないです。慣れるまではいろいろつまづきますよね。

  3. Gravatar Icon kampei より:

    なるほどー。
    とりあえずドキュメントクラスはCastSpriteで事足りそうなので、こちらでやってみます。
    Progression、慣れてしまえば随分便利になりそうなので、引き続きがんばってみます。
    ありがとうございました!

  4. コメントをどうぞ