Обнаружение столкновения между двумя объектами в Java - PullRequest
0 голосов
/ 16 января 2019

Я действительно изо всех сил пытаюсь обнаружить столкновение между двумя объектами Car класса Car. Код довольно длинный, поэтому сложно все это включить. Я включил мой метод столкновения. Если вы обнаружите какие-либо логические ошибки с этим, я думаю, это моя проблема, которая была бы великолепна. Если вам нужно больше контекста, я задавал ранее подобный вопрос, который включает в себя намного больше кода здесь , но у меня все еще нет решения ..

Что я хочу, это сказать мне, когда две машины соприкасаются. То, что он делает, это не что иное, как печать «нет столкновений», даже когда есть столкновения.

метод столкновения (внутри класса среды) -

public boolean collision() {

    double MIN_DIS = 0.1;
    for (Car a : cars) {
        for (Car b : cars) {
            if (!(a.equals(b)) && (Math.abs(a.getPosition() - b.getPosition()) < MIN_DIS)) {
                return true;
            }
        }
    }
    return false;
}

Метод вызова (внутри основного, где я добавляю автомобили) -

    if(e.collision() == true) {
        System.out.println("collision");
    } else {
        System.out.println("no collision");
    } 

Метод равно (я решил пока использовать (а == b) пока) -

public boolean equals(Object obj) {
    if (obj instanceof Car){
        Car car = (Car) obj;
        return car.getPosition() == this.position && car.getLane() == this.lane && car.getColor().equals(this.color) && car.getSpeed() == this.speed; 
    }
    return false;
}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я думаю, что метод равенства не является правильным. И это вызывает некоторые проблемы с обнаружением столкновений. Нельзя предполагать, что два автомобиля с одинаковым свойством являются одним и тем же объектом. Например:

e.add(new Car(  0, 63, 2, new Color(1.0f,1.0f,1.0f, 1.0)));
e.add(new Car(  0, 63, 2, new Color(1.0f,1.0f,1.0f, 1.0)));

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

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

Кроме того, как говорит @Jason, для правильного захвата столкновения необходимо вычислить длину или ширину объекта.

0 голосов
/ 16 января 2019

Вы можете изменить «диапазон» обнаружения. Если вы посмотрите на то, как вы обнаруживаете свои автомобили, вы ищете только координату, в которой расположен спрайт / вектор, для которой будет относительно трудно столкнуться, если будет более нескольких пикселей. , Попробуйте найти позицию Car A из width/length из Car B.

...