XNA Platformer - 走出平台后不会堕落

时间:2013-02-09 01:19:30

标签: c# xna collision-detection

我目前正在开发基于C#for XNA的平台游戏项目。

当角色走出平台时,我的问题就出现了。他应该堕落,但不会。我现在正在使用一系列bool; jumpBool,fallBool,groundBool和一个静态bool,它使用矩形帮助器确定他是否在平台上。

确定他所处的跳跃状态的代码如下。

    if (onGround == true)
        {
            fallBool = false;
            gravity = 0.0f;
            jumpheight = -14.0f;
        }
        else
        {
            fallBool = true;
        }

        if (jumpBool == true)
        {
            gravity = 0.0f;
            jumpheight += 1.0f;
            Position.Y += jumpheight;
            onGround = false;
        }

        if (jumpheight > 0)
        {
            jumpBool = false;
            fallBool = true;
        }

        if (fallBool == true)
        {
            gravity = 1.0f;
        }

这一切都有效,直到我碰到平台时试图添加碰撞测试。

以下确定边界框以检查玩家是否在平台上方。

static class RectangleHelper
{
    public static bool TouchTopOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Bottom >= r2.Top - 1 &&
                r1.Bottom <= r2.Top + (r2.Height / 2) &&
                r1.Right >= r2.Left + r2.Width / 5 &&
                r1.Left <= r2.Right - r2.Width / 5);
    }

    public static bool TouchBottomOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Top <= r2.Bottom + (r2.Height / 5) &&
                r1.Top >= r2.Bottom - 1 &&
                r1.Right >= r2.Left + (r2.Width / 5) &&
                r1.Left <= r2.Right - (r2.Width / 5));
    }

    public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Right <= r2.Right &&
                r1.Right >= r2.Right - 5 &&
                r1.Top <= r2.Bottom - (r2.Width / 4) &&
                r1.Bottom >= r2.Top + (r2.Width / 4));
    }

    public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Left <= r2.Left &&
                r1.Left >= r2.Left - 5 &&
                r1.Top <= r2.Bottom - (r2.Width / 4) &&
                r1.Bottom >= r2.Top + (r2.Width / 4));
    }
}

最后,这段代码会检查他是否站在一个区块上,并在接触平台时更改跳跃属性。

 if (rectangle.TouchTopOf(newRectangle))
        {
            jumpheight = -14.0f;
            onGround = true;
            gravity = 0.0f;
            fallBool = false;
        }

然而,因为我使用布尔来确定他是否在地上,当他走出一个平台时,布尔仍然设置为真,他不会摔倒。我想过尝试像

这样的东西
 if else(!rectangle.TouchTopOf(newRectangle))
 {
      onGround = false;
 }

但是由于某些原因导致onGround总是假的,他只是通过平台。一旦他走出平台,我怎么可能让他跌倒?

感谢您查看此帖并将其全部放在此处。我真的很感激。

1 个答案:

答案 0 :(得分:0)

看起来你只是在onGround&#39;当玩家在地上时(并且在玩家离开后不更新它),因为你的功能返回bool为什么不尝试

onGround = rectangle.TouchTopOf(newRectangle);