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


76

У мене є базовий контролер символів, створений для 2D-платформи з Box2D, і я починаю налаштовувати його, щоб спробувати зробити це добре. У фізичних двигунів є багато ручок для підключення, і мені не зрозуміло, вперше пишу з двигуном фізики, якими саме я повинен користуватися. Чи слід стрибати застосувати силу для кількох кліщів? Імпульс? Прямо встановлена ​​швидкість? Як я зупиняю аватар, щоб він не прилипав до стін, не віднімаючи все його тертя (або я забираю все тертя, але тільки в повітрі)? Чи варто моделювати персонажа як капсулу? Ящик із закругленими кутами? Коробка з двома колесами? Всього одне велике колесо? Я відчуваю, що хтось, мабуть, робив це раніше!

Здається, в Інтернеті є дуже мало ресурсів, які не є "першою фізикою дитини", і все це відсікається там, де я сподіваюся, що хтось уже вирішив питання. Більшість прикладів фізичних двигунів для платформерів мають плаваюче відчуття, або стрибки в повітрі, або легко експлуатаційну поведінку, коли тимчасове проникнення занадто велике тощо.

Деякі приклади того, що я маю на увазі:

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

Я не дуже шукаю "ей, роби це". Очевидно, що правильна річ залежить від того, що я хочу в грі. Але я сподіваюся, що хтось десь переглянув можливості і сказав: "добре техніка A має функцію X добре, техніка B добре Y, але це не працює з C", або є кілька відпрацьованих прикладів поза "if (key = = пробіл) символ.імпульс (0, 1) "

Відповіді:



25

Досить складно реалізувати, скажімо, «маріоподібну» фізику за допомогою справжнього двигуна фізики.

Востаннє, коли я спробував це, використовуючи Бурундук, я моделював програвача як два кола - "коло тіла" поверх "кола ніг"

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

Об'єкт був обмежений, щоб не допустити обертання - він просто ковзав навколо

Якщо "ноги" доторкнулися до чогось або знаходилися в останніх кількох кадрах (щоб дозволити падіння схилів), гравець вважався на землі (можливо, він також мав перевірити поверхневу нормальну перевірку)

Минув час, коли я подивився на код, але поведінка була такою:

Коли на землі:

  • Застосовуйте "додаткову силу тяжіння" (сила вниз, щоб допомогти бігти по схилах)
  • Застосовують тертя про землю (більша кількість горизонтального демпфування)
  • Застосовуйте силу руху вліво / вправо, спираючись на елементи управління.
  • (Масштабуйте рух вліво / вправо, коли наближається до максимальної швидкості ходу)
  • Якщо стрибок натиснений, подайте імпульс вгору

Коли в повітрі:

  • Застосовуйте опір повітря (невелика кількість горизонтального демпфування)
  • Застосовуйте регулярну (або зменшену) гравітацію
  • Застосовуйте силу руху вліво / вправо, якщо ви дозволяєте керувати повітрям

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

Хоча кілька інших речей, на які слід бути уважними ... Платформи, що перескакують, важко реалізувати, і коли ви починаєте робити цікаві речі (переміщення платформ, обертові світи тощо), ви повинні бути обережними переконайтесь, що гравець не може потрапити в пастку / роздавлений будь-яким рухомим об’єктом, що рухається анімацією.


Я знаю, що це досить стара відповідь, але у мене є деякі питання з цього приводу. 1) Як ви вирішуєте "зберігати однакову швидкість незалежно від схилу місцевості, на якій ви знаходитесь?" 2) Якщо ви використовуєте маленький гурток для ніг і більший круг для тіла, чи не став би гравець кілька разів повішеним на ребрах? Мені дуже цікаво ваше заступництво.
Нотбад

18

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

Просто напишіть все самі. Ви отримаєте набагато кращі результати, сказавши "переміщення символу вгору на x одиниць у цій формі параболи при утримуванні кнопки стрибка на довжину y", ніж за допомогою пучка ґудзиків.


Я робив це кілька разів у минулому. Це працює до певної мети, але ви завжди закінчуєте викидати щось інше, тому що це "занадто важко", щоб правильно робити фізику за допомогою хакі-контролера. У цій грі я сподіваюся залучити деяку механіку весни / мотузки для руху гравця, і це перейшло в царину "Я б швидше зламав справжній двигун фізики", а не "Я б швидше зламав коробку" двигун ".

3
Я б швидше зламав перемикач коробки, принаймні він не може стати нестабільним, тоді як фізичний двигун має тенденцію вибухнути, якщо кинути на нього занадто багато сил, тому що вам потрібно обмежувати рухи на точні характеристики (а обмеження двигуна фізики не вдається) t жорсткі, вони можуть намагатися виконувати лише стільки). Крім того, застосування сил для вирішення одного небажаного питання, як правило, впливає на все інше, що призводить до виправлення пекла.
Кай

10

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

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

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

Замість того, щоб застосовувати імпульси чи задавати швидкість для переміщення гравця як «зовнішніх входів» до фізичного двигуна, ви можете розробити обмеження, яке керує символом.

Таким чином, це обмеження матиме бажану швидкість та напрямок гравця як вхід (від гри) та моделюватиме такі речі, як максимальна сила та швидкість гравця. Обмеження намагатиметься перемістити гравця відповідно до його входів (і підкоряючись максимумам), а оскільки його обмеження буде застосовувати рівну і протилежну силу на об'єкт, на якому гравець стоїть, тим самим дозволяючи гравцеві стояти на рухомих платформах і впливати на речі, які він рухає.

Виконуючи такі речі, ви зможете змусити гравця повністю стикатися з такими ситуаціями, як перебування під величезною купою коробок або перестрибування через декілька рухомих платформ, оскільки він тепер є основною частиною фізичного двигуна.

Сподіваюся, що це допомагає!

Ура, Пол.


6

Це питання набуло значного обговорення на форумах Box2D. Читаючи, хоча дискусії про рух персонажів, стрибки або платформер, ви стикаєтесь з усіма можливими питаннями. Однак ця проблема склалася досить складно, що система фільтрації зіткнень була оновлена ​​і приклад тестового шару створений виключно для того, щоб показати, як це потрібно робити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.