当两个矩形正确相交时,此代码不会显示:
public boolean intersects(Entity other) {
hitbox.setBounds((int) x, (int) y, (int) width, (int) height);
System.out.println(x);
System.out.println(y);
System.out.println(width);
System.out.println(height);
boolean a = false;
Point b = new Point();
Point c = new Point();
Point d = new Point();
Point e = new Point();
b.setLocation((int)other.getX(), (int)other.getY());
c.setLocation((int)other.getX() + (int)other.getWidth(), (int)other.getY());
d.setLocation((int)other.getX() + (int)other.getWidth(), (int)other.getY() + (int)other.getHeight());
e.setLocation((int)other.getX(), (int)other.getY() + (int)other.getHeight());
if(hitbox.contains(b)){a = true;}
if(hitbox.contains(c)){a = true;}
if(hitbox.contains(d)){a = true;}
if(hitbox.contains(e)){a = true;}
return a;
}
首先,当矩形不相交时,它会将矩形报告为交叉,然后突然拒绝接受它们相交,即使它们相交也是如此。
答案 0 :(得分:2)
您的代码不起作用,因为矩形交叉点不需要一个矩形的角落在另一个矩形内。这可能导致漏报,即对于相交的矩形获得false
。
获得假阴性的另一种方法是当hitbox
的两个或四个角落在other
矩形内时:因为你只是通过一种方式检查它,而不是另一种方式,这样的交叉点也不会被发现。
您不必使用任何系统类来确定矩形相交。你可以这样做:
boolean intersectRect(int x1, int y1, int w1, h1, int x2, int y2, int w2, int h2) {
return intersectRange(x1, x1+w1, x2, x2+w2)
&& intersectRange(y1, y1+h1, y2, y2+h2);
}
boolean intersectRange(int ax1, int ax2, int bx1, int bx2) {
return Math.max(ax1, bx1) <= Math.min(ax2, bx2);
}
答案 1 :(得分:2)
不要重新发明轮子:
Rectangle r1 = new Rectangle(x,y,width,height);
Rectangle r2 = new Rectangle(other.getX(),other.getY(),other.getWidth(),other.getHeight());
return r1.intersect(r2);
请注意,这需要2个对象分配,如果您想在代码中直接计算边界,则可以完全不使用对象分配。