XNA,更流畅的跳跃动画

本文关键字:跳跃 动画 XNA | 更新日期: 2023-09-27 18:28:54

我正在尝试在Movement测试中实现跳跃功能。我的角色跳了又跳,但很起伏,一点也不顺利。发生的事情是,他突出到自己的最大高度,然后平稳下来。

我能发现问题,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;
}

XNA,更流畅的跳跃动画

我发现执行跳转的最佳方法是实现一个将处理acceleration的属性。

要做的事情的简要列表:

  1. 创建一个存储当前Y速度的特性
  2. 每走一步,将Y速度增加一个设定量——通常由某个地方的gravity属性表示
  3. 每一步以Y速度递增Y位置1
  4. 当你跳跃时,只需从Y速度中减去1一个所说的量,这将使你的玩家以放松的动作向上跳跃(当他到达跳跃的最高点时,快速开始并减速)。因为你总是增加Y速度,你最终会反转方向并返回到曲面
  5. 触摸曲面时,将Y速度重置为零

1很确定Y轴在XNA中是反转的(我在Flash中工作),所以在我说增加Y速度的地方,你可能需要减少它——从中减去它来跳跃也是一样的。

我快速跳跃的一般方法是使用出血值使移动看起来稍微更平滑。我现在看不到任何代码/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值的计算应该有一点随机性,可能使用重力值,以使其看起来正确,但这会在跳跃上升和下降时产生加速/减速的错觉。

一开始上升得很快,然后下降,最后又开始下降,速度会加快。底部的夹子将是你的最大垂直速度。

我只是在工作中把这件事记在脑子里,所以如果这不是你想要的,我很抱歉,但我试着把它写得更笼统一点。希望能有所帮助。