2013-05-06 143 views
0

我正在開發2D遊戲,我正在使用LWJGL和Slick-Util庫來提供幫助。沒有什麼太複雜的,我之前編寫了更難的東西。但是,我遇到了HashMap/Map返回值的一個非常奇怪的問題。這是我關於HashMap的代碼:Java HashMap只返回列表的最後一個元素

public Map<String, Texture> textures; 

    public void loadTextures() 
    { 
     textures = new HashMap<String, Texture>(); 

     textures.put("char_up", main.loadTextureFrom("character/character_up.png")); 
     textures.put("char_down", main.loadTextureFrom("character/character_down.png")); 
     textures.put("char_right", main.loadTextureFrom("character/character_right.png")); 
     textures.put("char_left", main.loadTextureFrom("character/character_left.png")); 
    } 

但是,只要我使用textures.get(frameHere),它總是返回我放在了HashMap中的最後一個項目,因此,如果我的最後一個項目是「char_right」,它將始終返回char_right紋理,即使我調用類似textures.get(「char_up」)的東西。每次角色改變方向時,我都會嘗試加載紋理的另一個實例來設置角色位置,並且它可以很好地工作。意思是,這個問題不是紋理加載器或我將紋理作爲我的HashMap中的值的方式。

這非常令人沮喪,而且我對於我可能會在這裏搞的一個巨大的損失。也許有一些令人難以置信的簡單,我錯過了,因爲我以前在Java中做過這個沒有問題,但即使比較一切看起來100%很好。任何幫助是極大的讚賞。謝謝。

編輯:

這裏是我的loadTextureFrom()方法:

public Texture loadTextureFrom(String path) 
{ 
    try 
    { 
     return TextureLoader.getTexture("PNG", new FileInputStream(new File("res/textures/" + path))); 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 
+0

main.loadTextureFrom()做了什麼?你可以發佈代碼? – prasanth 2013-05-06 09:21:09

+0

http://stackoverflow.com/questions/1516549/bad-idea-to-use-string-key-in-hashmap – rebeliagamer 2013-05-06 09:21:23

+0

難道是loadTextureFrom是罪魁禍首? – Ewald 2013-05-06 09:21:24

回答

2

關於收藏,包括HashMap中一個常見的誤解,是增加還是把一個鍵/值/元素時要放置副本那個元素。相反,您要將元素的引用副本放入。

您描述的問題只有在main.loadTextureFrom每次都返回相同的圖像時纔有可能。如果您在再次調用此方法之前使用該圖像,這將起作用,但如果要保存圖像,則需要保存該圖像的副本。

+0

欣賞輸入!然而,在我的文章中,我解釋說,我嘗試從頭開始加載紋理而不使用字典,並且它工作正常。意思是,問題不是方法。該方法本身很好,我已經改變了角色的方向,並且它已經返回了正確的紋理。只有當我試圖從HashMap中獲取它。另外,我說它不返回SAME元素,它總是返回LAST元素。所以如果char_up是最後一個元素,它會返回char_up。如果最後一個元素是char_down,它將返回char_down。 – Knokk 2013-05-06 18:20:15

+0

從來沒有,你描述的行爲只能意味着你每次都更新相同的值對象。 HashMap已被數百萬開發人員使用和測試了十五年。 – 2013-05-06 18:34:42

+0

是的,我知道。我已經使用過很多次,並且從來沒有遇到任何問題。我期望得到一個問題,它會一遍又一遍地返回相同的值,但它只返回最後一個值。我從來沒有聽說過這個。 – Knokk 2013-05-06 18:41:13

1

大多數情況下,圖像加載器每次調用時都會返回相同的對象,而不是創建新的對象。 Java地圖僅存儲對象的引用,它們不會按值複製它們。

確保爲每個新加載創建一個新的Image對象。

相關問題