1

我目前正在 XNA 中编写平台游戏。我的碰撞测试目前通过运行一个 foreach 循环来测试玩家的边界框与每个图块的边界框。但是,我不知道如何测试玩家是否没有接触任何方块。

我将如何遍历我的阵列并测试他们的玩家是否没有接触任何块,以便我可以检查他是否在半空中?任何帮助或建议将不胜感激。先感谢您!

////////////////////////////////

我的碰撞代码是

    if (personRectangle.TouchTopOf(newRectangle))
    {
         onGround = true;
         test = false;
         test2 = true;
    }

相应的布尔测试是

    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));
    }

这段代码在 Game1.cs 更新中测试了碰撞。

        foreach (CollisionTiles tile in map.CollisionTiles)
            player.Collision(tile.Rectangle);

这是我的地图类中的瓷砖列表

    private List<CollisionTiles> collisionTiles = new List<CollisionTiles>();
4

2 回答 2

3

XNA Rectangles 有一个内置的 intersects 方法:

if (rect1.Intersects(rect2)){
...
}

只需遍历平铺矩形并在每个矩形上调用相交。为了提高效率,您应该将玩家坐标映射到世界坐标并确定离玩家最近的图块,这样做可以缩小需要循环的图块数量。

编辑:为澄清起见,您可以:

bool collision=false;
foreach (CollisionTiles tile in map.CollisionTiles) {
    if(personRectangle.Intersects(tile.Rectangle)) {
        collision =true;
        break;
    }
}

那么如果碰撞是真的,你就知道某处发生了碰撞。

于 2013-02-27T17:21:16.387 回答
0

除非您有理由不这样做,否则请保持简单。只需跟踪您碰撞了多少东西。如果您的计数最终为 0,那么您没有与任何东西发生碰撞。

无需担心修改/优化您拥有的任何代码,它可能类似于:

int touchedCount = 0;
foreach (CollisionTiles tile in map.CollisionTiles)
{
        if (player.Collision(tile.Rectangle))
        {
             touchedCount++;
        }
}

if (touchedCount == 0)
{
    //You did not collide with anything
}

然后在您的碰撞方法中执行类似的操作来跟踪您的检查以及是否发生碰撞。正如其他答案所暗示的那样,使用 Rectangle.Intersects 可能是最简单的。

于 2013-02-27T18:55:17.537 回答