2017-02-19 98 views
0

所以我一直在使用JavaScript製作這個小射手遊戲,並且我遇到了一個我無法弄清楚的問題。碰撞檢查循環在敵人產卵後停止循環

我有一個碰撞檢查,它檢查任何活着的敵人是否與玩家或使用for循環的子彈相撞。循環運行良好,直到我產生一個敵人。

在for循環的開始部分,您可以看到console.log,它只記錄數字直到第一個活的敵人的index。例如,如果enemies[4]處於活動狀態,並且在此之前沒有其他有index的敵人存活,則它會繼續記錄0, 1, 2, 34。如果我再幹掉所有的敵人,循環再次運行完整的50倍(這是數組的長度),直到敵人產卵

checkCollision: function(){ 
    function calculate(enemy, other){ 
     var r = enemy.r + other.r; 
     var dx = enemy.posX - other.posX; 
     var dy = enemy.posY - other.posY; 
     var d = Math.sqrt((dx * dx) + (dy * dy)); 
     if(r > d){ 
      enemy.alive = false; 
      other.alive = false; 
      return true; 
      } 
     return false;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
    } 
    for (var i = 0, max = this.enemies.length; i < max; i++) { 
     console.log(i); 
     if(this.e­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­nemies[i].alive){ 
      if(calculate(this.enemies[i], this.player)){ 
       continue; 
      } 
      for (var i = 0, max = this.player.weapon.bullets.length; i < max; i++){ 
       if(this.player.weapon.bullets[i].alive){ 
        if(calculate(this.enemies[i], this.player.weapon.bullets[i])){ 
         break;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
        } 
       }­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
      } 
     } 
    } ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
} 

這裏是一個小的可視化:

[0] = !alive 
[1] = alive 
[2] = !alive 
[3] = alive 
[4] = alive 

現在for循環只運行2次,因此不檢查3和4的碰撞,這就是我想要的。

+1

你能解釋一下你如何產生一個敵人,並解釋更多的錯誤?我甚至不確定是否有意外的行爲或錯誤信息... –

+0

有一個計時器,當它達到產卵率限制時,會調用一個產卵函數,它將第一個非活着的敵人的alive-boolean設置爲true,遊戲繼續更新那個敵人。我希望collsion檢查所有活着的對象之間的碰撞,但它不是由於這個錯誤。控制檯不說任何錯誤。 – iWillBeMaster

回答

1

嗯,你有一個循環,它遍及所有的敵人,但一次只檢查一個敵人,只對,而不是對方。

所以你可以試試:

for (var i = 0, max = this.enemies.length; i < max; i++) { 
     for (var j = 0, max = this.enemies.length; j < max; j++) { 
      if(calculate(this.enemies[i], this.enemies[j]){ 
       doSomething(); 
      } 
     } 
    } 
    // Don't forget the player. 

如果你有興趣,有一個相當不錯的HTML5 Game Development的課程,教您如何使用一個開源的物理引擎,這需要那些東西護理。

在找工作時,我使用該開源項目製作了一個小版本的Mario,以及來自該課程的信息。您可以在「項目」下的my website上看到遊戲。



編輯

所以,你的例子後,我明白你的問題。您正在內部循環中重用imax變量以瞭解項目符號。所以如果內循環結束,外循環也將終止,因爲它們都檢查i < max

+0

感謝您的答案,但我想要的是敵人只能與玩家及其子彈相撞。 – iWillBeMaster

+0

哦,我的天啊,我怎麼沒有看到這個。萬分感謝!我現在完美地工作了。 – iWillBeMaster