在边界框碰撞中获取碰撞点

时间:2012-09-12 19:55:22

标签: c# xna collision-detection collision

我正在制作一个2D自上而下的地图生成算法,我正在创建的所有房间都有一个顶部/左侧的Point和一个底部/右侧的Point。所有房间都是长方形,除了偶尔共用墙壁外,不会在任何部分重叠。

我的问题是,当我有两个房间最终在它们之间共用一面墙时,我如何快速轻松地吐出所有墙内两个房间共享的“瓷砖”(或点)列表? / p>

我有点希望得到类似的东西:

private List<Point> SharedTiles (Point P1, Point P2, Point P3, Point P4)
{
    /*
    P1 = Top Left point of room1
    P2 = Bottom Right point of room1
    P3 = Top Left point of room2
    P4 = Bottom Right point of room2
    */
    List<Point> _SharedTiles = new List<Point>();
    //Magic goes here...
    return _SharedTiles;
}

1 个答案:

答案 0 :(得分:3)

考虑到两个房间,A和B:

我假设指定的点不包括房间的墙壁。如果这不正确,您可以在第一步中跳过矩形膨胀。

将每个房间表示为Rectangle,在每个方向上展开一个图块以说明墙壁:

var roomAreaA = new Rectangle(a1.X - 1, a1.Y - 1, (a2.X - a1.X) + 2, (a2.Y - a1.Y) + 2); 
var roomAreaB = new Rectangle(b1.X - 1, b1.Y - 1, (b2.X - b1.X) + 2, (b2.Y - b1.Y) + 2);

与房间区域相交:

var roomIntersection = Rectangle.Intersect(roomAreaA, roomAreaB);

生成的矩形表示两个房间的区域之间的交点。由于您已声明房间仅共享墙砖,因此必须遵循此交叉区域中的所有瓷砖都是墙砖。

如有必要,您可以将此矩形转换为Point个对象的列表。我不一定会推荐下面的方法,具体取决于它的使用方式,但它传达了这一点:

var p = from x in Enumerable.Range(r.X, r.Width)
        from y in Enumerable.Range(r.Y, r.Height)
        select new Point(x, y);