我真的很难检测汽车类的两个汽车对象之间的碰撞。代码很长,因此很难全部包含。我已经包括了我的碰撞方法。如果你能发现任何逻辑错误,我认为这是我的问题,那就太好了。如果您需要更多上下文,我问了一个较早的类似问题,其中包括更多的代码,但我仍然没有解决方案。
我希望它做的是告诉我两辆车何时接触。它所做的只是打印"无碰撞",即使有碰撞。
碰撞方法(内部环境类) -
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;
}
您可能需要更改检测"范围"。如果你看一下你检测汽车的方式,你只是在寻找精灵/矢量所在的坐标,如果像素超过几个,它们将相对难以碰撞。尝试从Car B
的width/length
中找到Car A
的位置。
我认为相等方法不正确。它会导致一些碰撞检测问题。我们不能假设具有相同属性的两辆汽车是同一个对象。例如:
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所说,要正确捕获碰撞,您必须计算物体的长度或宽度。