Хорошая 2D физика платформера [закрыто]

76

У меня есть базовый контроллер персонажей, настроенный для 2D-платформера с Box2D, и я начинаю настраивать его, чтобы он чувствовал себя хорошо. У физических движков есть множество настроек, и мне не ясно, пишу ли я с физическим движком впервые, какие из них мне следует использовать. Должны ли прыжки применять силу для нескольких тиков? Импульс? Напрямую установить скорость? Как я могу остановить прилипание аватара к стенам, не убирая все его трение (или я убираю все трение, но только в воздухе)? Должен ли я моделировать персонажа как капсулу? Коробка с закругленными углами? Коробка с двумя колесами? Просто одно большое колесо? Я чувствую, что кто-то должен был сделать это раньше!

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

Некоторые примеры того, что я имею в виду:

  • Короткое нажатие прыжка прыгает на короткое расстояние; длинный кран прыгает выше.
  • Короткое занос при остановке или изменении направления движения на высокой скорости.
  • Устойчиво стоит на склонах (но, возможно, скатывается по ним при наклоне).
  • Аналоговая скорость при использовании аналогового контроллера.
  • Все остальное, что отличает хороших платформеров от плохих.
  • Смею ли я предложить, стабильные движущиеся платформы?

Я действительно не ищу "эй, сделай это". Очевидно, что правильная вещь зависит от того, что я хочу в игре. Но я надеюсь, что кто-то где-то рассмотрел возможности и сказал: «Хорошо, метод A хорошо работает с X, метод B хорошо работает с Y, но это не работает с C», или имеет несколько рабочих примеров за пределами «if (key = = пробел) character.impulse (0, 1) "

Джош
источник

Ответы:

25

Сложно реализовать, скажем, «Марио-подобную» физику, используя реальный физический движок.

В прошлый раз, когда я попробовал это, используя Бурундука, я смоделировал игрока как 2 круга - «круг тела» поверх «круга ног»

«Круг ног» имел некоторое трение, был не бодрым и довольно маленьким. «Круг тела» был больше и без трения, чтобы избежать прилипания к стенам / крутым склонам

Объект был ограничен, чтобы не допустить вращения - он просто скользил бы вокруг

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

Прошло много времени с тех пор, как я посмотрел на код, но поведение было примерно таким:

Когда на земле:

  • Примените «дополнительную гравитацию» (нисходящее усилие, чтобы помочь спускаться по склонам)
  • Применить трение о землю (большее количество горизонтального демпфирования)
  • Применить левую / правую силу движения, основываясь на элементах управления.
  • (Уменьшите левую / правую силу движения, приближаясь к максимальной скорости бега)
  • Если нажат прыжок, применить импульс вверх

Когда в воздухе:

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

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

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

bluescrn
источник
Я знаю, что это довольно старый ответ, но у меня есть несколько вопросов по этому поводу. 1) Как вы решаете «сохранять одинаковую скорость на любом склоне местности?» 2) Если вы используете маленький круг для ног и больший круг для тела, разве игрок не будет зависать по краям? Я действительно заинтересован в вашем подходе.
Notbad
18

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

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

тетрада
источник
Я делал это несколько раз в прошлом. Это работает до некоторой степени, но вы всегда заканчиваете тем, что выбрасываете что-то еще, потому что «слишком сложно» сделать физику правильно с хакерским контроллером. В этой конкретной игре я надеюсь задействовать некоторые пружинные / механические веревки для движения игрока, и это перешло в сферу «я бы лучше взломал настоящий физический движок», чем «я бы лучше взломал коробку» движитель».
3
Я бы предпочел взломать коробочный двигатель, по крайней мере, он не может работать нестабильно, в то время как физический двигатель имеет тенденцию взрываться, если вы на него слишком много сил, потому что вам нужно ограничить движения точными спецификациями (и ограничения физического движка в жесткие, они могут только попытаться выполнить так много). Кроме того, применение сил для решения одной нежелательной проблемы имеет тенденцию влиять на все остальное, приводя к адскому обману.
Кадж
10

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

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

Однако, если вы хотите что-то более высокотехнологичное, вполне возможно подойти к этому, используя полный физический движок. Вот техника, которую вы можете использовать (из Little Big Planet), которая делает персонажа игрока полностью интегрированной частью физического движка:

Вместо применения импульсов или установки скоростей для перемещения игрока в качестве «внешних входов» для физического движка, вы можете разработать ограничение, управляющее персонажем.

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

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

Надеюсь, это поможет!

Ура, Пол.

wildbunny
источник
6

Этот вопрос широко обсуждался на форумах Box2D. Читая обсуждения движений персонажей, прыжков или платформеров, вы обнаружите все возможные проблемы. Однако проблема достаточно усложнилась, и система фильтрации столкновений была обновлена, а пример Test Bed создан исключительно для того, чтобы показать, как это должно быть сделано.

deft_code
источник