XNA,更平滑的跳跃动画

时间:2012-03-26 02:20:58

标签: c# .net xna game-physics

我正在尝试在我的运动测试中进行跳跃功能。我的角色跳了起来然后回来了,但是它非常波涛汹涌而且根本不光滑。 结果是他突然达到他的最大高度,然后顺利下来。

我可以发现问题,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 个答案:

答案 0 :(得分:3)

我发现跳跃的最佳方法是实现一个处理acceleration的属性。

简要列表:

  1. 创建一个存储当前Y速度的属性。
  2. 每步增加一定量的Y速度 - 通常由gravity属性表示。
  3. 每步增加 1 Y位置的Y速度。
  4. 当你跳跃时,只需从Y速度中减去 1 所说的数量 - 这将使你的玩家以缓和动作跳起来(当他达到高位时开始快速和慢速)的跳跃)。因为你总是递增Y速度,所以最终会反转方向并返回到表面。
  5. 触摸曲面时,将Y速度重置为零。
  6. 1 很确定Y轴在XNA中是反转的(我在Flash中工作),所以我说增加Y速度你可能需要递减它 - 相同的减去它的交易跳。

答案 1 :(得分: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值应该用更多的随机性计算,可能使用重力值,以使其看起来正确,但这会产生加速/减速的幻觉,随着它们的上升和下降。

起步非常快,开始减速并最终再次下降,这将加速。底部的夹子将是您的最大垂直速度。

我刚刚在工作中写下了这个,所以道歉,如果它不是你想要的,但我试着保持它更一般。希望它有所帮助。