XNA,更流畅的跳跃动画

4

我正在尝试在我的移动测试中添加跳跃功能。我的角色会跳起来,然后落下,但是这个过程非常不流畅。

问题在于,他会突然跳到最高点,然后平滑地落下。

我可以发现问题,在循环中的代码不能和其他代码协调工作。然而,我不知道如何解决这个问题。有没有办法让他愉快地跳起来?

代码:

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;
}

我猜这个在你的更新方法里面? - Rick Mogstad
糟糕,忘了提到。它是自己的方法(CheckInput),但会在每次更新时调用。 - Thegluestickman
2个回答

3
我发现最好的跳跃方式是实现一个属性来处理加速度。
以下是具体步骤:
1. 创建一个存储当前Y轴速度的属性。 2. 每一步增加Y轴速度,通常由某个表示重力的属性来代表。 3. 每一步增加Y轴位置以便于匹配Y轴速度。 4. 当你想要跳跃时,从Y轴速度中减去一定量。这会使你的角色向上跳动,呈缓出运动(快速开始,到达跳跃高点时减慢速度)。由于你总是在增加Y轴速度,你最终会改变方向并返回地面。 5. 当触碰到地面时,将Y轴速度重置为零。
注意:在XNA中,我相当确定Y轴是反转的(我使用Flash),所以当我说递增Y轴速度时,您可能需要将其递减-同样适用于从中减去以进行跳跃。

2

我的一般方法是使用排气阀来使运动看起来更加平滑,以便快速启动。我现在无法查看任何代码/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值应该使用更多的随机性进行计算,可能使用重力值,以使其看起来正确,但这将产生加速/减速的错觉,当它们上升和下落时。一开始很快上升,然后减速并最终开始下降,这将加速。底部的夹子将是您的最大垂直速度。
我在工作中想到了这个,所以如果不是你要找的,我很抱歉,但我尽量让它更加通用。希望能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接