Actionscript 3 如何使用AS3在舞台上保持对象和引用?
我有一些对象,它扩展了电影剪辑:Actionscript 3 如何使用AS3在舞台上保持对象和引用?,actionscript-3,reference,flash-cs5,Actionscript 3,Reference,Flash Cs5,我有一些对象,它扩展了电影剪辑: public class MyClass extends MovieClip { ... } 现在,我想把其中两个放在舞台上: var obj:MyClass = new MyClass(); addChild(obj); 这将放置一个,但另一个我希望它与第一个完全相同,因此我只需要在舞台上添加一个obj的“参考”,以及obj本身 最后,我希望两个MyClass类型的对象在阶段中执行相同的操作。如果我试着简单地做: var obj2 = obj; addCh
public class MyClass extends MovieClip { ... }
现在,我想把其中两个放在舞台上:
var obj:MyClass = new MyClass();
addChild(obj);
这将放置一个,但另一个我希望它与第一个完全相同,因此我只需要在舞台上添加一个obj
的“参考”,以及obj
本身
最后,我希望两个MyClass类型的对象在阶段中执行相同的操作。如果我试着简单地做:
var obj2 = obj;
addChild(obj2);
只有obj2将出现在舞台上
我怎样才能通过推荐信做到这一点?(为了节省内存和CPU时间(这非常重要))
提前谢谢 你不能。您必须创建两个实例。您应该深度克隆您的
obj
以创建一个新实例obj2
或者创建另一个obj实例,如obj2,在初始化中执行相同的操作,然后将其添加到阶段。简短回答:你不能,你需要两个实例。Flash无法在显示列表中的两个不同位置显示同一对象。
详细回答:可以使用BitmapData类获取项目的“快照”——它实际上是创建时显示的内容的副本。它可以满足你的要求。做你想做的事其实没有好方法。从我读到的,你希望舞台上有两个物体……但是你希望他们在舞台上做同样的事情,所以你实际上只想要一个物体 根据设计,显示列表上的对象只有一个位置。如果同时有多个位置,则需要两个对象。然而,还有另一种方法可以做到这一点,包括布景,但是你必须把框架放在适当的位置……但是,你可以使用一个对象并将它们复制到舞台上的多个地方。如果这是你想要的方式,有一个教程
祝你好运。如果要同时创建多个实例,只需使用for循环:
var i:uint = 0;
for(i; i<2; i++)
{
var t:MyClass = new MyClass();
// properties of t
addChild(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
这真的取决于你的对象是什么。如果您的需求是让多个对象在舞台上做完全相同的事情,那么提高性能的最佳方法是查看对象本身的设计,而不是试图逃避需要复制它们的事实
根据您的对象正在执行的操作,可能不需要复制类的方法,您可以只调用一个方法,并通过显示对象传播结果。我知道这是一个旧线程,但我最近正在努力执行类似的操作,并找到了一些解决方法 正如这里所说的,不可能创建单个实例的多个副本,但是可以基于现有实例创建新实例。您可以编写如下函数:
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;
}
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);
…然后像这样实施它:
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;
}
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中作品的链接标题。如果它不是动画,你最好使用精灵而不是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()函数可以执行此操作
祝你好运。除非他对位图数据本身进行大量转换,否则性能实际上会提高。对于显示相当静态的数据,快速切换到bitmapdata画布会让人尖叫。你知道吗,你是对的。我不知道我在想什么,我甚至看到它严重优化了性能。哦,好吧。修复了它。+1用于有趣的getCopy使用。。。但这实际上创建了另一个实例。。。事实上,我想在舞台上的两个不同位置放置同一个物体。。。但正如其他答案所提到的,这是不可能的!谢谢