Удаление мувиклипов из массива со сцены - PullRequest
1 голос
/ 04 апреля 2011

Мне нужно удалить каждый объект, который является частью массива со сцены. То, что у меня есть сейчас, удаляет только один из объектов.

this.removeChild (enemyList.splice (0) [0]);

Я пробовал несколько вариантов этого с одинаковым результатом или с ошибкой. Есть ли другой способ сделать это, или я просто делаю это неправильно?

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

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Что вы делаете, это просто удаляете первый объект в массиве. Линия

this.removeChild(enemyList.splice(0)[0]);

в основном удаляет первый дочерний элемент из массива ([0]) и одновременно выделяет его из массива (enemyList.splice(0)). Для их удаления вам понадобится петля

Есть несколько вариантов, которые вы можете сделать:

Медленно: Используйте цикл while для просмотра списка, если в нем есть какие-либо объекты. Удалите каждый из них и склейте список, чтобы удалить его из списка (0 - это позиция, а 1 означает, что мы хотим склеить только один объект)

while( enemyList.length > 0 )
{
    this.removeChild( enemyList[0] );
    enemyList.splice( 0, 1 );
}

Немного быстрее: Просмотрите список, пока еще есть объекты, и удалите последний. Pop() это из массива, пока вы там

while( enemyList.length > 0 )
{
    this.removeChild( enemyList[enemyList.length - 1] );
    enemyList.pop();
}

Возможно, немного быстрее, чем второй (не тестировался), но быстрее, чем первый: Пройдите по массиву в обратном порядке и удалите каждый дочерний элемент, сращивая по мере продвижения

var len:int = enemyList.length
for( var i:int = len - 1; i >= 0; i-- )
{
    this.removeChild( enemyList[i] );
    enemyList.splice( i, 1 );
}

Самый быстрый: Просто пройдите массив и удалите каждого потомка. В конце цикла очистите массив, установив его длину в 0 (это удалит ссылки и позволит собирать мусор)

var len:int = enemyList.length;
for( var i:int = 0; i < len; i++ )
    this.removeChild( enemyList[i] );

// clear the array
enemyList.length = 0;

Некоторые моменты: Объединение происходит медленнее, чем при использовании pop(), и после того, как вы склеиваете объект, среде выполнения необходимо переместить все более поздние объекты на один пробел вниз (например, если вы склеиваете врагаЛист [1]) , затем врагаЛист [2] необходимо переместить в положение 1, чтобы восполнить пробел). Если вы собираетесь сращивать, всегда сращивайте сзади (так как это быстрее: нет объектов для перемещения вверх). По этой же причине pop() быстрее slice() (который удаляет первый объект в массиве)

Никогда не изменяйте массив (например, splice()), если вы перебираете его вперед, так как вы изменяете его длину во время зацикливания. Например, если ваш массив был var a:Array = ["obj1", "obj2", "obj3"], и вы скомбинировали его следующим образом:

for( var i:int = 0; i < a.length; i++ )
    a.splice( i, 1 );

Затем при первом проходе вы удалите объект в позиции 0 (в данном случае «obj1»). «obj2» и «obj3» теперь перемещаются в позиции 0 и 1 соответственно. В следующем цикле i будет равно 1 (в данном случае указывает на «obj3»), и это будет удалено. Цикл теперь остановится, даже если в нем все еще остается объект.

Если вы собираетесь изменить массив, удалив объект во время цикла, то всегда повторяйте цикл в обратном направлении

0 голосов
/ 04 апреля 2011

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

То, что вы хотите - это то, что проходит через каждого врага в enemyList, и удаляет каждого.

for (var i:int = 0; i < enemyList.length; i++)
{
    this.removeChild(enemyList[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...