Столкновение объектов Javascript

Простой совет: простое пространство (или невидимый специальный символ) в вашем скрипте, прямо перед самым первым тегом <?php, может вызвать это! Особенно, когда вы работаете в команде, а кто-то использует «слабую» IDE или перепутал файлы со странными текстовыми редакторами.

Я видел эти вещи;)

1
задан Hyyan Abo Fakher 13 July 2018 в 12:05
поделиться

2 ответа

Основная проблема заключается в том, что вы можете перемещаться по направлениям x и y одновременно с отключением по одному типу ошибок с некоторым обнаружением. Поэтому, когда вы находитесь на одном пикселе ниже нижней части верхнего квадрата, он фактически обнаруживает столкновение в направлении y с этим квадратом и только останавливает y от перемещения, но позволяет перемещение x.

Ниже приведено изменение, которое не допускает столкновений, хотя оно «застревает» в местах:

function fieldUpdate() {
  Field.clear();
  var oldX = myAvatar.x;
  var oldY = myAvatar.y;
  if (Field.keys && Field.keys[37]) {
    myAvatar.x--;
  }

  if (Field.keys && Field.keys[39]) {
    myAvatar.x++;
  }

  if (collision(myAvatar)) {
    myAvatar.x = oldX;
    myAvatar.y = oldY;
  }

  var oldX = myAvatar.x;
  var oldY = myAvatar.y;

  if (Field.keys && Field.keys[40]) {
    myAvatar.y++;
  }      

  if (Field.keys && Field.keys[38]) {
    myAvatar.y--;
  }

  if (collision(myAvatar)) {
    myAvatar.x = oldX;
    myAvatar.y = oldY;
  }

  myAvatar.componentUpdate();
  for (var prop in components) {
    components[prop].componentUpdate();
  }
}

Если вы исправили ошибку на 1, это также не должно застрял.

Еще одна проблема заключается в том, что у вас есть c.y - c.width в нескольких местах. Вероятно, это возможно c.y - c.height. Это будет проблемой, если вы когда-либо делаете не квадратные фигуры.

2
ответ дан bruceceng 17 August 2018 в 13:04
поделиться
  • 1
    Спасибо, но это никогда не будет истинным столкновением (myAvatar). – leiszbalazs 13 July 2018 в 14:03
  • 2
    В частности, это не будет постоянно верно. – leiszbalazs 13 July 2018 в 14:28
  • 3
    Так что, пока оно находится в столкновении, это правда. – leiszbalazs 13 July 2018 в 15:11

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

Способ исправить это было бы удаление всех возвратов в этой функции. Кроме того, посмотрите, что видео « Bounding Box Collision Detection » исправляет ваш алгоритм, потому что в настоящее время он игнорирует ширину и высоту вашего собственного аватара.

0
ответ дан Markus Hanel 17 August 2018 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: