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

В приведенной выше ссылке просто предположите, что ваши стены - одна линия, а предыдущие координаты и ожидаемые следующие координаты шара образуют другую линию. Этот метод работает очень хорошо, если мяч движется только по прямой линии.

Ваша единственная альтернатива может состоять в том, чтобы запустить две модели одновременно (в основном это визуальное пространство, в котором вы видите шар и стены, и виртуальную установку, проверяющую физику позади того, что вы показываете.

Другие вопросы по тегам