Як обробляти рухомі платформи в ігровій платформі?


15

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

Відповіді:


16

Моє рішення полягало б у тому, щоб розглядати кожну фізичну сутність на ігровій карті як вузол дерева , а саму карту - як кореневий вузол . Вузли можуть містити інші вузли. Кожен вузол міститься (прямо чи опосередковано) всередині вузла карти.

Наприклад, скажімо, ваш персонаж стоїть на платформі. Вузол платформи містить вузол символу. Отже, щоразу, коли платформа рухається, вузли, які вона містить (в даному випадку персонаж), також будуть переміщуватися.

Щоб це сталося, кожен вузол повинен мати положення (x, y) щодо батьківського вузла . Наприклад, ваш персонаж може бути розташований на рівні (1,0) відносно платформи, яка сама може бути розташована (10,10) відносно ігрової карти. Таким чином, якщо платформа рухатиметься, ваш персонаж рухатиметься неявно.

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

(положення символу) + (положення батьківського вузла) + (положення кореневого вузла) = (1,0) + (10,10) + (0,0) = (11,0)

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

Коли він знову приземлиться, приєднайте його до будь-якого вузла, на якому він приземлився.


1
Я також використовував би швидкість x і y від вузла, щоб вплинути на плеєр. Приклад 1: Платформа рухається дуже швидко і зупиняється, гравець має імпульс вгору і запускається. Приклад 2: платформа рухається вниз трохи повільніше, ніж гравець, що падає зі смертельною швидкістю. Платформа повинна бути безпечно приземлитися на замість SPLUT
AttackingHobo

Це цікавий підхід, але, здається, цілком повна зміна мого двигуна просто для того, щоб дозволити рухомим платорам. Можливо, якщо я створю objectOnPlatform як компонент, який я можу до будь-якого об'єкта, який просто тимчасово дає цей ефект?
Iain

10

Я б запропонував трактувати це як проблему псевдофізики та вирішити її за допомогою тертя про землю.

Ви вже використовуєте гравітацію, щоб утримувати персонажа на землі, це обробляє ситуації, коли платформи рухаються вгору і вниз. Щоб обробити лівий і правий рух, земля повинна відчувати сильне тертя щодо персонажа. Зазвичай цей рівень тертя становив би 1,0 або 100%.

Якщо персонаж стоїть нерухомо, то їх швидкість дорівнює 0, і вони замість цього наслідують 100% швидкості платформи через тертя. Щось таке:

character_velocity = friction * platform_velocity

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

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


0

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

Напевно, було б краще (і простіше) прив’язати програвача до платформи, так що коли платформа рухається + x / + y, гравець рухається стільки ж.

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