Java中两个对象之间的碰撞检测

时间:2019-01-16 20:29:23

标签: java for-loop math methods collision-detection

我真的很努力地检测Car类的两个Car对象之间的碰撞。该代码很长,因此很难将其全部包含在内。我已经包括了碰撞方法。如果您能发现任何逻辑错误,而我认为这是我的问题,那将是个好消息。如果您需要更多上下文,我问了一个较早的类似问题,其中包括更多的代码here,但我仍然没有解决方案。

我想要做的是告诉我两辆车何时接触。它所做的只是打印“无冲突”,即使有冲突也是如此。

冲突方法(环境类内部)-

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");
    } 

等于(我现在决定使用!(a == 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 :(得分:1)

您可能要更改检测“范围”。如果您查看检测汽车的方式,那么您只在寻找精灵/矢量所处的坐标,如果像素多于几个,它们将相对难以碰撞。尝试从Car A的{​​{1}}中找到width/length的位置。

答案 1 :(得分:0)

我认为平等方法是不正确的。并且它引起一些碰撞检测问题。 我们不能假定具有相同属性的两个Car是同一对象。 例如:

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方法)是相同的,因此永远不会检测到冲突。

在这种情况下,例如游戏引擎或建模系统,使用ID区分世界中的每个对象非常有用,因为每个实例都是唯一的。

此外,如@Jason所说,要正确捕获碰撞,您必须计算对象的长度或宽度。