Как сделать прыжок персонажа?

В настоящее время я делаю игру на C #, используя Direct X 9.0. Игровой римейк - Donkey Kong NES. У меня почти все завершено, но у меня проблемы с физикой прыжка Марио. У меня есть переменные, объявленные для координат Y и X.

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

В настоящее время у меня есть переменная bool, которая проверяет, была ли нажата W, а затем запускает любой код, чтобы заставить его прыгать. Я возился, например.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

Что не так хорошо работает. Я искал высоко и низко для ответа, и теперь я в отчаянии, если кто-то может указать мне в правильном направлении на простое решение. Это было бы прекрасно. Большое спасибо за любые ответы.

38 голосов | спросил Sarah 25 Maypm12 2012, 19:21:28

2 ответа


79

Прежде всего, 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
}

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

Переменная высота Перейти

Но такие игры, как Mario и Sonic, имеют переменный прыжок, где высота прыжка зависит от того, как долго вы нажимаете кнопку вниз. В этом случае вам придется обрабатывать как нажатие , так и отпускания клавиши перехода. Вы можете добавить что-то вроде:

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/

ответил David Gouveia 25 Maypm12 2012, 19:54:29
0

Как в физике. Только на данный момент вы нажимаете клавишу 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, зависит ваше воображение. Velocity должен получить меньший весовой ослик в воздухе, чтобы он выглядел хорошо.

ответил user712092 25 Maypm12 2012, 21:41:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132