Як змусити стрибнути характер?


44

Зараз я роблю гру в C # за допомогою Direct X 9.0. Рімейк гри - Donkey Kong NES. У мене майже все завершено, але у мене проблеми з фізикою стрибка Маріо. У мене є змінні, оголошені для координат Y і X.

Мені було цікаво, чи існує простий метод цього зробити. Я шукав відповідь високого та низького рівня, але знайдені відповіді або не мають значення / або використовують іншу мову програмування, наприклад XNA.

В даний час у мене встановлена ​​змінна bool, щоб перевірити, чи натиснуто W, це спровокує будь-який код, щоб змусити його стрибнути. Я возився навколо таких, як.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

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


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

Відповіді:


84

Перш за все, XNA теж використовує C #, щоб це та сама мова програмування. І хоча базовий API може мати деякі відмінності від DirectX, це не має нічого спільного із стрибками, тому тут повинні застосовуватися ті самі навчальні посібники чи відповіді. Також існує численні способи їх здійснення, залежно від безлічі факторів. Те, що я опишу нижче, - лише одна з можливостей.

Основні вимоги до фізики

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

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

Стрибок з фіксованою висотою

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

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

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

Перемінний перехід по висоті

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

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

Підстроювання всіх цих значень (тобто числа , як 0.5, -12.0fабо -6.0f) в коді вище ви можете змінити вигляд вашого стрибка, як високо він підскакує, скільки імпульсу він тримає навіть після відпускання кнопки стрибка, як швидко він падає, і т.д. .

Важливо Не називайте ці функції кожен кадр. Зателефонуйте їм лише один раз, коли натиснути або відпустити клавішу. Інакше ваш персонаж полетить замість стрибка.

Робочий приклад

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

http://jsfiddle.net/LyM87/


11
Можна також скористатися можливістю поділитися цією дивовижною статтею, написаною кілька днів тому, інформацією, що стосується цієї теми: Посібник із впровадження 2D платформерів . А також це: Сонічні стрибки .
Девід Гувейя

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

@Jeff Це також привернуло мою увагу, і саме тому я згадав, що існує кілька способів його реалізації. Перша стаття описує два додаткові способи вирішення однієї і тієї ж проблеми, тоді як описаний нами спосіб базується на другій статті. Я не знаю, як вони порівнюють один одного, хоча будь-який з них досить просто здійснити. Зрештою, я вибрав цей метод, тому що це було легше пояснити, і не потрібно було додавати таймер або мати справу з численними імпульсами зменшувальних величин.
Девід Гувейя

Відповідь може змінюватися залежно від конкретної гри та кількості анімацій, які ви хочете зробити. Metroid використовує постійний стрибок швидкості: / спуск, але маскує його високоякісною анімаційною роботою, щоб він виглядав гладким і «вигнутим» у зеніті. Багато інших платформерів використовують стрибки зі змінною швидкістю, які потребують більше роботи, щоб вона добре працювала.
Шон Міддлічч

1
це було дуже корисно, через 5 років :) і ця загадка дуже крута - я повинен навчитися JS!
Флюїдність

1

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

Якщо ви не хочете, щоб персонаж стрибав щоразу, коли він потрапляє на землю - тому що ви тримаєте jump key- додайте jump key is being pressedзмінну, яку ви очистите після того, як jump keyбуде випущено та встановлено після. Псевдокод:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

Якщо я використовував Твій шлях:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

Як donkey.yзміниться, залежить від вашої фантазії. Швидкість повинна набирати менше повітряного осла в повітрі, щоб він виглядав добре.

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