0

我正在开发一个平台游戏,我有一个 32x32 的精灵和 32x32 的图块。我还使用了一个瓦片引擎,它在数组的帮助下生成地图。我使用 aRectangleHelper.cs来修复与瓷砖和玩家的碰撞,到目前为止,它可以与瓷砖的顶部发生碰撞,也可以与瓷砖的左侧发生碰撞。

在此处输入图像描述

在图片一中,我展示了“ On Top Of ”碰撞效果很好。没有错误或任何东西。

在图 2 中,我展示了“左碰撞”,这也很有效。

但在图 3 中,您可以看到角色是浮动的。这是因为碰撞矩形以某种方式延伸了几个像素,这就是问题之一,我似乎无法找到任何答案。

在图 4 中,我试图从拉伸的碰撞矩形的右侧进行碰撞,结果我跳回墙上大约 1 到 2 帧,所以我无法在上面截屏,但这也是一个的问题。

这是我RectangleHelper.cs的,它来自“ oyyou9 ”在 youtube 上的瓷砖碰撞引擎教程,对他来说,一切都很好。

另外,如果我撞到块的底部,我的角色就​​会消失。

矩形助手.cs

public 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.Left  - 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.Right &&
                r1.Top <= r2.Bottom - (r2.Width / 4) &&
                r1.Bottom >= r2.Top + (r2.Width / 4));
    }
}

正如你在这里看到的,有很多随机值,在视频中,他并没有真正说明它们有什么用,只是我可能需要调整它以适应我的游戏。

还有我的播放器类中的碰撞方法:

public void Collision(Rectangle newRectangle, int xOffset, int yOffset)
    {
        if (rectangle.TouchTopOf(newRectangle))
        {
            rectangle.Y = newRectangle.Y - rectangle.Height;
            velocity.Y = 0f;
            hasJumped = false;
        }
        if (rectangle.TouchLeftOf(newRectangle))
        {
            position.X = newRectangle.X - rectangle.Width * 2;
        }
        if (rectangle.TouchRightOf(newRectangle))
        {
            position.X = newRectangle.X + newRectangle.Width +1;
        }
        if (rectangle.TouchBottomOf(newRectangle))
        {
            velocity.Y = 1f;
        }
    }

它使用RectangleHelper.cs来修复碰撞。

4

3 回答 3

0

我不确定所有这些随机值在您的碰撞检查代码中做了什么,所以我认为这可能会解决您的问题:

    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 &&
                r1.Left <= r2.Right);
    }

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

    public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Right <= r2.Right &&
                r1.Right >= r2.Left &&
                r1.Top <= r2.Bottom &&
                r1.Bottom >= r2.Top);
    }

    public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
    {
        return (r1.Left >= r2.Left &&
                r1.Left <= r2.Right &&
                r1.Top <= r2.Bottom &&
                r1.Bottom >= r2.Top);
    }

并改变这个:

    if (rectangle.TouchLeftOf(newRectangle))
    {
        position.X = newRectangle.X - rectangle.Width * 2;
    }

对此:

    if (rectangle.TouchLeftOf(newRectangle))
    {
        position.X = newRectangle.X - 1;
    }

HTH。它在很大程度上对我有用。希望这会消除您的一些主要错误,但我只想指出,您学习的最佳方法是自己调试。您可以开始的一种方法是按照您在图 3 中所做的方式设置所有内容,然后在您的rectangle.TouchTopOf()条件中放置一个断点,看看它是否正在返回true,如果是,为什么它true显然不应该返回。

于 2013-09-05T16:30:11.370 回答
0
public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
{
    return (r1.Right >= r2.Left &&
            r1.Left <= r2.Left - 5 &&
            r1.Top <= r2.Bottom - (r2.Width / 4) &&
            r1.Bottom >= r2.Top + (r2.Width / 4));
}
于 2017-05-04T12:02:21.280 回答
0
public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
{
    return (r1.Left <= r2.Right &&
            r1.Right >= r2.Right - 5 &&
            r1.Top <= r2.Bottom - (r2.Width / 4) &&
            r1.Bottom >= r2.Top + (r2.Width / 4));
}
于 2017-05-04T11:54:41.607 回答