如何检测组件的碰撞,特别是JLabel(或ImageIcons?)?我试过这个:
add(test1);
test1.setLocation(x, y);
add(test2);
test1.setLocation(x1, y1);
validate();
if(intersects(test1, test2))
{
ehealth-=50;
}
public boolean intersects(JLabel testa, JLabel testb)
{
boolean b3 = false;
if(testa.contains(testb.getX(), testb.getY()))
{
b3 = true;
}
return b3;
}
当我运行它时,它什么都不做!
我曾经使用过Rectangle
,但对我来说并不顺利。我正在考虑带边框的图像(使用paint.net)和移动图像,但我不知道如何获取ImageIcon的x或检测碰撞。我不知道如何检测标签的碰撞或增加位置。
我已经使用components / ImageIcons搜索了碰撞检测,但没有发现任何问题。我也搜索了获得ImageIcons的x。
答案 0 :(得分:5)
尝试使用SwingUtilities中的computeIntersection()
方法。根据此方法的Javadoc:
方便计算两个矩形的交点 分配一个新的矩形。如果两个矩形不相交, 然后返回的矩形从(0,0)开始,宽度为零 高度。
以上是您可以做的事情:
public boolean intersects(JLabel testa, JLabel testb){
Rectangle rectB = testb.getBounds();
Rectangle result = SwingUtilities.computeIntersection(testa.getX(), testa.getY(), testa.getWidth(), testa.getHeight(), rectB);
return (result.getWidth() > 0 && result.getHeight() > 0);
}
另一种方式,正如@Jakub所建议的那样是使用Area的intersects()
方法。示例代码如下:
public boolean intersects(JLabel testa, JLabel testb){
Area areaA = new Area(testa.getBounds());
Area areaB = new Area(testb.getBounds());
return areaA.intersects(areaB.getBounds2D());
}
答案 1 :(得分:3)
您可以自己编写,只需记住,如果两个区域的区域重叠,则两个区域相交,而不仅仅是当一个区域包含x和y坐标时(您正在测试它们)。
如果我是你,我会使用Area
。它已经拥有您需要的contains
和intersects
方法。