2014-01-24 79 views
0

所以我有一個在數組中實例化的敵人列表,我有他們在屏幕上。當他們被槍殺時,我想讓已經被擊中的敵人從屏幕上移開。順便說一句,敵方級別與敵方電影片斷有聯繫,與子彈一樣。我明白問題是它不能比較和刪除,但我不知道如何解決它。基本上我很想知道如何刪除存儲在數組中的類文件的實例?如何刪除一個數組中的類的實例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"); 
    } 
     } 
    } 

我不斷收到此錯誤在輸出窗口: 類型錯誤:錯誤#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); 

而且你得到的是空引用錯誤:scope.redDot.hitTestObject(enemy)特別是scope

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

由您最有可能造成或子女scope.redDot。當你試圖引用它時,其中一個可能不存在。你必須徹底地檢查你的代碼,但是這是缺點的,因爲它可能有許多不同的問題的時間表編碼(或無下面所有的),如:

  • redDot不存在作爲範圍
  • redDotscope(或兩者)孩子沒有被當前的框架上建立
  • scoperedDot是不正確的引用名稱

這個例子不勝枚舉...再次,這是所有猜測錯誤是scopescope.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

我想知道,如果你在'if(i> = 0)'下緩存'pop()',然後刪除if語句if(enemyList.length === 1)',你可能會看到增加。 –

相關問題