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