在XNA中测试所有非碰撞贴图

本文关键字:碰撞 XNA 测试 | 更新日期: 2023-09-27 18:01:30

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

我该如何运行我的数组并测试玩家是否没有碰到任何砖块,以便我可以检查他是否在半空中?任何帮助或建议将不胜感激。提前感谢!

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

我的碰撞码是

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

对应的bool测试为

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

在XNA中测试所有非碰撞贴图

XNA矩形有内置的intersects方法:

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

只是循环遍历矩形瓦片并调用每个矩形的交点。为了提高效率,你应该将玩家坐标映射到世界坐标上,并确定离玩家最近的贴图,这样你就可以缩小需要循环的贴图数量。

编辑:为了澄清,你可以写:

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

如果collision为真,那么你就知道某处发生了碰撞

除非你有理由不这样做,否则尽量保持简单。记录下你撞了多少东西。如果你的计数最终是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
}

然后在你的碰撞方法中做一些类似的事情来跟踪你的检查,如果你碰撞了。这可能是最简单的使用矩形。与另一个答案相交