2014-01-24 7 views
0

Итак, у меня есть список врагов, созданных в массиве, и у меня есть их на экране. Когда их снимают, я хочу, чтобы противник был снят с экрана. Кстати, у вражеского класса есть AS Linkage с Enemy movieClip, то же самое с Bullet. Я понимаю, проблема в том, что он не может сравнивать и удалять, но я не знаю, как это исправить. В основном я хотел бы знать, как я могу удалить экземпляры файла класса, которые хранятся в массиве?Как удалить экземпляр класса в массиве AS3

Это то, что я получил до сих пор:

stage.addEventListener(MouseEvent.CLICK, shoot); 

    var enemyList:Array = new Array(); 
    addEnemies(608.75, 371.85); 

    function addEnemies(xLoc:Number, yLoc:Number):void {  
     var enemy:Enemy = new Enemy(xLoc, yLoc); 
    addChild(enemy); 
    enemyList.push(enemy); 
    } 

    function shoot(event:MouseEvent):void{ 
     for(var i:int = 0; i < 4; i++){ 
     var enemy:Enemy = enemyList[i]; 
      if(scope.redDot.hitTestObject(enemy)){ 
     trace("SHOT TO DEATH"); 
    } 
    else{ 
     trace("DIDNT DIE"); 
    } 
     } 
    } 

Я получаю эту ошибку в окне вывода: TypeError: Error # 1010: Термин не определен и не имеет свойств. at sniper_fla :: MainTimeline/shoot() [sniper_fla.MainTimeline :: frame1: 58]

Любая помощь будет оценена!

ответ

0

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

enemyList.splice(enemyList.indexOf(enemy), 1) 

должны работать для удаления

Я не уверен об ошибке вы получаете, хотя

0

@RustyH правильно :

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

Но так как вы делаете это в цикле for с постоянной оценкой ион (я < 4) Вы можете сделать это, что немного быстрее:

enemyList.splice(i, 1); 

Кроме того, что пустая ссылка ошибка вы получаете:

TypeError: Error #1010: A term is undefined and has no properties. at sniper_fla::MainTimeline/shoot()[sniper_fla.MainTimeline::frame1:58] 

Это, скорее всего, вызван вашим: scope.redDot.hitTestObject(enemy) особенно scope или ребенка scope.redDot. Один из них может отсутствовать, когда вы пытаетесь ссылаться на него. Вы должны тщательно проверить свой код, но это оборотное для кодирования на временной шкале, как это могло быть много различных вопросов (или ни одно из следующих действий на всех), такие как:

  • redDot не существует как ребенок сферы
  • redDot или scope (или оба) не были созданы на текущем кадре
  • scope или redDot являются неправильные ссылки на имена

Этот список можно продолжать ... снова это все предположение, что ошибка scope или scope.redDot.

+0

Вы правы, я не дал redDot имя экземпляра. – driftking96

1

Более сложный, но гораздо быстрый метод для удаления элементов из этого вражеского массива использовать pop():

function removeEnemy(enemy:Enemy):void 
{ 
    var i:int = enemyList.indexOf(enemy); 

    if(i >= 0) 
    { 
     if(enemyList.length === 1 || enemyList[enemyList.length] === enemy) 
     { 
      // If we are referring to the last enemy in the list, or there is only 
      // one enemy in the list, we can just use pop to get rid of the target. 
      enemyList.pop(); 
     } 
     else 
     { 
      // In this case, we remove the last enemy from the array and retain a 
      // reference to it, then replace the target enemy we want to remove 
      // with that enemy. 
      var tempEnemy:Enemy = enemyList.pop(); 
      enemyList[i] = tempEnemy; 
     } 
    } 

    // We can also remove the Enemy from the stage in this function. 
    enemy.parent && enemy.parent.removeChild(enemy); 
} 

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

+0

Интересно, вы бы увидели увеличение, если бы вы кешировали 'pop()' под 'if (i> = 0)', а затем удаляли оператор if if (enemyList.length === 1) '. –

Смежные вопросы