如何在AS3的舞台上保持对象和参考?

时间:2011-06-16 02:10:17

标签: actionscript-3 reference flash-cs5

我有一些对象,它扩展了影片剪辑:

public class MyClass extends MovieClip { ... }

现在,我想将其中的两个放在舞台上:

var obj:MyClass = new MyClass();
addChild(obj);

那会放一个,但另一个我希望它与第一个完全相同,所以我只需要在舞台上添加obj的“引用”,以及obj本身。

最后,我想要两个MyClass类型的对象在舞台上做同样的事情。如果我试着这样做:

var obj2 = obj;
addChild(obj2);

只有obj2会出现在舞台上。

我如何通过参考实现这一目标? (为了节省内存和CPU时间(这非常重要))

提前致谢!

7 个答案:

答案 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实例,在初始化时执行相同的操作,然后将其添加到舞台上。