| INDEX |

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でつくり始めたもので、今更的な話題のような気もするのですが、どうしたものか思案中です。回避するにしても気持ちが悪いなぁ、と。

| INDEX |