Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何使用AS3在舞台上保持对象和引用?_Actionscript 3_Reference_Flash Cs5 - Fatal编程技术网

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使用。。。但这实际上创建了另一个实例。。。事实上,我想在舞台上的两个不同位置放置同一个物体。。。但正如其他答案所提到的,这是不可能的!谢谢