2012-05-15 38 views
0

我在這裏遇到問題。每隔五秒鐘,spawnEnemies被解僱。它創建一個動畫片段,設置它的位置並將其添加到舞臺和數組中。在函數checkBullet中,我檢查子彈是否碰到其中一個敵人。如果是這樣,子彈和敵人將從舞臺上移開,並將敵人從陣列中拼接出來。但是,一旦我擊中敵人,就會發生錯誤:從數組拼接後出錯#1010

TypeError:錯誤#1010:術語未定義且沒有屬性。

如果我註釋掉arrayEnemies.splice(i,1)行,它工作正常,但它不會從數組中刪除。這本身不是一個問題,但自然我不喜歡在我的數組中保留不必要的數據。對此有何幫助?

function checkBullet(event:Event) { 
    if(stage.contains(mcBullet)) { 
     for(var i:int = 0; i < arrayEnemies.length; i++) { 
      if(arrayEnemies[i].hitTestPoint(mcBullet.x, mcBullet.y, true)) { 
       stage.removeChild(mcBullet); 
       this.removeChild(arrayEnemies[i]); 
       arrayEnemies.splice(i,1); 
       bulletOnStage = false; 
      } 
     } 
     if(mcBullet.x > 800) { 
      stage.removeChild(mcBullet); 
      bulletOnStage = false; 
     } 
    } 
} 


function spawnEnemies(event:TimerEvent) { 
    var enemie:MovieClip = new box_mc(); 
    enemie.name = "mcBox" + event.currentTarget.currentCount; 
    enemie.x = 850; 
    enemie.y = Math.floor(Math.random()*(1+155)+255); 
    addChild(enemie); 
    arrayEnemies.push(enemie); 
} 

function moveEnemies(event:Event) { 
    for(var i:int = 0; i < arrayEnemies.length; i++) { 
     arrayEnemies[i].x -= 5; 
    } 
} 

回答

0

這將是你通過一個作用中陣列上的工作引起的,你應該持有一個裁判要刪除的東西,然後再去做循環之後。

+0

你能否詳細說明如何做到這一點? – Veltar

+0

我需要看到命中的敵人代碼 – Neil

+0

它都在checkBullet函數中,它處理對敵人的命中。 – Veltar

0

你的問題是,如果子彈擊中兩個敵人,你試圖從舞臺上刪除它兩次。這會引發一個ArgumentError。

如果你需要對所有敵人進行測試(假設多個敵人可以被同一子彈擊中),當你從你的敵人陣列中移除一個元素時,你還需要減少我。

function checkBullet(event:Event) { 
    if(stage.contains(mcBullet)) { 
     if(mcBullet.x > 800) { 
      stage.removeChild(mcBullet); 
      bulletOnStage = false; 
     } 
     for(var i:int = 0; i < arrayEnemies.length; i++) { 
      if(arrayEnemies[i].hitTestPoint(mcBullet.x, mcBullet.y, true)) { 
       if(stage.contains(mcBullet)){ 
        stage.removeChild(mcBullet); 
       } 
       this.removeChild(arrayEnemies[i]); 
       arrayEnemies.splice(i,1); 
       bulletOnStage = false; 
       i--; 
      } 
     } 
    } 
} 
0

這是一個較老的問題,但我想我也會在我的答案中提出,對於任何可能在這裏結束的人。
像Neil說的那樣,編輯一個你正在瀏覽的數組(在這種情況下,arrayEnemies)會導致併發更新問題。

我的首選解決方案是使用一個單獨的文檔,刪除陣列和更新後刪除它們,例如:

var enemies:Array(); 
//Lets assume at some point this is populated with Enemy objects 

function update():void 
{ 
    var toRemove:Array = new Array(); 
    //May want to keep and clear an array instead to avoid creating a new one each update 

    foreach(var enemy:Enemy in enemies) 
    { 
     enemy.update(); 
     if(enemy.markedForRemoval()) 
      toRemove.push(enemy); 
    } 

    foreach(var enemy:Enemy in toRemove) 
     enemies.splice(enemies.indexOf(enemy), 1); 
}