Java обнаруживает столкновения для быстро движущихся объектов
У меня проблема в том, что шары, которые движутся слишком быстро, могут пролететь сквозь стену (ширина стен составляет 4 пикселя, а скорость мяча иногда превышает 400 пикселей в секунду (что превышает 4 пикселя на обновление при условии, что fps равно 60)). Я исследовал его на Stackru, но решение для других мне не подходит, так как они используют прямоугольники, а я использую столкновение пикселей. Вот метод, который возвращает, если мяч пересекается со стеной (метод находится в классе 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 ответ
У меня есть пара быстрых идей, которые вы можете попробовать.
Почему бы не проверить конечные точки по размерам стены (некоторая простая алгебра, и я думаю, что вы, возможно, уже пытаетесь сделать). Если вам нужна помощь с алгеброй, я добавлю ссылку ниже. В основном просто запишите начальную точку мяча (до перемещения), и при обновлении проверьте старое местоположение в сравнении с предполагаемым местоположением, и запустите функцию, чтобы увидеть, происходит ли столкновение. Однако это будет сложно, если вы хотите реалистичную физику.
https://gamedev.stackexchange.com/questions/26004/how-to-detect-2d-line-on-line-collision
В приведенной выше ссылке просто предположите, что ваши стены - одна линия, а предыдущие координаты и ожидаемые следующие координаты шара образуют другую линию. Этот метод работает очень хорошо, если мяч движется только по прямой линии.
Ваша единственная альтернатива может состоять в том, чтобы запустить две модели одновременно (в основном это визуальное пространство, в котором вы видите шар и стены, и виртуальную установку, проверяющую физику позади того, что вы показываете.