2017-02-19 5 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

タイマーがあり、それが発動速度制限に達すると、最初の非生きている敵の生きているブール値を真に設定し、ゲームはその敵を更新し続けます。私はすべての生きているオブジェクト間の衝突をチェックするcollsionチェックをしたいが、そのバグのためにdoesntする。コンソールはエラーを表示しません。 – iWillBeMaster

答えて

1

まあ、あなたはすべての敵を巡回するループを持っていますが、一度に唯一の敵を確認し、お互いに対してではなくplayerに対してのみチェックします。

だから、何かしてみてください:

あなたが興味を持っている場合には
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コースがあります。

仕事を探しているうちに、そのオープンソースプロジェクトとそのコースの情報を使って、私は小さなバージョンのマリオを作った。ゲームはmy websiteの "projects"にあります。



編集

だからあなたの例の後に私はあなたの質問を理解していました。あなたは、弾丸について内部ループのimax変数を再利用しています。したがって、内側のループが終了すると、外側のループも両方ともi < maxをチェックして終了します。

+0

答えをありがとうが、私が欲しいのは、敵がプレイヤーとその弾としか衝突しないということです。 – iWillBeMaster

+0

ああ私の神どうして私はこれを見ていない来た。大いに感謝する!私は今、完璧に働いています。 – iWillBeMaster