FlashCS3で、ムービークリップのフレームに配置したオブジェクトの挙動が、いまいちピンとこないで困っている。よくわからないのは、フレームに配置された子ムービークリップのaddだとかremoveの挙動。スクリプトでいうところの、addChildやremoveChildを自動で実行してくれている、というイメージだったのだけど、どうも違うようで…。
例えば、任意のムービークリップのフレーム、キーフレームを切って、「s1,s2,s3」といったフレームラベルをつけてみる。これらのキーフレームに、適当なムービークリップシンボルを配置する。普通に再生させると、フレームに配置した順番に表示されることになる。
で、配置してあるMCに適当にクラスをつけてみる。
package{
import flash.display.MovieClip;
import flash.events.Event;
public class TestClip extends MovieClip{
public static var no:Number = 0;
public var my_No:Number;
public function TestClip(){
super();
no ++ ;
my_No = no;
trace("Constructor",my_No);
addEventListener( Event.ADDED_TO_STAGE, function(e:Event):void{ trace("+addToStage",my_No);} );
addEventListener( Event.REMOVED_FROM_STAGE, function(e:Event):void{ trace("-RemovedFromStage",my_No);} );
addEventListener( Event.ADDED, function(e:Event):void{ trace("+ADDED",my_No);}, );
addEventListener( Event.REMOVED , function(e:Event):void{ trace("+REMOVED ",my_No); } );
}
}
}
これを再生させると
Constructor 1 +ADDED 1 +addToStage 1 +REMOVED 1 -RemovedFromStage 1 Constructor 2 +ADDED 2 +addToStage 2 +REMOVED 2 -RemovedFromStage 2 Constructor 3 +ADDED 3 +addToStage 3 +REMOVED 3 -RemovedFromStage 3
といった具合。これはイメージと相違はない。しかしながら、removeされた後でも parent が null にならない。まぁ、これはそんなものかと思うことにする。
問題はgotoAndPlay等で移動した場合なのです。例えば、フレームラベル[s0]以前で、「gotoAndPlay(“s3”)」としてみると、
Constructor 1 +ADDED 1 +addToStage 1 Constructor 2 +ADDED 2 +addToStage 2 Constructor 3 +ADDED 3 +addToStage 3 +REMOVED 3 -RemovedFromStage 3
何故か、s3までにあるMCがそつなく初期化されちゃってる…。addToStageされているが、もちろんs3に配置しているもの以外表示はされない。親ムービークリップのnumChildrenも1だし。悪いことに、通りすがりで、表示されないくせにaddToStageが発生しているインスタンスは、remove系のイベントが発生しない。これは困りました。
通りすがりのシンボルが初期化されるのは、そんなもんかと思うことにしても、removeがわからないんじゃ後処理ができない。例えば、このシンボルが、Event.ENTER_FRAMEのリスナーを持っている場合、ガベージコレクションが掃除するまで、延々onEnterFrame状態になってしまいますね…。
これって仕様なんでしょうか…。近頃になって、やっとFlashCS3でつくり始めたもので、今更的な話題のような気もするのですが、どうしたものか思案中です。回避するにしても気持ちが悪いなぁ、と。