Как обнаружить столкновение только один раз в Game-loop, а не непрерывно? - PullRequest
0 голосов
/ 02 января 2019

Я кодирую маленькую космическую игру на JavaScript, как мне обнаружить коллизии?

Я зацикливаю игру с помощью requestAnimationFrame (), и мой вопрос:
Как обнаружить коллизию междудва тела, для подсчета (смерти) Переменная увеличивается только один раз вместо непрерывного?

// --- Collision ---
asteroids.forEach(asteroid => {
  //if (collisionOccured) { return; } I thought might work...
  if (distance(spaceship.x + spaceship.width, spaceship.y + spaceship.width, asteroid.x, asteroid.y) < asteroid.radius + spaceship.width) {
     console.log('Collision');
     collisionOccured = true;
     deaths++;
  }
});

Я думаю, я понимаю, в чем проблема, два тела сталкиваются, поэтомурасстояние между ними в n-Frames меньше, чем условие, поэтому переменная death больше учитывает Frames, в которых они сталкиваются, чем количество столкновений.
Но как я могу сделать это правильно?Любая идея?

Если это поможет, вот функция расстояния:

function distance(x1, y1, x2, y2) {
  return Math.sqrt(Math.pow(Math.abs(x1 -  x2), 2) + Math.pow(Math.abs(y1 - y2), 2));
}

1 Ответ

0 голосов
/ 02 января 2019

Вы можете увеличить количество смертей только в том случае, если не было ранее обнаруженного столкновения.

if (distance(spaceship.x + spaceship.width, spaceship.y + spaceship.width, asteroid.x, asteroid.y) < asteroid.radius + spaceship.width) {         
    if (!collisionOccured) {
      console.log('Collision');
      collisionOccured = true;
      deaths++;
    }
}

, если это не работает, это потому, что collisionOccured устанавливается в значение false в начале каждого кадраи вы должны попытаться найти способ сохранить значение переменной в предыдущем кадре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...