Напружений стрибок


12

Є одне, що мене спантеличує, і це те, як здійснити «штучний імпульс» стрибок у платформері. Якщо ви не знаєте, про що я говорю, то подумайте про стрибки Маріо, Кірбі та Цитата з Cave Story. Що у них спільного? Ну, висота вашого стрибка визначається тим, як довго ви тримаєте натиснуту кнопку стрибка.

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

Моя поточна реалізація працює наступним чином:

введіть тут опис зображення

Під час натискання кнопки стрибка гравітація вимикається, а Y-коорденат аватара зменшується на постійне значення сили тяжіння. Наприклад, якщо речі падають на Z одиниць на галочку, вона зросте Z одиниць на галочку.

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

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

введіть тут опис зображення

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

Також я хотів би, щоб його презентація уникала кодування, що залежить від мови; як, поділіться нами прикладом C ++ або Delphi ... Стільки, як я використовую рамку XNA для свого проекту і не заперечую проти матеріалів C #, у мене не вистачає терпіння читати код інших, і я певні розробники ігор інших мов будуть зацікавлені у тому, чого ми тут досягаємо, тому не заважайте дотримуватися псевдо-коду.

Заздалегідь дякую


3
Чи переглянули ви наступне питання та його відповіді? gamedev.stackexchange.com/questions/29617 / ...
bummzack

@bummzack Це дуже ясно також.
Муто

1
Можливий дублікат керованості стрибками та гравітації Хоча в ньому немає гарних зображень, це те саме питання.
MichaelHouse

Відповіді:


8

Я думаю, що ваша головна проблема полягає тут:

Під час натискання кнопки стрибка гравітація вимикається, а Y-коорденат аватара зменшується на постійне значення сили тяжіння. Наприклад, якщо речі падають на Z одиниць на галочку, вона зросте Z одиниць на галочку.

Гравітація не працює так. Google "рівномірно прискорив рух" для деталей, але просто кажучи, як сказав інший колега, гравітація - це прискорення, а не швидкість.

Простіше кажучи, тоді як швидкість - це постійна швидкість зміни положення з часом, прискорення - це постійна швидкість зміни швидкості в часі.

Отже, вашим першим замовленням бізнесу було б змінити свій алгоритм падіння, щоб він включав прискорення, а не просто швидкість. Замість:

pos_y = pos_y + (velocity_y * time_difference)

вам доведеться зробити щось подібне

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

Таким чином все впаде в параболу, що є фізично правильним рухом.

Тепер, щоб здійснити прості стрибки (ми дізнаємось точне запитання відразу після цього), ви просто встановите velocity_yпотрібне значення. Поки знак acceleration_yі бажане вами velocity_yбудуть різними, ваш об’єкт буде стрибати правильно (Іншими словами, ви не «відключаєте гравітацію». Ви продовжуєте його і просто встановлюєте швидкість об’єкта на деяку заздалегідь задану величину).

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

Для цього ви робите те саме, що і раніше, але тепер прискорення і швидкість повинні мати той самий знак. Ви робите це під час натискання кнопки:

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

Рішення не затримувати гальмування. Коли ви кидаєте кульку в повітря, вона не рухається зі постійною швидкістю, поки не досягне максимальної висоти, а сповільнюється з моменту імпульсу.

Гравітація - це не швидкість, а прискорення. Отже, якщо гравець має швидкість вгору на 20 одиниць, а гравітація становить -10 одиниць, на наступному галочці швидкість вгору буде 10 одиниць, на наступній - 0 одиниць тощо.

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

Щоб ваш гравець міг контролювати висоту свого стрибка, гравцеві слід надати деяку початкову швидкість імпульсу, гравітацію слід вимкнути, а для швидкості гравця слід застосувати спеціальне значення сили тяжіння (менше, ніж звичайна гравітація). Після того, як кнопка стрибка відпущена або швидкість гравця досягне 0, слід застосувати нормальну гравітацію.

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


2

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

Я спробував декілька підходів при здійсненні стрибків:

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

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

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

Спробуйте їх і подивіться, що почуває себе найкраще.

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