在导出的jar文件中,不加载纹理

时间:2013-01-18 15:57:29

标签: java textures lwjgl slick2d

我正在使用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的方法,但我没有任何工作方式。

3 个答案:

答案 0 :(得分:0)

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

 getClass().getClassLoader().getResourceAsStream(...)

答案 1 :(得分: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

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

答案 2 :(得分:0)

我所做的是在netbeans项目中有一个名为 source 的文件夹,当我创建一个.jar时,我使用它与JarSplice一起加载lib和native。然后我用winrar打开了新的.jar,我将拖到了.jar中,每次运行.jar时都会使用jar里面的文件夹。 source和res一样,但我重命名了。

所以基本上把你的res文件夹放到.jar中它会起作用。