Как мне справиться с Изометрическим обнаружением столкновений?

14

Я хотел бы сделать изометрический платформер в стиле бег-прыжок. Игрок должен иметь возможность прыгать на верхнюю часть платформ над полом, ударять в сторону предметов и т. Д.

Я буду использовать движок 2D игры, поэтому я не хотел бы эмулировать полное столкновение 3D для измерений, которые я не использую.

Я думаю, что объекты в игре должны быть размещены с использованием: X, Y, ширина, высота и Z для глубины.

Используя эти значения, как я должен обнаружить столкновения?

jdeseno
источник
Я знаю, что это общий вопрос, но я хотел бы получить более подробные ответы или ссылки на хорошие учебные ресурсы.
jdeseno

Ответы:

19

2 варианта:

  • Вы можете рассматривать это как трехмерную игру с фиксированной орфографической камерой. Тогда вы можете использовать любые стандартные ресурсы 3D-игр / книги / учебники / библиотеки. Даже если он отображается в 2D со спрайтами, математика для движения и т. Д. Все равно будет 3D за сценой. Это даст вам самые точные результаты.

  • Вы могли бы рассматривать это как нисходящую 2D-игру с дополнительным свойством высоты. Например, представьте двумерную сетку, где каждая плитка имеет значение высоты. При переходе от одной плитки к другой вы позволяете персонажу переходить на конкретную плитку только в том случае, если ноги персонажа выше или равны высоте этой плитки, но если они прыгают и гравитация опускает их сверху плитки, вы пусть они остаются там. Приложив немного больше работы, вы можете сделать это, чтобы вы могли ходить под мостами и т. Д.

Iain
источник
4

Есть много способов упростить это. Например, если вы не разрешили слои (например, мост, по которому вы можете проходить и проходить, и под ним, вы можете сделать все обнаружение столкновений в измерениях X / Y, где вы отфильтруете набор столкновений по любому из его высоты + глубины). или выше.

ironfroggy
источник
2

Если игра основана на прямоугольной сетке, то эта сетка определяет ваши оси X / Y. И Z можно использовать для высоты.

Столкновения тогда более-менее просты, как любая 2D-игра на основе тайлов.

Тогда вам просто нужно конвертировать из сетки обратно в изометрические координаты экрана для рендеринга. Это довольно просто - но вам может понадобиться подумать о вычислении значений «глубины» для целей сортировки (рендеринг изометрической сцены сзади вперед)

bluescrn
источник
Использование Z для высоты противоречит инстинкту, но это правильно делать в 2D-играх сверху вниз. тогда вы можете повторно использовать код между играми с боку и сверху вниз.
Иан
2

Погуглив вокруг я нахожу это демо: http://planetskill.com/iso/

WASD, чтобы двигаться. Пробел, чтобы прыгать

Он реализует только столкновение с осью вверх / вниз, но добавить другое столкновение должно быть легко:

Если позиция вверх / вниз следующего шага выше вашего максимума, просто не двигайтесь. Это также должно позволить вам легко выполнять прыжки.

Пример кода здесь: http://gist.github.com/478997

NocturnDragon
источник
2

Все вышеперечисленное. Изометрические - это всего лишь сдвинутая двумерная сетка, поэтому рассматривайте ее как двумерную карту листов и придумайте способ кодирования глубины. Как бы вы сделали это в обычной 2d игре (имея возможность «прыгать» позади или перед блоками? Вы либо сохраняете глубину для плитки (глубина буфера -> буфер z), либо используете несколько слоев или, если вы хотите более изощренный, вы бы реализовали функцию обратного вызова для каждого типа плитки (или сопоставления) и могли бы делать все, что захотите, проверять глубину, проверять оборудование, перемещать игрока вокруг, заставлять игрока медленно двигаться вверх, форматировать HD.

Кая
источник
Хороший ответ, Кай - суть дела в том, что я удивлен, что никто другой не поднял этот вопрос. Это всегда то, что смущает новичков в изометрии в отношении физики.
инженер
1

Ну, у вас может быть отдельный слой столкновений выше вашего уровня, который не виден, и используйте его для проверки столкновения. Вы также можете использовать это для нескольких слоев, если вы знаете, на каком слое находится игрок;)


источник