跳跃比重力

时间:2011-12-01 03:36:14

标签: c# xna physics

我正在开发我的第一个XNA 2D游戏,我遇到了一些问题。 如果我跳,我的精灵跳跃但不会跌倒。 而且我还有另一个问题,用户可以按住空格键跳到他想要的高度,我不知道如何阻止他这样做。这是我的代码: 跳跃:

    if (FaKeyboard.IsKeyDown(Keys.Space))
        {
            Jumping = true;
            xPosition -= new Vector2(0, 5);
        }

        if (xPosition.Y >= 10)
        {
            Jumping = false;
            Grounded = false;
        }

真正简单的基本重力:

    if (!Grounded && !Jumping)
        {
            xPosition += new Vector2(1, 3) * speed;
        }

这里是通过碰撞将接地设置为True或False的地方

    Rectangle MegamanRectangle = new Rectangle((int)xPosition.X, (int)xPosition.Y, FrameSizeDraw.X, FrameSizeDraw.Y);
        Rectangle Block1Rectangle = new Rectangle((int)0, (int)73, Block1.Width, Block1.Height);
        Rectangle Block2Rectangle = new Rectangle((int)500, (int)73, Block2.Width, Block2.Height);

        if ((MegamanRectangle.Intersects(Block1Rectangle) || (MegamanRectangle.Intersects(Block2Rectangle))))
        {
            Grounded = true;
        }
        else
        {
            Grounded = false;
        }

接地的布尔和重力已经过测试并且正在工作。 有什么想法吗? 在此先感谢您,不要犹豫,询问您是否需要另一部分规范。

4 个答案:

答案 0 :(得分:5)

处理跳跃的一种相对简单的方法是将重力作为矢量并以跳跃/移动的方式实现。

例如:

foreach (Object obj in GameWorld)
{
    obj.Velocity *= 0.5; // Slow it down slightly
    obj.Velocity += GravityPerSecond * FrameTime; // Gravity adjusted for time
    obj.Move(obj.Velocity); // Handle collision and movement here
}

速度应该是一个与世界尺寸相同的矢量,并移动一个方法,在给定的矢量中尽可能地移动物体。

跳转代码:

OnKeyDown(Key k)
{
    if (k == Key.Space)
    {
        obj.Velocity += Vector2(0, 10); // Add an upward impulse
    }
}

这将使对象向上移动一点,然后开始下降。您可以对其他效果(运动,爆炸,碰撞)使用类似的冲动。当两个物体碰撞时,你需要碰撞修改速度,以便弹跳。

这是一个非常简单的物理系统,它将使未来的变化更加简单,并且可以允许一些有趣的关卡设计(改变重力等)。它通过将复杂的IsJumping代码抽象为单一机制来简化处理跳转。

为了防止在没有站立在物体上的情况下跳跃,您需要进行碰撞测试,或者在物体碰撞/停止向下碰撞时进行追踪。也可以检查物体的垂直速度是否为零并且仅允许跳跃(在下降或向上移动时防止跳跃)。

答案 1 :(得分:2)

我相信这可能就是答案:

改变你的

    if (FaKeyboard.IsKeyDown(Keys.Space))
    {
        Jumping = true;
        xPosition -= new Vector2(0, 5);
    }

    if (xPosition.Y >= 10)
    {
        Jumping = false;
        Grounded = false;
    }

    if (!Jumping && FaKeyboard.IsKeyDown(Keys.Space))
    {
        Jumping = true;
        Grounded = false;
    }

    if (Jumping)
    {
        xPosition -= new Vector2(0, 5);
    } 

    if (xPosition.Y >= 10)
    {
        Jumping = false;
    }

使用速度给出的其他答案确实是更好的方法,但这可能足够接近让你重新开始。

答案 2 :(得分:1)

这是一个非常质朴的解决方案,可以让跳跃起伏​​不定:

const float SCALE = 20.0f; //SPEED!!!
if (jump <= 15 && jump != 0)
            {
                humanPosition.Y -= SCALE * speed;
                jump++;
            }
            else if (jump > 15)
            {
                humanPosition.Y += SCALE * speed;
                jump++;
                if (jump == 32)
                {
                    jump = 0;
                    humanPosition.Y = 307;
                }
            }

激活
            else if (keyboard.IsKeyDown(Keys.Up))
        {
            jump = 1;
            humanPosition.Y -= SCALE * speed;
        }

这样做是通过将跳转设置为1来设置跳跃 此外,如果您想限制只在角色在地面时跳跃,您可以添加类似于此

的条件
if (humanPosition.Y != GROUNDLEVEL){}

答案 3 :(得分:0)

跳跃不应该是布尔值,除非你需要它来制作动画或只能在跳跃时使用的能力。

相反,你应该使用矢量移动,当玩家触地并按下他们的跳跃按钮时,向你的动作添加向上跳跃矢量。

然后,重力需要成为一个向下的向量,对付玩家并且它会处理自己。