Copying a Flash MovieClip, or The Flash Holy Grail
Posted on Fri 15 May 2009 in Development
Ran into a nice solution for copying arbitrary MovieClips at runtime today. I am designing a spot the difference game akin to 6 Differences with the requirement that, upon finding a difference, the scene should go to the "correct" state depending on which difference was defined as master, among a few other criterion. This required that I somehow duplicate, as much as is possible, the state of the "master" difference, when appropriate. At any rate, the solution comes from Danny Burbol's blog, which apparently came from a Experts Exchange thread (damn people charging for information). I modified the solution a bit to fit my needs, but not by a whole lot. Sometimes I only need to copy the instance and I can reconstitute the MovieClip from there but other times I will need to get the whole shebang. It's pretty handy in general. So my version follows (as a bonus I include my handy-dandy clearAllChildren function):
package com.bmm.utils { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.geom.Rectangle; /** * ... * @author BenS */ public class UIUtils { public static function clearAllChildren(c:DisplayObjectContainer):void { if (c == null || c.numChildren == 0) return; var i:int = 0, n:int = c.numChildren; for (i = 0; i < n; i++) { c.removeChildAt(0); } } public static function simpleDisplayObjectClone(source:DisplayObject):DisplayObject { var cc:Class = Object(source).constructor; return new cc(); } public static function displayObjectClone(source:DisplayObject):DisplayObject { var copy:DisplayObject = UIUtils.simpleDisplayObjectClone(source); copy.transform = source.transform; copy.filters = source.filters; copy.cacheAsBitmap = source.cacheAsBitmap; copy.opaqueBackground = source.opaqueBackground; if (source.scale9Grid) { var r:Rectangle = source.scale9Grid; copy.scale9Grid = r; } return copy; } } }