AS3 - удаление двух объектов, добавленных на сцену с одинаковым именем переменной - PullRequest
0 голосов
/ 15 июня 2011

Я начну с того, что я очень новичок во флэш-памяти, и концепция Stage для меня все еще нова.

У меня есть следующая проблема:
в данный момент времени яесть:

var foo:MyClass() = new Class();
stage.addChild(foo);
...
foo = new myClass();
stage.addChild(object);

так что теперь у меня есть два или более объектов foo на сцене.моя переменная для одного foo, и мне нужно удалить их все со сцены.

что делать?спасибо

Ответы [ 4 ]

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

Что вы делаете, это создаете переменную, добавляете ее на сцену, а затем выбрасываете ссылку, я бы порекомендовал вам хранить ссылки в массиве. В классе добавьте переменную массива для их хранения:

private var _foos:Array = [];

Теперь вы можете хранить ссылку каждый раз, когда создаете объект Foo:

var foo:MyClass() = new MyClass();
// Add it to the stage
stage.adddChild(foo);
// Store the reference
_foos.push(foo);

foo = new MyClass();
// Add it to the stage
stage.adddChild(foo);
// Store the reference
_foos.push(foo);

Если вы хотите избавиться от них всех, просто переберите справочный массив:

for each (var foo:MyClass in _foos) {
    stage.removeChild(foo);
}
// Empty the array
_foos = [];

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

for (var i = stage.numChildren-1; i >= 0; i--) {
    var child:DisplayObject = stage.getChildAt(i);
    if (child is MyClass)
        stage.removeChild(child );
}
1 голос
/ 15 июня 2011

Хотя оба объекта уже существуют, вы изменили значение ссылки foo с одного нового MyClass на другой.И, как вы обнаружили, это ссылочное значение == ровно один объект.

Существует множество способов захвата ссылки на эти объекты, кроме имени переменной.@jhocking правильно отмечает, что вы можете использовать параметр displayList children для предоставления доступа (в конце концов, список отображения - это просто массив, подобный стеку).Однако это может создать проблемы, если у вас есть другие элементы в том же контексте списка отображения.

Еще одна хорошая альтернатива - поместить объект в массив (или вектор), который вы можете перебрать во время уничтожения.

var objects:Array = [];

for (var i = 0; i< 10; i++){
    var newObject:MyClass = new MyClass();
    this.addchild(newObject as DisplayObject);
    objects.push(newObject);
}

for (var j = objects.length; j > 0; j--){
    this.removeChild(objects[j] as DisplayObject);
}

Надеюсь, это поможет -

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

Я бы сказал, не используйте одну и ту же переменную для обоих объектов.

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

for (var i = stage.numChildren; i > 0; i--) {
  stage.remove(stage.getChildAt(i - 1));
}
0 голосов
/ 15 июня 2011

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

// here you instantiated the object
var foo:MyClass() = new Class();

// here you added the object to stage
stage.addChild(foo);

// here you re-instantiated the object leaving it attached to the stage
foo = new myClass();

// because it was already added to the stage you just caused it to move to the top of the display list
stage.addChild(object);


// so with all that being said doing the following code one time
stage.removeChild( foo );
// should remove foo from the stage.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...