source : here
ActionScript 3 no longer has a duplicateMovieClip method for MovieClip instances (or any DisplayObject instances). Instead, it's suggested that you just create a new instance of the display object you wish to duplicate using its constructor. This, however, is not the same as duplicateMovieClip, and, really, is more like using AS1 and AS2's attachMovieClip. For a more accurate representation of duplicateMovieClip in AS3, consider the following function:
package com.senocular.display {
import flash.display.DisplayObject;
import flash.geom.Rectangle;
/**
* duplicateDisplayObject
* creates a duplicate of the DisplayObject passed.
* similar to duplicateMovieClip in AVM1
* @param target the display object to duplicate
* @param autoAdd if true, adds the duplicate to the display list
* in which target was located
* @return a duplicate instance of target
*/
public function duplicateDisplayObject(target:DisplayObject, autoAdd:Boolean = false):DisplayObject {
// create duplicate
var targetClass:Class = Object(target).constructor;
var duplicate:DisplayObject = new targetClass();
// duplicate properties
duplicate.transform = target.transform;
duplicate.filters = target.filters;
duplicate.cacheAsBitmap = target.cacheAsBitmap;
duplicate.opaqueBackground = target.opaqueBackground;
if (target.scale9Grid) {
var rect:Rectangle = target.scale9Grid;
// Flash 9 bug where returned scale9Grid is 20x larger than assigned
rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20;
duplicate.scale9Grid = rect;
}
// add to target parent's display list
// if autoAdd was provided as true
if (autoAdd && target.parent) {
target.parent.addChild(duplicate);
}
return duplicate;
}
}
usage:
import com.senocular.display.duplicateDisplayObject;
// create duplicate and assign to newInstance variable
// using true for autoAdd automatically adds the newInstance
// into the display list where myOldSprite is located
var newInstance:Sprite = duplicateDisplayObject(myOldSprite, true);
newInstance.x += 100; // shift to see duplicate
The only thing duplicateMovieClip does that this does not is copy dynamic drawing information. Currently, the graphics object in display objects cannot be duplicated so there is no way to obtain that information for duplicates in duplicateDisplayObject.
Subscribe to:
Post Comments (Atom)
4 comments:
I tried this with a movieclip populated by other movie clips and it doesnt seem to work. Any clue as to why?
Hi! This script doesn't seem to work in FLASH CS4, any clues why is that? Thanks a lot
The problem with this is quite simple: It creates the new movieclip from the constructor, so if you had say other movieclips nested in it, or a sprite with actionscript drawn graphics, they do not get copied.
I have done a bit of research, and have found NO USABLE FUNCTION that also does this.
Yes the script fails on CS4 or Flex Builder.
If you need only the graphics data you casn simply draw it on a BitmapData and use it's clone
http://mrgeyik.com/2010/03/01/no-decent-way-to-clone-display-objects/
Post a Comment