CS3の旅の途中、会社で正規のCS3を購入したのですが、個人的にもパッケージを購入したので、痒いところにようやく手が届き始めました。。

今回はちょっとした技「リンケージシンボル一括クリア」です。

・・とその前に、上記の技の鍛錬中に面白い現象に遭遇したので、まずはそちらを。

FlashCS3でシンボル名を付けていないシンボルのnameはどうなっているのでしょう? Flash8以前と同様に自動的にnameが割り振られているのか簡単に検証してみました。 ステージ上に適当なMovieClipを4個配置して、以下のスクリプトを実行してみます。

/** * FlashCS3 * 名前を付けていないシンボルネームはどうなるの? */ for (var i:Number = 0; i < this.numChildren; i++) { trace(i+": "+(getChildAt(i).name)); //trace結果 //0: instance1 //1: instance3 //2: instance5 //3: instance7 }

どうやら名前を付けていないオブジェクトの名前は、instanceという文字が名前の一部に入るようです。 合わせて面白い事に、instance後部が奇数の連番になっています。 偶数が抜けているのが気になります。何かルールがありそうです。

さて本題の小技は、上記の“シンボル無名ルール”を利用したものです。

Flashは、シンボルにリンケージを設定したものをスクリプト上で利用する場合、 自動的に1フレーム目に書き出すか、利用する以前のフレームに予め配置しなければ利用出来ません。

FlashCS3になってもこの条件は変わらないようです。

そこで以下のようにすると、1フレーム構成かつ、リンケージシンボルを自動的に1フレーム書き出ししない条件下で、1フレーム上のリンケージシンボルのみを消す事が可能です。 但し今回の方法は、FlashCS3の“ステージ上に予め置いたオブジェクトもremoveChild可能”というルールがあって成立しています。

以下、ドキュメントルートに、Test.asというクラスを指定した場合の例です。

package { class Test { public function Test() { removeInstance(this); } /** * FlashCS3 * ステージ上にある無名のインスタンスを削除する */ public function removeInstance(content:MovieClip):void { for (var i:Number = 0; i < content.numChildren; i++) { var child:* = content.getChildAt(i); if (child is MovieClip) { if (child.name.indexOf("instance") != -1) { content.removeChild(child); i--; } } } } } }

上記検証の経緯は、FlashCS3にてドキュメントルートにクラスを指定する場合に、1フレーム構成で完結したい事があったためです。 要はリンケージシンボルをステージに置くと、生成する前から同フレーム上にシンボルがあり、余りスマートでは無く、かといってリンケージ用のフレームを改めて用意するのもどうだろうとためらっていた際に思いついた方法の1つです。

僕自身利用はしていますが、最善の方法かはわかりませんし、いろいろな方法がありそうです。 やはりCS3は面白いですね。

HTML5飯