【问题标题】:C# XNA 2D Platformer Jumping LogicC# XNA 2D 平台跳跃逻辑
【发布时间】:2016-05-31 13:01:09
【问题描述】:

我正在开发 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


    【解决方案1】:

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

    速度是位置随时间的变化。加速度是速度随时间的变化。重力是一种向下的加速度,因此物体下落时会变得更快。

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

    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;
    

    如果您使用此代码向上拍摄一个物体,您可以获得(非常)逼真的轨迹。这是一个很好的跳跃起点。

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

    但值得注意的是,优秀的平台游戏会使用很多技巧来让跳跃感觉更好。尤其是跳跃的高度可以通过按下跳跃按钮的时间来调节。通过让玩家立即开始向下移动,让这种感觉反应灵敏是很重要的。一个快速的方法是将速度设置为零并在玩家向下移动时施加额外的重力。但这确实是您必须调整的。

    【讨论】:

    • 感谢您的洞察力。我会用这个运行,看看我能从这里得到什么并发布我的结果。
    【解决方案2】:

    您使用什么进行碰撞检测/响应?那会有点影响。 但是,您至少需要速度和位置。一个例子可能是:

    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 或按下空格时的其他值。角色会向上移动,最终会因为前面提到的“重力”而跌落。

    【讨论】:

    • 我对 SO 的第一个真正答案,如果有点乱码,请见谅
    • 您可以通过按下下方的edit 按钮查看答案标记。祝你未来的答案好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多