Java - 形状碰撞检测

时间:2017-07-30 17:41:39

标签: java collision-detection

好的,所以我知道这个问题已被问过一百万次了,但我的问题略有不同。我有Polygon对象,它由1个单位"块"组成,我需要确定这些块是否相互接触。其他答案的代码如下:

Area area1 = new Area(poly1);
Area area2 = new Area(poly2);
area1.instersect(poly2);
if(!area1.isEmpty()) {

    // Do collision stuff here

}

这有一个问题,即如果形状彼此相邻(它们正在接触),则不会报告碰撞。

我最初的想法是让一个Polygon周围有一个单位边框,所以如果它们彼此相邻,边框会与第二个Polygon相交,我会发生碰撞。我似乎找不到添加边框的方法。

非常感谢帮助!

编辑:

如果这很重要,所有块的大小都是1x1单位,并存储在"块中" (使用ArrayList)。我的Polygon对象代表了一大块对象。如果有更好的方法,请告诉我!

我的代码需要尽可能高效,因为我可能拥有数百个块/数千个块,并且物理循环每1秒运行一次

2 个答案:

答案 0 :(得分:0)

public static boolean checkCollision(Shape shapeA, Shape shapeB) {
   Area areaA = new Area(shapeA);
   areaA.intersect(new Area(shapeB));
   return !areaA.isEmpty();
}

答案 1 :(得分:0)

好吧,我想我有一个解决方案,如果我做对了,请发表评论。

我将使用块的ArrayList为每个块创建3个单位宽的矩形(使用x - 1)而不是1个单位块,这应该给我一个围绕Area对象的1个单位边框:

public Area calculateHitboxArea() {
    Area area = new Area();
    for(int i = 0; i < getMass(); i++) {
        Block block = getBlock(i);
        area.add(new Area(new Rectangle(block.getX() - 1, block.getY() - 1, 3, 3)));
    }
    return area;
}

我还保留了原始方法来查找块的区域,然后我可以检查碰撞:

Area area1 = chunk1.calculateHitboxArea();
Area area2 = chunk2.calculateArea();
area1.intersect(area2);
if(!area1.isEmpty()) {

    // Collision stuff here

}

提高性能,我的块类将缓存两个方法返回的区域,因此只有在物理循环修改块时才会生成Area对象。

不确定这是否真的是最好的方法,因为在我的情况下,每个块我需要4个Area对象,这是不理想的。我不打算接受这个答案,除非得到许多赞成,因为我仍然更喜欢一种更有效的方式来做到这一点。