0

我正在使用 LWJGL 和 Slick2D。我将项目导出到 .jar 并使用 JarSplice 生成可执行文件,因此我不需要可执行 jar 所在位置的库文件。我的问题是,如果我从 Eclipse 运行项目,则会加载每个图像,但是如果我运行导出的可执行 jar,则不会加载图像,因为找不到它。图片在 /res 文件夹中,这是加载纹理的方法:

private Texture loadTexture(String key) {
    try {
        return TextureLoader.getTexture("PNG", new FileInputStream(
                new File("res/" + key + ".png")));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

在这里我加载纹理:

Texture background = loadTexture("main_menu/bg");

我尝试了很多导出 jar 的方法,但我没有得到任何工作方式。

4

3 回答 3

0

如果它们在 jar 中,您可能需要将它们作为类路径资源加载。看:

 getClass().getClassLoader().getResourceAsStream(...)
于 2013-01-18T15:59:40.867 回答
0

查看我的旧代码,这甚至可以工作

ByteBuffer buf = null;
    try{
    texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/" + key + ".png"));
    int texId = texture.getTextureID();
    buf = ByteBuffer.allocateDirect(4*texture.getImageWidth()*texture.getImageHeight());
    }catch(IOException e){
        e.printStackTrace();
    }   

    // Create a new texture object in memory and bind it
    //int texId = GL11.glGenTextures(); - if the trick with texture.getTextureID() won't work - use THIS
    GL13.glActiveTexture(GL13.GL_TEXTURE0);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, texId);

    // All RGB bytes are aligned to each other and each component is 1 byte
    GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);

    // Upload the texture data and generate mip maps (for scaling)
    GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, texture.getImageWidth(), texture.getImageHeight(), 0,
    GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buf);

    //then you can generate some mipmaps

    //Setup the ST coordinate system
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

    // Setup what to do when the texture has to be scaled
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR);

你需要的是texId.

我希望你知道如何使用纹理;)。

于 2013-01-18T19:11:58.010 回答
0

我所做的是我在 netbeans 项目中有一个名为source的文件夹,当我制作一个 .jar 时,我将它与 JarSplice 一起使用来加载 lib 和本机。然后我用 winrar 打开新的 .jar 并将拖到.jar 中,每次运行 .jar 时,它都会使用 jar 内的文件夹。source 与 res 相同,但我将其重命名。

所以基本上把你的 res 文件夹放到 .jar 中,它就可以工作了。

于 2013-01-18T20:16:05.653 回答