1

我在 World 类中有一个名为 collidable 的对象的集合:

Set<Collidable> collidables = new HashSet<Collidable>();

在尝试开发碰撞检测系统(用于球)时,我为 X 和 Y 做了两个 for 循环。

cboxX = (int) Math.floor(position.x - RADIUS);
cboxY = (int) Math.floor(position.y - RADIUS);
cboxW = Math.abs((int) Math.ceil(nextPosition.x + RADIUS) - (int) Math.floor(position.x - RADIUS));
cboxH = Math.abs((int) Math.ceil(nextPosition.y + RADIUS) - (int) Math.floor(position.y - RADIUS));

for (int x = cboxX; x <= cboxW + cboxX - 1; x++)
{
    for (int y = cboxY; y <= cboxH + cboxY; y++)
    {

    }
}

这里一切都很好。但是,在 for 循环中,我尝试使用 x 和 y 参数检查可碰撞对象,但由于我正在创建可碰撞对象的新实例(尽管参数与先前生成的参数完全相同),它总是会出现错误:

world.collidables.add(new Block(new Vector2(x, y)));
System.out.println(world.collidables.contains(new Block(new Vector2(x, y)))); //returns false

但是,如果我使用相同的块实例,它将变为 true:

Block b = new Block(new Vector2(x, y))
world.collidables.add(b);
System.out.println(world.collidables.contains(b)); //returns true

然而,这是不可接受的,因为有两个 for 循环的全部原因是不必遍历每个可碰撞的、每次更新。

我要问的是,有没有人知道一种方法来获取可碰撞对象是否在我指定的位置,而不必遍历整个集合?

4

1 回答 1

5

您需要为自己提供两种方法的实现:

int hashCode()
boolean equals(Object o)

这些方法应该被实现为c1.hashCode() == c2.hashCode()当且仅当两个实例的属性(向量)相等时。同时hashCode()必须与equals(Object o)文档所述的含义一致:

  • 每当在 Java 应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
  • 如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
于 2013-01-09T03:29:46.830 回答