Импульсный прыжок


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 Это тоже очень хорошо.
Mutoh

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.