之前提出过这个问题,我已经搜索了很多答案。它始终以“你想要getResourceAsStream”结尾。这不是我要找的。 p>
我的问题是,对于一个游戏对象,我使用文件夹结构来保持精灵条而不是一个大的精灵。这导致:
媒体/ 角色名字/ AnimationName / image.extension
编程对象只是将它的文件夹保存为字符串,然后将getResource()URL传递给对象以填充图像映射。可以有{n}个动画名称/子目录。我的错误来自此代码:
dir = new File(s.toURI());
我获取目录,并调用listFiles并将找到的文件名传递给sprite loader。这是一段代码:
dir = new File(s.toURI());
File[] chld = dir.listFiles();
//get a list of files in the image/character folder
for(File f:chld)
{
//get a list of the files for each dir
File[] grandChild = f.listFiles();
for(File t:grandChild)
{
String fname = t.getAbsolutePath();
System.out.println(fname);
String temp = fname;
temp = temp.substring(temp.lastIndexOf("/") + 1,temp.lastIndexOf("."));
String animName = temp.replaceAll("\\d*$", "");
int numPics = 0;
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(temp);
while(m.find()){
numPics = Integer.parseInt(m.group());
}
System.out.println("animation name: " + animName);
System.out.println("file name: " + fname);
System.out.println("number of pictures: " + numPics);
Animations.put(animName, sl.loadStripImageArray(fname, numPics));
}
}
请原谅不良的命名和临时变量,它仍在继续工作。
sl是sprite加载器,Animations是一个哈希映射。这工作正常,直到我打包项目。我不想编写一堆复杂的代码,只有在我有一个jar文件时才能工作,而不是在我使用源文件夹的netbeans工作时。
我考虑过拥有一个应用程序数据文件夹,但如果可以的话,我想继续使用jar包。
答案 0 :(得分:1)
您执行仍希望使用getResourceAsStream
。这里没有任何要求所有资源必须保存在JAR中的同一文件夹中。您可以通过在路径前加/
前缀来使用相对路径或绝对路径到JAR的根目录。
您无法使File
使用JAR中的资源 - 即使使用指向JAR中包含的资源的URL进行实例化。
您可能必须重做其他一些事情,因为类路径实际上并不是要枚举(因为您当前列出了父目录中的文件)。它旨在按名称检索资源。所以一种可能性(我建议)是有一个“清单”文件,其中包含要从每个目录加载的文件。 (读取此文件,然后按名称加载其他资源。)
或者,如果您可以找到要加载的JAR文件的名称,则可以从中创建Jarfile
,然后调用其entries()
方法查找所有包含的资源。但即便如此,它们也不是以“树结构”返回的,所以理想情况下,你会读到这个,从它创建自己的树结构(可能是一系列地图),然后用它来检索“目录”列表“根据需要。
答案 1 :(得分:0)
如果您完全确定精灵位于jar中 - 您可以尝试使用JarFile
类。方法entries。我没有尝试,但似乎返回位于整个jar文件中的所有资源。您必须过滤掉正确路径中的资源。