我有一些对象,它扩展了影片剪辑:
public class MyClass extends MovieClip { ... }
现在,我想将其中的两个放在舞台上:
var obj:MyClass = new MyClass();
addChild(obj);
那会放一个,但另一个我希望它与第一个完全相同,所以我只需要在舞台上添加obj
的“引用”,以及obj
本身。
最后,我想要两个MyClass类型的对象在舞台上做同样的事情。如果我试着这样做:
var obj2 = obj;
addChild(obj2);
只有obj2会出现在舞台上。
我如何通过参考实现这一目标? (为了节省内存和CPU时间(这非常重要))
提前致谢!
答案 0 :(得分:1)
没有什么好办法可以做你想做的事。从我正在阅读的内容来看,你想在舞台上放置两个对象....但是你希望它们在舞台上做同样的事情,所以你实际上只想要一个对象。
按照设计,显示列表上的对象只有一个位置。如果您同时拥有多个位置,则需要两个对象。但是,还有另一种方法可以实现blitting,但你必须将框架放在适当的位置....但是,你可以使用一个对象并将它们复制到舞台上的多个位置。如果这是你想要的方式,那就是教程here.
祝你好运。答案 1 :(得分:1)
如果您要同时创建多个实例,只需使用for循环:
var i:uint = 0;
for(i; i<2; i++)
{
var t:MyClass = new MyClass();
// properties of t
addChild(t);
}
如果您想稍后在赛道上进行,可以尝试这样的事情:
function getCopy(taget:MyClass, ...attrs):MyClass
{
var t:MyClass = new MyClass();
var i:String;
for each(i in attrs)
{
t[i] = target[i];
}
return t;
}
缺点是您必须指定要继承的属性。
var m:MyClass = new MyClass();
m.x = 10;
m.y = 30;
var b:MyClass = getCopy(m, "x", "y");
trace(b.x, b.y); //output: 10, 30
答案 2 :(得分:1)
我知道这是一个老线程,但我最近在努力做类似的事情,并找到了几个解决方法。
正如这里所说,不可能创建单个实例的多个副本,但可以基于现有实例创建新实例。你可以写一个这样的函数:
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()函数适用于任何类,而不仅仅是图像。
出于我的目的,这变得不必要,因为我习惯于存储任何种子图像&#34;我可能想要Class变量而不是MovieClip,然后从那里实例化新的副本。
以下是我正在进行的游戏的简化示例:
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);
最后一部分的重点是,您可能能够重构代码以从Class引用中生成新实例,而不是实例化的MovieClip,这将使您的代码运行得更快。如果没有,getClass()函数可以做到。
祝你好运。
答案 3 :(得分:0)
你做不到。你必须创建2个实例。
答案 4 :(得分:0)
简短回答:你不能,你需要两个实例。 Flash无法在显示列表中的两个不同位置显示相同的对象 答案很长:可以使用BitmapData类来获取项目的“快照” - 它实际上是创建时显示的内容的副本。它可以完成你所要求的。
答案 5 :(得分:0)
这实际上取决于你的对象是什么。如果您的要求是让舞台上的多个对象完全相同,那么提高性能的最佳方法是查看对象本身的设计,而不是试图逃避您需要复制它们的事实。
根据您的对象的作用,可能不需要复制类的方法,您只能调用一个方法并将结果传播到显示对象。
答案 6 :(得分:-1)
您应该深度克隆obj
以创建新实例obj2
。
或者创建一个像obj2这样的其他obj实例,在初始化时执行相同的操作,然后将其添加到舞台上。