我知道这是一个旧线程,但我最近一直在努力做类似的事情,并找到了一些解决方法。
正如这里所说,不可能创建单个实例的多个副本,但可以基于现有实例创建新实例。你可以写一个这样的函数:
public function getClass(obj:Object):Class {
return Object(obj).constructor;
}
...然后像这样实现它:
var seedImage:MovieClip = new SeedImageClass();
var classRef:Class = getClass(seedImage);
var copiedImage:MovieClip = new classRef();
seedImage.x = seedImage.y = 200;
copiedImage.x = copiedImage.y = 300;
stage.addChild(seedImage);
stage.addChild(copiedImage);
...SeedImageClass 将是您在 Flash 中的作品的 AS 链接标题。如果不是动画,最好使用 Sprite 而不是 MovieClip。
getClass() 函数适用于任何类,而不仅仅是图像。
但出于我的目的,这变得不必要了,因为我养成了将我可能想要的任何“种子图像”存储为类变量而不是 MovieClips 的习惯,然后从中实例化新副本。
这是我正在开发的游戏中的一个简化示例:
public class SoldierType {
public var imageClass:Class;
public function SoldierType(artReference:Class) {
this.imageClass = artReference;
}
}
public class Soldier {
public var type:SoldierType;
public var image:MovieClip;
public function Soldier(typeReference:SoldierType, startX:Number, startY:Number) {
this.type = typeReference;
this.image = new this.type.imageClass(); //where the magic happens
this.image.x = startX;
this.image.y = startY;
}
}
..它的实现方式(或多或少)是这样的,其中 art.BlueMarine 是到 Flash 符号的 AS 链接。
var marineType:SoldierType = new SoldierType(art.BlueMarine);
var marine01:Soldier = new Soldier(marineType, 200, 200);
var marine02:Soldier = new Soldier(marineType, 300, 300);
stage.addChild(marine01.image);
stage.addChild(marine02.image);
最后一部分的重点是,您可以重组代码以从类引用而不是实例化的 MovieClip 生成新实例,这将使您的代码运行得更快。如果没有,getClass() 函数可以做到。
祝大家好运。