нелогично удалить дочернюю ошибку при просмотре через DisplayObjects, прошить AS3

Ошибка аргумента № 2025:

Предоставленный DisplayObject не является дочерним элементом вызывающего объекта

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

0: "enemy handler" ➔ [object EnemyHandler]
  0: "enemy" ➔ [object Enemy1]
    0: "enemy's skin"(MovieClip) ➔ [object EnemySkin1]
      0: "skin image" ➔ [object Shape]

Класс документа содержит один экземпляр EnemyHandler, а также несколько экземпляров Enemy1, Enemy2 и т. д.. К каждому из них прикреплен мувиклип скина. .

Класс Enemy (от которого наследуется Enemy1/2/3 ect) содержит свойство expired, для которого устанавливается значение true внутри класса Enemy (enemy.update), когда враг достигает определенного точка.

В классе обработчика врага есть функция, в которой и заключается проблема, которая перебирает массив всех экранных объектов Enememy, обновляя их позицию, а затем,

if(tempEnemy.expired)
{
    tempEnemy.destroy();            // removeChild(skin)
    enemyList.splice(tempEnemy);
    removeChild(tempEnemy)
}

при запуске, если все враги достигают конечной точки в том порядке, в котором они были созданы, проблем нет, однако, если, например, один из них движется быстрее и достигает конечной точки раньше, возникает ошибка # 2025 (предоставленный DisplayObject является не является дочерним элементом вызывающего абонента).

Я сузил его до того, что программа пытается удалить врага дважды по причинам, которые я не могу понять. Он зацикливается и удаляет нужных врагов, а затем пытается удалить их снова, даже если они объединены с массивом (что происходит правильно, и первая попытка removeChild всегда успешна)

Это, вероятно, что-то довольно простое от моего имени, так что простите меня, но любая помощь приветствуется. вот файлы;

[код на рамке] pastebin.com/vcXzQpr9

[Враг.as] pastebin.com/RNXgK8Ex

[EnemyHandler.as] pastebin.com/6fytxbMW

[Enemy0.as] и [Enemy1.as] pastebin.com/5bW3Aa0H

[Utils.as] pastebin.com/PQ2LPV0v

[traceDl.as] {отладка списка отображения} pastebin.com/9vQGKcYP


person Lemmingz95    schedule 20.02.2013    source источник


Ответы (1)


Array.splice() принимает целое число для положение, с которого вы хотите начать сращивание, а затем количество элементов, которые вы хотите удалить. Поэтому вам нужно использовать

enemyList.splice(enemyList.indexOf(tempEnemy), 1);

вместо передачи экземпляра Enemy. Возможно, это работало правильно, когда порядок не изменился, потому что приведение tempEnemy к int (которое splice() будет выполнено автоматически) дает ноль, поэтому в вашей функции destroyEnemy она фактически просто удаляла первый элемент в списке каждый раз .

person David Mear    schedule 20.02.2013
comment
Спасибо, теперь отлично работает. Я догадался, что это может быть что-то простое, я предположил, что arrayOfDisplayObjects.splice(displayObject,1) - displayObject в качестве начального индекса может иметь ту же функциональность, что и arrayOfDisplayObjects.splice(arrayOfDisplayObjects.indexOf(displayObject). , Очень полезная всплывающая подсказка Flash Array.splice(paramaters..) пригодилась x - person Lemmingz95; 20.02.2013