はじめに

Progressionで意図しないタイミングでmanagerがnullになります。
基礎中の基礎みたいなレベルなので、僕の組み方が悪いはずなのですが、どこが悪いのか見つけられません。
ということで賢い人誰か教えてくれたらいいなエントリ。

ちなみに環境はこんなもんです。Progressionのバージョン以外あんまり関係ないと思いますけど。

  • Adobe Flash CS4
  • FlashPlayer10
  • Progression4.0.1

サンプル

サンプルを開く
traceがわりにTextFieldに出力しています。
2度目の”[ ChildPage1 ] atCastAdded”の下の行のmanagerの出力が
“manager : null”になってしまっています。

ソース

ソースをダウンロード
ソースはサンプルとして極力単純化したつもりです。
省略してますが、かいつまむと全体のソースはこんな感じです。
2秒おきにChildScene1→ChildScene2と移動し、各ChildSceneではChildPageをAddしたりRemoveしたりしてるだけなつもりです。

IndexScene.as

public class IndexScene extends SceneObject
{
	private var _child1:ChildScene1;
	private var _child2:ChildScene2;
	private var _tf:CastTextField;

	public function IndexScene()
	{
		_tf = new CastTextField( { id:"output", x:600, width:200, height:600 } );

		_child1 = new ChildScene1("child1");
		_child2 = new ChildScene2("child2");

		this.addScene(_child1);
		this.addScene(_child2);
	}

	protected override function atSceneLoad():void
	{
		addCommand(
			new AddChild(container, _tf)
		);
	}

	protected override function atSceneInit():void
	{
		_tf.text += "\n" + "[ IndexScene ] atSceneInit";

		new SerialList(null,
			2,
			new Goto(_child1.sceneId),
			2,
			new Goto(_child2.sceneId),
			2,
			new Goto(_child1.sceneId),
			2,
			new Goto(_child2.sceneId)
		).execute();
	}
}

ChildScene1.as (ChildScene2もクラス名以外は同じ)

public class ChildScene1 extends SceneObject
{
	private var _page:ChildPage1;
	private var _tf:CastTextField;

	public function ChildScene1( name:String = null, initObject:Object = null )
	{
		_page = new ChildPage1();
		_tf = getInstanceById("output") as CastTextField;
	}

	protected override function atSceneInit():void
	{
		_tf.text += "\n" + "[ ChildScene1 ] atSceneInit";
		_tf.text += "\n" + "manager : " + manager;

		addCommand(
			new AddChild(container, _page)
		);
	}

	protected override function atSceneGoto():void
	{
		_tf.text += "\n" + "[ ChildScene1 ] atSceneGoto";

		addCommand(
			new RemoveChild(container, _page)
		);
	}
}

ChildPage1.as (ChildPage2もクラス名以外は同じ)

public class ChildPage1 extends CastSprite
{
	private var _tf:CastTextField;

	public function ChildPage1( initObject:Object = null )
	{
		_tf = getInstanceById("output") as CastTextField;
	}

	protected override function atCastAdded():void
	{
		_tf.text += "\n" + "[ ChildPage1 ] atCastAdded";
		_tf.text += "\n" + "manager : " + manager;
	}
}

大体一般的なProgressionのソースです。と僕は思い込んでます。
で、次にサンプルのtraceを見てみます。コメントをつけました。

[ IndexScene ] atSceneInit  		//IndexSceneに来た

[ ChildScene1 ] atSceneInit  		//ChildScene1に来た
manager : [Progression id="index"]  	//managerの参照あり
[ ChildPage1 ] atCastAdded  		//ChildPage1がAddChildされた
manager : [Progression id="index"]  	//managerの参照あり

[ ChildScene1 ] atSceneGoto  		//ChildScene1から離脱、ChildScene2に移動開始

[ ChildScene2 ] atSceneInit  		//ChildScene1に来た
manager : [Progression id="index"]  	//managerの参照あり
[ ChildPage2 ] atCastAdded  		//ChildPage2がAddChildされた
manager : [Progression id="index"]  	//managerの参照あり

[ ChildScene2 ] atSceneGoto  		//ChildScene2から離脱、ChildScene1に移動開始

[ ChildScene1 ] atSceneInit  		//ChildScene1に来た
manager : [Progression id="index"]  	//managerの参照あり
[ ChildPage1 ] atCastAdded  		//ChildPage1がAddChildされた
manager : null  			//★★★managerの参照なし★★★

[ ChildScene1 ] atSceneGoto  		//ChildScene1から離脱、ChildScene2に移動開始

[ ChildScene2 ] atSceneInit  		//ChildScene1に来た
manager : [Progression id="index"]  	//managerの参照あり
[ ChildPage2 ] atCastAdded  		//ChildPage2がAddChildされた
manager : [Progression id="index"]  	//managerの参照なし

ChildPage1.atCastAdded()内で参照したmanagerがnullです。
1回目は同じ箇所でちゃんととれています。
また、直前のChildScene1.atSceneInit()内でもとれています。
でも、ChildPage1.atCastAdded()内で参照したmanagerがnullです。

他にも以下のテストをしました。

  • もう一回り繰り返し、1→2→1→2→1→2にすると、2回目と3回目の同様の箇所で同様の現象が起きます。
  • シーン遷移の順を2→1→2→1にすると、今度は2回目のChildScene2の同様の箇所で同様の現象が起きます。
  • ChildPage3とかを作って、1→2→3→1→2→3にすると、やはり2回目のChildScene1の同様の箇所で同様の現象が起きます。

ものすごい基本的なレベルなので、きっと組み方が誤っていると思われますが、ちっともわからないのでエントリにしてみました。これぞ神待ちサイト。

追記

賢い人その①@soundkitchenさんが教えてくれました。バグだそうで、同じ現象に出会ったそうです。

賢い人その②(というか本家)@niumさんが教えてくれました。次のリリースではなおるそうです。やったね :D

Leave a Reply