Багги столкновения автомобилей со всех сторон автомобиля - PullRequest
0 голосов
/ 16 июня 2020

Я создал игру JavaScript, в которой мой автомобиль перемещается по карте, и теперь мне нужно встроить логику столкновений c. На сегодняшний день я попытался предсказать столкновения перед автомобилем, проверив, какому набору тайлов он соответствует. Код для этого можно увидеть ниже.

Game.update = function () {
  const x = this.car.x;
  const y = this.car.y;

  if (Keyboard.isDown(Keyboard.LEFT)) {
    Car.moveAngle = -1
    this._rotate(Car.moveAngle)
  }
  else if (Keyboard.isDown(Keyboard.RIGHT)) {
    Car.moveAngle = 1
    this._rotate(Car.moveAngle)
  }
  else if (Keyboard.isDown(Keyboard.UP)) {
    Car.frontCollision = !isCarInFrontCollision(x, y)
    Car.rearCollision = !isCarInRearCollision(x, y)
    if (!Car.frontCollision || Car.rearCollision) {
      Car.speed = 2
      this.car.move();
    }
  }
  else if (Keyboard.isDown(Keyboard.DOWN)) {
    Car.frontCollision = !isCarInFrontCollision(x, y)
    Car.rearCollision = !isCarInRearCollision(x, y)
    if (!Car.rearCollision || Car.frontCollision) {
      Car.speed = -2
      this.car.move();
    }
  }
  else {
    decelerate();
  }
  this.camera.update();
};

function isCarInRearCollision(x, y) {
  return !map.isSolidTileAtBottom(x, y)
}

function isCarInFrontCollision(x, y) {
  return !map.isSolidTileAtTop(x, y) 
}

Это (sorta) отлично работает для лобовых и задних столкновений, когда автомобиль движется на север или юг. Но все равно кажется немного сомнительным. Во-вторых, я не могу понять, как заставить работать столкновение для плиток на восточной / западной стороне карты. Есть ли лучший подход к этому, чем то, что я делаю прямо сейчас?

Я поместил здесь весь код: https://plnkr.co/edit/pfm9V5y1SyL3aQIo в демонстрацию.

1 Ответ

0 голосов
/ 16 июня 2020

Если вы уверены, что автомобиль будет перемещаться меньше, чем на плитку в каждом кадре, вы можете сначала вычислить новые координаты автомобиля, а затем проверить, будет ли она перекрываться с плиткой solid. Если он будет перекрываться, не беспокойтесь о его перемещении (и обнуляйте скорость, я полагаю). Должен упростить вещи.

...