0

如何检测组件的碰撞,特别是 JLabels(或 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,但我不知道如何获取ImageIcon 的x 或检测碰撞。我也不知道如何检测标签的碰撞或增加位置。

我已经搜索了组件/ImageIcons 的碰撞检测,但没有出现任何结果。我还搜索了 ImageIcons 的 x。

4

2 回答 2

5

尝试使用computeIntersection()SwingUtilities 中的方法。根据此方法的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 建议的那样,另一种方法是使用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());
}
于 2012-09-07T21:28:57.783 回答
3

您可以自己编写它,请记住,如果两个区域的区域重叠,则两个区域相交,而不仅仅是当一个区域包含 x 和 y 坐标(您正在测试)时。

如果我是你,我会使用Area. 它已经有了你需要的方法containsintersects

于 2012-09-07T21:34:29.863 回答