0

我正在开发一款 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 纹理,即使我调用了类似纹理的东西。得到(“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;
}
4

2 回答 2

2

关于包括 HashMap 在内的集合的一个常见误解是,在添加或放置键/值/元素时,您正在放置该元素的副本。相反,您正在放置对元素的引用的副本。

main.loadTextureFrom您描述的问题只有在每次都返回相同的图像时才真正可能。如果您在再次调用此方法之前使用了图像,这将起作用,但如果您想保存图像,则需要保存它的副本。

于 2013-05-06T09:21:26.083 回答
1

很可能您的图像加载器每次调用时都返回相同的对象,而不是创建一个新对象。Java Maps 仅存储对对象的引用,它们不会按值复制它们。

确保为每个新负载创建一个新的 Image 对象。

于 2013-05-06T09:23:00.750 回答