AS3.0旅情8 ~表示クラスを一括削除する~
AS2→AS3間で、表示クラスの削除の方法も変わりました。
表示クラスとはMovieClipやSpriteの事で、SpriteはAS3から出来たMovieClipの元となるクラスです。
既知ですが簡単に整理します。(表示クラスは、以下、子と表記)
いずれも、基本的に再帰処理を用います。
AS2の場合、対象階層にfor..inをかけて子を列挙して消します。
for..inを利用した場合、以下のようになります。
for..inは対象階層に定義されているオブジェクトを列挙するため、MovieClipを削除するように条件分岐を行います。
プログラムからの生成では無く、ステージに予め配置したものは深度が負となります。
深度が負の場合、削除が効きません。
そのため、getDepth()で深度が負のものを正にして削除します。
objはMovieClip以外の型が入るかもしれないので、型定義はしていません。
/** * for..inで子を削除(AS2) */ var prop:String; var obj; for (prop in this) { obj = this[prop]; if (typeof(obj) == "movieclip") { if (obj.getDepth() < 0) obj.swapDepths(this.getNextHighestDepth()); obj.removeMovieClip(); } }
AS3の場合、対象階層の子の絶対数を元に消すことが可能です。
forを利用した場合、以下のようになります。
処理を実行する度に子の絶対数が減るので、インクリメントされるiをデクリメントする必要があります。
/** * forで子を全削除 */ var i:int; for (i = 0; i < numChildren; ++i) { removeChild(getChildAt(i)); --i; }
whileを利用した場合、以下のようになります。
実はforより短く書けます。
/** * whileで子を全削除 */ while (numChildren) { removeChildAt(0); }
再帰処理は大変便利ですが、再帰内に終了条件を明示しない場合は注意が必要です。
場合によっては再帰処理から抜け出せない場合もあるためです。
その点を注意して、効率良く使いたいですね。