我在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循环的完整原因是不必遍历每个可碰撞的每次更新。
我要问的是,有没有人知道如何确定可碰撞是否在我指定的位置,而不必迭代整个集合?
答案 0 :(得分:5)
您需要为自己提供两种方法的实现:
int hashCode()
boolean equals(Object o)
当且仅当两个实例的属性(向量)相等时,才应实现c1.hashCode() == c2.hashCode()
这些方法。同时hashCode()
必须与文档所述的意义上的equals(Object o)
一致: