我正在研究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;
}
答案 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.通过跳过每个其他像素来测试分辨率的一半。根据你的照片,半分辨率不应该是一个大问题。