好的,所以我知道这个问题已被问过一百万次了,但我的问题略有不同。我有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秒运行一次
答案 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对象,这是不理想的。我不打算接受这个答案,除非得到许多赞成,因为我仍然更喜欢一种更有效的方式来做到这一点。