其他分享
首页 > 其他分享> > CodeGo.net>在边界框碰撞中获取碰撞点

CodeGo.net>在边界框碰撞中获取碰撞点

作者:互联网

我正在研究2D自上而下的地图生成算法,其中我要创建的所有房间的顶部/左侧为Point,底部/右侧为Point.所有房间都是矩形的,除了某些偶尔共享的墙壁外,在任何部分都不会重叠.

我的问题是,当我有两个房间最终在它们之间共享一堵墙时,我如何快速,轻松地吐出由这两个墙内两个房间共享的“平铺”(或积分)列表?

我有点希望像:

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

解决方法:

给定两个房间A和B:

我假设指定的点不包括房间的墙壁.如果不正确,则可以在第一步中跳过矩形填充.

将每个房间表示为矩形,该矩形在每个方向上延伸一个图块以说明墙壁:

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

标签:collision,collision-detection,xna,c
来源: https://codeday.me/bug/20191127/2075850.html