2013-01-09 100 views
1

我有一組內,在世界級的,名爲可碰撞的對象:搜索完全相同的對象的不同實例,一組

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

雖然試圖開發一種碰撞檢測系統(用於一個球),我做了兩個for循環,X和Y.

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參數來檢查collidables,但是由於我正在創建一個collidable的新實例(雖然與之前生成的參數完全相同),但是,它總是會調高假:

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

但是,如果我用塊相同的情況下,它會變成了真:

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

這是不可接受的。然而,因爲整個原因有兩個for循環就是不必遍歷每一個可碰撞的每一次更新。

我問的是,有沒有人知道一種方法來獲取collidable是否在我指定的位置,而不必遍歷整個集合?

+0

同樣,這將需要迭代,這是我不能做的性能原因。如果可以的話,我會迭代並檢查該對象的向量是否與我所在的位置具有相同的值。 – LulzCop

回答

5

您需要提供您的兩個方法自己的實現:

int hashCode() 
boolean equals(Object o) 

這些方法應該被實現,使得c1.hashCode() == c2.hashCode()當且僅當兩個實例的屬性(矢量)是相等的。與此同時hashCode()必須符合equals(Object o)由文件規定的意義:

  • 每當它是一個Java應用程序的執行期間,在同一對象不止一次調用,hashCode方法必須一致地返回相同整數,只要修改了對象的等號比較中沒有使用的信息。該整數不需要從應用程序的一次執行到同一應用程序的另一次執行保持一致。
  • 如果兩個對象根據equals(Object)方法相等,則對這兩個對象中的每個對象調用hashCode方法必須產生相同的整數結果。
  • 根據equals(java.lang.Object)方法,如果兩個對象不相等,則不要求對兩個對象中的每個對象調用hashCode方法必須產生不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同的整數結果可能會提高哈希表的性能。
+0

謝謝,它工作! – LulzCop

相關問題