我正在开发 2D 游戏,我正在使用 LWJGL 和 Slick-Util 库来提供帮助。它并没有什么太复杂的,而且我以前编写过更困难的事情。但是,我遇到了 HashMap/Map 返回值的一个非常奇怪的问题。这是我关于 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;
}
最佳答案
关于包括 HashMap 在内的集合的一个常见误解是,在添加或放置键/值/元素时,您正在放置该元素的副本。相反,您将放置对该元素的引用的副本。
只有当 main.loadTextureFrom
每次返回相同的图像时,您描述的问题才真正可能发生。如果您在再次调用此方法之前使用过该图像,则这将有效,但如果您想保存该图像,则需要保存它的副本。
关于Java HashMap 只返回列表的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16395582/