Как сохранить объект и ссылку на сцене с AS3? - PullRequest
1 голос
/ 16 июня 2011

У меня есть какой-то объект, который расширяет фрагмент ролика:

public class MyClass extends MovieClip { ... }

Теперь я хочу поставить два из них на сцене:

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

Это поместило бы одно, но другое, я хочу, чтобы оно было точно таким же, как и первое, поэтому мне просто нужно добавить «эталон» obj к сцене вместе с obj.

В конце я хочу, чтобы два объекта типа MyClass делали одно и то же на этапе. Если я попытаюсь просто сделать:

var obj2 = obj;
addChild(obj2);

На сцене появится только obj2.

Как я могу добиться этого с помощью ссылок? (для экономии памяти и процессорного времени (это действительно важно))

Заранее спасибо!

Ответы [ 7 ]

1 голос
/ 16 июня 2011

Если вы собираетесь создать несколько экземпляров одновременно, просто используйте цикл 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
1 голос
/ 22 апреля 2016

Я знаю, что это старый поток, но недавно я пытался сделать что-то подобное, и нашел несколько обходных путей.

Как сказано здесь, невозможно создать несколько копий одного экземпляра., но возможно создать новый экземпляр на основе существующего экземпляра.Вы можете написать такую ​​функцию:

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 будет названием вашей ссылки AS для вашей иллюстрацииво флеше.Если он не анимирован, вам лучше использовать Sprite вместо MovieClip.

Функция getClass () будет работать с любым классом, а не только с изображениями.

Для моих целей, хотяэто стало ненужным, так как я привык хранить любые «начальные изображения», которые я мог бы хотеть, в качестве переменной Class вместо MovieClips, а затем создавать новые копии из этого.

Вот упрощенный пример из игры IЯ работаю над:

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 - это связь AS с символом Flash.

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 () может это сделать.

Удачи всем.

1 голос
/ 16 июня 2011

Нет действительно хорошего способа сделать то, что вы хотите сделать. Из того, что я читаю, вы хотите, чтобы на сцене было два объекта .... но вы хотите, чтобы они делали одно и то же на сцене, поэтому вам нужен только один объект.

По замыслу объект в списке отображения имеет только одно местоположение. Если у вас есть более одного местоположения одновременно, вам понадобятся два объекта. Однако есть еще один способ сделать это, который включает в себя блиц, но вам нужно будет поставить каркас на место .... но вы можете использовать один объект и копировать их в несколько мест на вашей сцене. Если вы хотите идти по этому пути, здесь есть учебник .

Удачи.

0 голосов
/ 16 июня 2011

Это действительно зависит от того, что ваши объекты.Если ваше требование состоит в том, чтобы несколько объектов на сцене выполняли одно и то же, лучший способ повысить производительность - это посмотреть на дизайн самих объектов, а не пытаться избежать того факта, что вам нужно дублировать их.

В зависимости от того, что делают ваши объекты, может не быть необходимости дублировать методы вашего класса, вы можете вызвать только один метод и получить результаты, распространяемые через ваши экранные объекты.

0 голосов
/ 16 июня 2011

Краткий ответ: Вы не можете, вам нужно два экземпляра. Flash не может отображать один и тот же объект в двух разных местах списка отображения.
Длинный ответ: можно использовать класс BitmapData, чтобы получить то, что составляет «снимок» элемента - это буквально копия того, что отображалось во время создания. Это может выполнить то, о чем вы спрашиваете.

0 голосов
/ 16 июня 2011

Вы должны глубоко клонировать ваш obj, чтобы создать новый экземпляр obj2.

Или создайте другой экземпляр obj, такой как obj2, сделайте то же самое в инициализации, затем добавьте его на сцену.

0 голосов
/ 16 июня 2011

Вы не можете.Вы должны создать 2 экземпляра.

...