c# XNA 2D平台跳跃逻辑

本文关键字:跳跃 平台 XNA 2D | 更新日期: 2023-09-27 18:01:50

我正在制作一款2D平台游戏作为学习实验,目前在跳跃逻辑上遇到了一点麻烦。我理解重力应该作用于玩家身上,这会影响跳跃和下降的过程。以下是我目前如何实现它的。

isJumping只是一个bool,我用它来知道玩家是应该向上还是向下,以及他们目前是否在跳跃中,所以他们不会再跳了。

spriteJumpPosition是我用来限制玩家跳跃的高度的值(默认为0,上限为10在下面硬编码)。

void UpdateGravity()
    {
        // Check if player is currently jumping
        if (isJumping == true)
        {
            if (spriteJumpPosition < 10)
            {
                spritePosition.Y += (float)gravity;
                spriteJumpPosition += gravity;
            }
            else if ( spriteJumpPosition >= 10 )
            {
                isJumping = false;
                spritePosition.Y -= (float)gravity;
                spriteJumpPosition -= gravity;
            }
        }
        else if ( isJumping == false )
        {
            if (spriteJumpPosition > 0)
            {
                spriteJumpPosition -= (int)gravity;
                spritePosition.Y -= (float)gravity;
            }
        }
    }

使用上述代码,当前的行为是玩家向下移动一点(可能是2-3帧),然后开始向上移动,使用isJumping = false并且永远不会停止。我哪里做错了?这是完全错误的做法吗?

c# XNA 2D平台跳跃逻辑

恐怕完全错了。你知道位置速度加速度吗?

速度是位置随时间的变化。加速度是速度变化量除以时间。重力是向下的加速度,因此物体下落时速度更快。

下面的一些代码可能有助于说明这个概念:

Vector2 position;
Vector2 velocity;
readonly Vector2 gravity = new Vector2(0, -9.8f);
// Update:
float time = (float)GameTime.ElapsedGameTime.TotalSeconds;
velocity += gravity * time;
position += velocity * time;

如果你用这段代码向上发射一个物体,你可以得到一个(几乎)真实的轨迹。这是一个很好的跳跃起点。

开始跳跃的最简单方法是在按下跳跃键时增加一些向上的速度。上面的代码将把字符拉下来。

然而值得注意的是,优秀的平台游戏会使用许多技巧来使跳跃感觉更好。最特别的是,跳跃的高度可以通过按下跳跃按钮的时间来调节。通过让玩家立即开始向下移动,让玩家感受到响应性是很重要的。一种快速的方法是将速度设置为零,并在玩家向下移动时施加额外的重力。但这是你必须调整的

您使用什么来进行碰撞检测/响应?这会有一点影响。然而,你至少需要速度和位置。例如:

class Player 
{
    Vector2 Position;
    Vector2 Velocity;
}
// in the constructor:
Position = new Vector2 (YOUR POSITION HERE);
Velocity = Vector2.Zero;

然后每个时间步都将Velocity添加到Position(创建一个Player.Update()方法并从默认的Update方法调用它)。然后,当您想移动时,将每个时间步添加到Velocity。例如,检测何时按下右键,并将0.5f添加到VelocityX部分。对左键做相反的操作(减去它),并修改Y为上下键。这会造成滑动的效果,就像在冰上一样。对于重力,只需在每个时间步骤中添加少量的Y部分,以使玩家"下落"。

要让玩家跳跃(最简单的方法),只要在按下空格时将Y的速度设置为-5或其他速度即可。角色会向上移动,最终因为你的"重力"而下落。