如何检测对象之间的碰撞

时间:2013-11-29 12:23:36

标签: java swing collision-detection

我需要检测一个球(椭圆形)和许多块(矩形)之间的碰撞。在表示游戏中的块的类Block中,我有以下代码来检测碰撞(其简短版本,仅用于显示示例):

    if(ballYPos <= blockYPos 
         && ballYPos >= blockYPos 
         && ballXPos >= blockXPos
         && ballXPos+ballWidth <= blockXPos+blockWidth) {
   collision
   }

碰撞不好,因为椭圆形,但一般来说,我想问一下java(swing)中是否有东西来检测碰撞,我的意思是如果矩形在Canvas上没有完全显示,这意味着球重叠块坐标

2 个答案:

答案 0 :(得分:3)

方法Shape.intersects()可用于确定形状是否与任何矩形相交。幸运的是,也可以使用非矩形形状,例如椭圆形。这是一个例子:

public class IntersectExample extends JFrame {
    public IntersectExample() {
        add(new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                Shape oval = new Ellipse2D.Double(10, 10, 200, 200);
                Shape rect = new Rectangle2D.Double(190, 190, 200, 200);
                Graphics2D g2 = (Graphics2D) g;
                g2.draw(oval);
                g2.draw(rect);
                System.out.println(oval.intersects(rect.getBounds()));
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
        });
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
    }

    public static void main(String[] args) {
        new IntersectExample().setVisible(true);
    }
}

看起来像这样......

enter image description here

...并将false打印到控制台。这表明,不仅要比较边界矩形,还要比较实际的形状区域。

答案 1 :(得分:0)

类java.awt.Rectangle有一个intersects方法(Rectangle r),当两个矩形占据相同的空间(source)时返回true。我想你可以根据自己的需要调整它。