Java检测快速移动对象的冲突

时间:2014-10-22 05:53:28

标签: java collision graphics2d

我有问题,移动太快的球可以飞过墙壁(墙壁宽4像素,球的速度偶尔超过每秒400像素(假设fps为60,每次更新超过4像素) )。我在StackOverflow上进行了研究,但其他人的解决方案并不适合我,因为他们使用的是矩形,我正在使用像素碰撞。这是球与墙相交时返回的方法(方法在Ball类中):

public boolean intersects(Wall w) {

    BufferedImage im1 = new BufferedImage (size, size, BufferedImage.TYPE_INT_ARGB);        // size is diameter of the ball
    BufferedImage im2 = new BufferedImage (size, size, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g1 = im1.createGraphics();
    Graphics2D g2 = im2.createGraphics();
    g1.translate(-x + size/2, -y + size/2);         
    g2.translate(-x + size/2, -y + size/2);
    render(g1);
    w.render(g2);
    g1.dispose();
    g2.dispose();

    for (int x = 0; x < im1.getWidth(); x++){
        for (int y = 0; y < im1.getHeight(); y++){
            Color c1 = new Color(im1.getRGB(x, y), true);
            Color c2 = new Color(im2.getRGB(x, y), true);
            if (c1.getAlpha() != 0 && c2.getAlpha() != 0){
                return true;
            }
        }
    }

    return false;

}

以下是球的绘制方式:

public void render(Graphics2D g) {
    color = new Color (Color.HSBtoRGB(hue, 0.5f, 0.5f));
    g.setColor (color);
    g.fillOval((int)(x-size/2), (int) (y-size/2), size, size);
}

墙被简单地定义为2个点,以下是绘制墙的方式:

public void render(Graphics2D g2) {
    g2.setColor(new Color(r, g, b));
    g2.setStroke(new BasicStroke(width));     //width = 4
    g2.draw(new Line2D.Float(p1.x, p1.y, p2.x, p2.y));
}

1 个答案:

答案 0 :(得分:1)

我可能想要尝试一些简单的想法。

为什么不根据墙的尺寸检查端点(一些简单的代数,我想你可能已经尝试过做什么)。如果您需要有关代数的帮助,我将在下面添加一个链接。基本上只记录球的起点(在移动之前),并在更新时检查旧位置与估计位置,并运行一个函数以查看是否发生碰撞。如果你想要逼真的物理学,这将变得棘手。

https://gamedev.stackexchange.com/questions/26004/how-to-detect-2d-line-on-line-collision

在上面的链接中,假设您的墙是一条线,并且前一个坐标和球的预期下一个坐标形成另一条线。如果您只让球以直线移动,这种方法非常有效。

你唯一的选择可能就是让两个同步模型运行(基本上是你在展示球和墙壁时的视觉空间,以及一个虚拟设置,检查你所展示的物理背后的物理。