XNA, более плавные анимации прыжков - PullRequest
4 голосов
/ 26 марта 2012

Я пытаюсь включить функцию прыжка в своем тесте движения.Мой персонаж прыгает и возвращается обратно, но он очень изменчивый и совсем не гладкий.Что происходит, он поднимается на максимальную высоту, затем плавно опускается.

Я могу определить проблему, цикл for не хочет хорошо играть с кодом.Однако я не знаю, как это обойти.Есть ли способ удержать кнопку нажатой и заставить его хорошо подпрыгнуть?

Код:

if (leftStick.Y > 0.2f && sprite.Position.Y == position.Y || isPressed(Keys.Up) == true && sprite.Position.Y == position.Y) 
            {
                if (wasLeft == true)
                {
                    sprite.CurrentAnimation = "JumpLeft";

                }
                else if (wasLeft == false)
                {
                    sprite.CurrentAnimation = "JumpRight";
                }

                //This for loop is my issue, it works but it's jumpy and not smooth.

                for (movement.PlayerHeight = 0; movement.PlayerHeight < movement.PlayerMaxHeight; movement.PlayerJump())
                {

                    sprite.Position.Y -= movement.PlayerJump();
                }
            }
            sprite.StartAnimation();
        }
        else
        {

            leftStick = NoInput(leftStick);
        }

private Vector2 NoInput(Vector2 leftstick)
{
if (sprite.Position.Y < position.Y) //(movement.PlayerSpeed > 0) 
            {
                sprite.Position.Y += movement.PlayerHeight;
                movement.PlayerHeight -= movement.Player_Gravity;

                //sprite.Position.Y += movement.PlayerSpeed;
                //movement.PlayerSpeed -= movement.Player_Decel;
            }
            else
            {
                sprite.Position.Y = position.Y;
            }
}

Класс движения:

public float PlayerMaxHeight = 15f;
public float PlayerHeight = 0;
public float Player_Gravity = 0.01f;
private const float Player_Jump = 0.35f;


public float PlayerJump()
{
    PlayerHeight += Player_Jump + Player_Gravity;
    if (PlayerHeight > PlayerMaxHeight)
    {
        PlayerHeight = PlayerMaxHeight;
    }
    return PlayerHeight;
}

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Лучший способ сделать прыжок, который я нашел, - это реализовать свойство, которое будет иметь дело с acceleration.

Краткий список того, что делать:

  1. Создать свойствокоторый хранит текущую скорость Y.
  2. Увеличивает скорость Y на установленную величину каждый шаг - обычно представлен где-то свойством gravity.
  3. Увеличивает 1 Yпозиционируйте по скорости Y на каждом шаге.
  4. Когда вы прыгаете, просто вычтите 1 указанное количество из скорости Y - что заставит вашего игрока подпрыгнуть в замедляющем движении (начать быстро и замедляться, когда он достигает максимума прыжка).Поскольку вы всегда увеличиваете скорость Y, вы в конечном итоге поменяете направление и вернетесь к поверхности.
  5. При касании поверхности сбросьте скорость Y на ноль.

1 Уверен, что ось Y инвертирована в XNA (я работаю во Flash), поэтому, когда я говорю, увеличивайте скорость Y, вам может понадобиться уменьшить ее вместо - то же самое для вычитания из нее, чтобы прыгнуть.

2 голосов
/ 04 апреля 2012

Мой общий подход к быстрому прыжку состоит в том, чтобы использовать значение спуска, чтобы сделать движение немного более плавным.Сейчас я не могу посмотреть ни один код / ​​xna, но моей первой мыслью было бы что-то вроде ниже.

Определение переменных:

float bleedOff = 1.0f;
bool jumping = false;

Обновление ввода:

if(input.JumpKey())
{
    jumping = true;
}

Прыжковое обновление:

if(jumping)
{
    //Modify our y value based on a bleedoff
    //Eventually this value will be minus so we will start falling.
    position.Y += bleedOff;
    bleedOff -= 0.03f;

    //We should probably stop falling at some point, preferably when we reach the ground.
    if(position.Y <= ground.Y)
    {
        jumping = false;
    }
}

bleedOff = MathHelper.Clamp(bleedOff, -1f, 1f);

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

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

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

...