C# XNA 2D 平台跳跃逻辑

3
我正在开发一款2D平台游戏,旨在作为学习实验。目前在跳跃逻辑方面遇到了一些问题。我明白应该对玩家应用重力,以影响跳跃和下降过程。这是我目前的实现方式。 isJumping 是一个布尔值,我用它来知道玩家是否应该向上或向下移动,以及他们当前是否处于跳跃状态,这样他们就不会再次跳起来。 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并且永远不会停止。我在这里做错了什么?这只是完全错误的做法吗?

2个回答

12
很遗憾,这基本上是完全错误的。你了解“位置”、“速度”和“加速度”吗?
速度是时间内位置的变化量。加速度是时间内速度的变化量。重力是向下的加速度,因此物体下落时速度会加快。
以下是一些可能有助于说明这个概念的代码:
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;

如果你使用这段代码将一个物体向上射击,你可以获得一个(几乎)真实的轨迹。这是跳跃的一个很好的起点。
开始跳跃最简单的方法是在按下跳跃键时添加一些向上的速度。上述代码将使角色回落。
然而值得注意的是,好的平台游戏采用了很多技巧来使跳跃感觉更好。特别是通过按住跳跃按钮的时间来调节跳跃高度。重要的是让这个过程感觉灵敏,让玩家立即开始向下移动。一个快速的方法是将速度设置为零,并在玩家向下移动时施加额外的重力。但这确实是你必须调整的东西。

谢谢您的见解。我会采用这个方案,看看能得到什么结果,并发布我的成果。 - Eric

0
你在使用什么进行碰撞检测和响应?这会对结果产生一定影响。不过,至少需要速度和位置信息。一个例子可能是:
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添加到X部分的Velocity中。对于左键,请执行相反的操作(减去它),并修改上下的Y。这将导致滑动效果,就像在冰上一样。对于重力,只需在每个时间步骤中添加少量到Y部分,使玩家“掉落”。

要使玩家跳跃(简单方法),只需在按下空格键时将Y速度设置为-5或其他值。角色将向上移动,最终因为之前提到的“重力”而下落。


我的第一个真正的SO答案,如果有点混乱请见谅。 - William Osborne
你可以通过点击其下的 [编辑] 按钮来查看答案标记。祝你在以后的回答中好运! - user1306322

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