从文件夹加载纹理

时间:2013-02-20 06:17:13

标签: java textures embedded-resource jogl application-resource

我在将JPEG加载到球体上时遇到问题。目前,我使用它的唯一方法是将图像放在与加载它的类相同的包中。问题是,我不希望在一个与类混合的包下面有500多个纹理。出于组织原因,我宁愿将它们放在文件夹和子文件夹中。

如果纹理位于同一个包中,则可以:

InputStream iStream = null;

    try
    {
        iStream = getClass().getResourceAsStream(imageFile);
        TextureData data = TextureIO.newTextureData(iStream, false, null);
        testTex[i] = TextureIO.newTexture(data);
        testTex[i].getImageTexCoords();
        testTex[i].setTexParameteri(GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);
        testTex[i].setTexParameteri(GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST);
        iStream.close();
        ...

拍摄图像的方法采用以下形式:

String[] texture = { "bar1.jpg", "bar2.jpg" }; // imageFile is whichever is called

由于上面的代码完美无缺,再次,缺点是每个纹理都必须存储在与调用纹理的类相同的包中。但我想调用从我项目中的文件夹中得到这样的纹理:

String[] texture = { "res/foo/bar2.jpg", "res/foo/bar2.jpg" };

如何修改上面的代码以在项目中的文件夹中查找纹理?

2 个答案:

答案 0 :(得分:2)

// note leading '/' - indicates 'search from root of class-path'
String[] texture = { "/res/foo/bar2.jpg", "/res/foo/bar2.jpg" };
// ...
URL iUrl = getClass().getResource(texture[0]);
TextureData data = TextureIO.newTextureData(iUrl, false, "jpg");

在此示例中,我们在newTextureData(URL,boolean,String)中使用TextureIO API加载方法的重载形式。

答案 1 :(得分:2)

我认为你的问题只是你在res之前错过了一个斜杠。这肯定会奏效:

this.getClass().getResource("/res/img.jpg");

只要res包在你的src文件夹中。