2017-02-19 3 views
0

Итак, я делаю эту маленькую шутерскую игру с javascript, и я столкнулся с проблемой, которую я не могу понять.Цикл проверки на столкновение прекращает цикл после появления врага

У меня есть проверка столкновения, которая проверяет, сталкивается ли какой-либо живой враг с игроком или пулей, используя цикл for. Петля отлично работает, пока я не создаю врага.

В начале цикла for вы можете видеть console.log, он регистрирует числа только до первого живого врага index. Например, если enemies[4] жив и нет других врагов с index до того, как они будут живы, он будет вести журнал 0, 1, 2, 3 и 4. Если бы я тогда убить всех врагов, петля работает полный 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

Существует таймер, и когда он достигает предела скорости появления, вызывается функция порождения, которая устанавливает для живого-булева первого живого врага значение true и игра продолжает обновлять этого врага. Я хочу, чтобы проверка совпадения проверяла конфликт между всеми живыми объектами, но это не связано с этой ошибкой. Консоль не говорит никаких ошибок. – 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 под «проектами».



Редактировать

Таким образом, после вашего примера я понял ваш вопрос. Вы повторно используете переменные i и max во внутреннем цикле о пулях. Поэтому, если внутренний контур завершается, внешний контур также заканчивается, поскольку оба они проверяют i < max.

+0

Спасибо за ответ, но я хочу, чтобы враги могли столкнуться только с игроком и его пулями. – iWillBeMaster

+0

О, мой бог, почему я не видел этого. Большое спасибо! Теперь я отлично работаю. – iWillBeMaster

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