removeMovieClip()の注意点

フレームアクションに以下のコードを書いてみる。

var mc0:MovieClip;
trace(mc0);
//output
undefined

変数mc0は定義されただけで、まだMovieClipへの参照を持っていないので、
結果は当然 undefined がトレースされる。

では、次のコードだとどうなるか?

//変数mc1をMovieClip型として定義
var mc1:MovieClip;
//ステージにMovieClipを作成
_root.createEmptyMovieClip("emptyMC",1);
//mc1に emptyMCを代入
mc1 = _root. emptyMC;
//emptyMCを削除
emptyMC.removeMovieClip();
//mc1をトレース
trace(["result[",mc1,"]"]);
//output
result[,,]

期待していた undefined は返らない。
空の文字列?のようなものが返ってくる。

少しコードを変えてみる。

//mc2をMovieClip型で定義し、
//createEmptyMovieClipの戻り値(新しく生成されたMovieClip)を代入する
var mc2:MovieClip = _root.createEmptyMovieClip("emptyMC",2);
//emptyMCを削除
mc2.removeMovieClip();
//mc2をトレース
trace(["result[",mc2,"]"]);
//output
result[,,]

結果はかわらず。。
この undefined でも null でもない何かは、何なのか?

早速調査開始!

trace(mc2 == undefined);//undefinedと比較
trace(mc2 == "");//からのストリングと比較
trace(mc2 == 0);//0と比較
trace(mc2 == null);//nullと比較
trace(!mc2);//not演算子で評価
trace(!(typeof mc2 == "movieclip"));//typeofで型を評価
trace(!(mc2 instanceof MovieClip));//MovieClipのインスタンスかどうか評価
//output
false
false
false
false
false
false
true

思いつく限りやってみたけど、
mc2はかろうじてMovieClipのインスタンスではある様子。

では、、
これは?

trace(mc2._name);
undefined;

おお!名前がないMovieClipだ!
名前がないのはかわいそうなので「破損したムービークリップの参照」という名前を付けてみる。

以下、まとめと対策。

var mc0:MovieClip;
//Case1
var mc1:MovieClip;
_root.createEmptyMovieClip("emptyMC",1);
mc1 = _root.emptyMC;
//Case2
var mc2:MovieClip = _root.createEmptyMovieClip("emptyMC2",2);
//Case3
_root.createEmptyMovieClip("emptyMC3",3);
var mc3:MovieClip;
_root.emptyMC.removeMovieClip();
mc2.removeMovieClip();
mc3.removeMovieClip();
trace([mc0,mc1,mc2,mc3]);
//output
undefined,,,undefined

Case1からCase3のうち、Case1, Case2ともにundefinedが返りそうだが、
undefinedが返るのはCase3だけ。
変数mc1,とmc2は破損したムービークリップへの参照が残る。
変数の内容とムービークリップの存在を同期させたい場合は
Case3のようにMCを生成した後に変数を宣言する。(かなり違和感)

以上、すべてAS2でのお話。AS3はどうなってるんだろう?

カテゴリー: ActionScript2 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です