我有問題,移動得太快的球可以穿過牆壁(牆壁是4個像素寬,偶爾會有超過400像素/秒的速度(這是超過4像素每更新假設fps是60))。我在StackOverflow上進行了研究,但其他人的解決方案並不適合我,因爲他們使用的是矩形,而我正在使用像素碰撞。這裏是方法,它返回如果球與壁相交(方法是在球類):Java檢測快速移動物體的碰撞
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));
}
難道是因爲他們旅行的距離超出了你的範圍檢查範圍,也就是說,他們一舉移動到目前爲止,你的邊界檢查只是不夠寬... – MadProgrammer 2014-10-22 05:54:43
這是真的,但是如果我嘗試增加牆的邊界(即增加它的邊界寬度與球的距離),碰撞檢查變得太慢,而不是創建大小爲4x4的bufferedimage,我將不得不創建大小爲ballspd x ballspd的bufferedimage,並遍歷所有像素,這對於數量不夠有效我有球和牆。 – 2014-10-22 05:59:38
而不是嘗試對其進行物理建模,虛擬建模...... – MadProgrammer 2014-10-22 06:00:54