Так что мой вопрос прост, и я полагаю, что все сводится к тому, насколько анальным вы хотите быть при обнаружении столкновений. Для простоты, давайте предположим, что мы говорим о 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. Что думают люди?