Actionscript 3.0, AS2ライクにDuplicateMovieclipをするために、でsenocularさんのコードを紹介しましたが、@tail_y さんよりオーサリングMCではできない指摘がありました。
以下、@tail_y さんのTLより。
実行してみたけど、やっぱオーサリングのMCは、内容をコピーしてこれないよ
MC.clone()実験報告1 まず、巷ではconstructorでできるよーって記事が出回っているけど、これは嘘。オリジナル拡張したMCに限って、コンストラクタに処理が走るので同じような表示になるように見えているだけで、オーサリングのMCは空MCになってしまう。
MC.clone()実験報告2 オーサリングMCでは、表示物はShapeクラスにまとめられ、childに入っている。ところが、このShapeのgraphics.copyFrom()が全然何も表示してくれない。なんだこれ、駄目なんですか?
MC.clone()実験報告3 オーサリングMCの内部Shape.graphicsは他にも特殊な挙動をする。例えばこのgraphicsにさらに何かを書き足そうとlineTo等の処理を入れると、元々あったグラフィックは勝手にclear()されてしまう。
MC.clone()実験報告4 ByteArrayによるオブジェクトコピーも考えられるが、AMF 直列化形式は現在MovieClipを未対応としている。実際にやってみるとエラーになる。対応する予定がありますよみたいなこと書いてあるのに、ずーっと対応されない。
MC.clone()実験報告5 結局今のところまともにコピーできる方法は、素材swfをByteArrayで取っておいて、loadしなおしてやるという方法。でも小さいMCを1個ずつこの方法で取り出すのもパフォーマンスや記述的に現実的ではないと思う。
MC.clone()実験報告6 っていうかswfならByteArrayを介してコピーできるのに、MCが駄目ってどういうことよ。MCをswfファイルとしてByteArrayに突っ込む方法を探してみたけど、見つからずに断念。
MC.clone()実験報告まとめ 今のところ、スマートな方法は無い。可能なのはswfをByteArrayから持ってくること、もしくはライブラリでリンケージしておくこと。どっちも面倒。1個だけ配置したボタンをduplicateして可変数配置したい。誰かいいアイデアないですかねぇ。
ご指摘通りです。
rect_mcがx:100, y:100に配置されています。
import com.senocular.display.duplicateDisplayObject; import flash.display.MovieClip; import flash.events.MouseEvent; rect_mc.addEventListener(MouseEvent.CLICK, onClick); function onClick (e:MouseEvent):void { trace(e); } rect_mc.graphics.clear(); rect_mc.graphics.beginFill(0xffff00, .5); rect_mc.graphics.drawCircle(0, 0, 15); rect_mc.graphics.endFill(); var copied:MovieClip = duplicateDisplayObject(rect_mc, true); copied.x = 200; addChild(copied); |
複製されたMCは完全にはコピーされていない状態で表示されます。
う〜〜む。