快速Java图像碰撞检测算法

时间:2015-01-01 17:59:21

标签: java game-physics graphics2d java-2d

我正在研究Java 2D视频游戏,我正在寻找比你在下面看到的更快的碰撞检测算法。我试图探测鱼雷和船之间的碰撞。我使用的算法严重影响了我的主要图形2D调度循环的性能,减慢了我的屏幕重绘速度。想知道是否有人可以推荐一个更好的算法来处理这个问题,那么检测碰撞的速度更快?示例代码的指针会很棒!

这是我正在使用的慢速算法Pixel by Pixel ..

    private boolean isPixelCollide(double x1, double y1, VolatileImage image1,
                double x2, double y2, VolatileImage image2) {   

        double width1 = x1 + image1.getWidth() -1,
                 height1 = y1 + image1.getHeight() -1,
                 width2 = x2 + image2.getWidth() -1,
                 height2 = y2 + image2.getHeight() -1;

          int xstart = (int) Math.max(x1, x2),
              ystart = (int) Math.max(y1, y2),
              xend   = (int) Math.min(width1, width2),
              yend   = (int) Math.min(height1, height2);

          // intersection rect
          int toty = Math.abs(yend - ystart);
          int totx = Math.abs(xend - xstart);

          for (int y=1;y < toty-1;y++){
            int ny = Math.abs(ystart - (int) y1) + y;
            int ny1 = Math.abs(ystart - (int) y2) + y;

            for (int x=1;x < totx-1;x++) {
              int nx = Math.abs(xstart - (int) x1) + x;
              int nx1 = Math.abs(xstart - (int) x2) + x;
              try {
                if (((image1.getSnapshot().getRGB(nx,ny) & 0xFF000000) != 0x00) &&
                    ((image2.getSnapshot().getRGB(nx1,ny1) & 0xFF000000) != 0x00)) {
                   // collide!!
               return true;
            }
              } catch (Exception e) {
//            System.out.println("s1 = "+nx+","+ny+"  -  s2 = "+nx1+","+ny1);
              }
            }
          }

          return false;

}

2 个答案:

答案 0 :(得分:1)

您可以使用Rectangle类定义场景中每个对象的边界,然后使用Rectangle#intersect(Rectangle rect)方法。所以你的交叉方法看起来像这样:

private boolean intersect(double x1, double y1, VolatileImage image1, double x2, double y2, VolatileImage image2) {
    return (new Rectangle(x1, y1, image1.getWidth(), image1.getHeight()).intersect(new Rectangle(x2, y2, image2.getWidth(), image2.getHeight()));
}

答案 1 :(得分:0)

这是很多getRGB()。您是否考虑先将鱼雷和船舶用作箱子并将其用于早期剔除机制?

同时尝试将像素测试除以2.通过跳过每个其他像素来测试分辨率的一半。根据你的照片,半分辨率不应该是一个大问题。