Мнения об объектах обнаружения столкновений с движущейся сценой - PullRequest
2 голосов
/ 27 марта 2010

Так что мой вопрос прост, и я полагаю, что все сводится к тому, насколько анальным вы хотите быть при обнаружении столкновений. Для простоты, давайте предположим, что мы говорим о 2D-спрайтах, определенных ограничивающим прямоугольником. Кроме того, давайте предположим, что у моего объекта-спрайта есть функция для обнаружения столкновений, таких как: S.collidesWith(other); Наконец сцена движется и «стены» в сцене могут двигаться, объект может не касаться стены.

Таким образом, простая реализация может выглядеть так (код psuedo):

moveWalls();
moveSprite();
foreach(wall as w) {
    if(s.collidesWith(w)) { 
        gameover();
    }
}

Проблема в том, что если спрайт и стена движутся навстречу друг другу, в зависимости от обстоятельств (например, диагонального момента). Они могут проходить друг через друга (маловероятно, но могло бы случиться).

Так что я могу сделать это вместо этого.

moveWalls();
foreach(wall as w) {
    if(s.collidesWith(w)) { 
        gameover();
    }
}
moveSprite();
foreach(wall as w) {
    if(s.collidesWith(w)) { 
        gameover();
    }
}

Это заботится о прохождении друг друга, но возникает еще одна редкая проблема. Если они смежны друг с другом (буквально следующий пиксель), и стена и спрайт движутся влево, то я получу недопустимое столкновение, поскольку стена движется, проверяет столкновение (удар) , затем спрайт перемещен. Что кажется несправедливым. Кроме того, избыточное обнаружение столкновений кажется очень неэффективным. Я мог бы дать игроку приоритет движения, облегчая первую проблему, но он все еще проверяет дважды.

moveSprite();
foreach(wall as w) {
    if(s.collidesWith(w)) { 
        gameover();
    }
}
moveWalls();
foreach(wall as w) {
    if(s.collidesWith(w)) { 
        gameover();
    }
}

Неужели я просто обдумываю эту проблему, стоит ли это просто записать как "это случится достаточно редко, чтобы никого не волновало"? Конечно, глядя на старые игры на основе спрайтов, я часто нахожу ситуации, когда обнаружение столкновений имеет тонкие недостатки, но я думаю, что теперь мы можем добиться большего :-P. Что думают люди?

Ответы [ 2 ]

2 голосов
/ 27 марта 2010

О том, стоит ли повышать точность, мы не можем вам сказать, но это должно стать очевидным во время тестирования игры. Что касается повышения надежности вашего обнаружения столкновений, у вас есть несколько вариантов:

  1. Уменьшить размер шага симуляции. Если размер шага * (максимальная скорость игрока + максимальная скорость стены) <(ширина игрока + ширина стены), вы не пропустите ни одного столкновения. </li>
  2. Также убедитесь, что игрок находится на одной стороне стены до и после шага симуляции.
  3. Вместо того, чтобы только проверять наличие столкновений в конце каждого шага моделирования, выведите формулу, которая вычисляет время, когда стена и игрок столкнутся, учитывая их текущие скорости, и отметьте столкновение, если это время находится в пределах текущего моделирования шаг. Это, возможно, излишне в вашем случае, но может быть полезно при моделировании таких вещей, как отскакивание от стен.
0 голосов
/ 27 марта 2010

Это во многом зависит от частоты, которую вы используете для проверки столкновения (и устройства ввода игрока). Когда вы часто проверяете, случай, когда оба перемещаются «одновременно», станет менее вероятным. Если бы это была стратегическая игра, основанная на раундах, это был бы другой вопрос.

Тем не менее, я не знаю, какую модель вы используете в деталях, но если у вас есть один поток, который проверяет вход игрока, и тот, который выполняет расчет движения и обнаружение столкновений, то оба должны синхронизированы (чтение / запись блокировки) в любом случае. В таком случае понятно, что случилось первым. То же самое, если вы используете только один поток.

В зависимости от физической модели вход может управлять ускорением, которое будет определять скорость, которая, в свою очередь, определяет положение. Если линия перемещения объекта из предыдущей позиции в (возможную) следующую позицию пересекает позицию стены в это время, у вас есть столкновение (с учетом всех контуров, которые могут столкнуться).

Вероятно, более сложным является вычисление эффекта отказов. Я обнаружил, что это правда, когда я написал игру на основе OpenGL, где стены не могут двигаться, но пол может быть наклонен: когда отскок недостаточно силен, чтобы противостоять ускорению у стены, вы все равно будете внутри стены после столкновения. После некоторых усилий, я думаю, это работает довольно хорошо (включая катание вдоль стены, что является еще одной проблемой), но с движущимися стенами это даже немного сложнее.

...