我正在用 Java 编写游戏,一切都或多或少运行良好,正如您在编码时所期望的那样,但我遇到的一个问题是将图像和声音文件读入游戏。我编写了一个在 Eclipse 中运行良好的方法,但是一旦我尝试在可运行的 jar(使用 Eclipse 导出)中对其进行测试,我的游戏就会卡在加载屏幕上,因为它无法读取文件。我意识到问题在于您无法在 Jar 中创建 File 对象,您必须使用流。这可以工作,但图像/声音位于文件夹中,我不太确定如何使用流读取文件夹中的文件(即不知道文件的数量)。因此,我尝试使用 ZipInputStream 重写该方法(在发布之前寻找解决方案时,我发现这是推荐的)。
imageMap = new HashMap<String, BufferedImage>();
String imagebase = "/images";
CodeSource src = PlatformerCanvas.class.getProtectionDomain().getCodeSource();
if(src != null)
{
URL jar = src.getLocation();
try
{
ZipArchiveInputStream zip = new ZipArchiveInputStream(jar.openStream());
ZipArchiveEntry ze = null;
while((ze = zip.getNextZipEntry()) != null)
{
System.out.println(ze.getName());
if(ze.getName().startsWith(imagebase) && ze.getName().endsWith(".png"))
{
loading++;
imageMap.put(ze.getName().replaceAll(imagebase + "/", ""), ImageIO.read(this.getClass().getResource(ze.getName())));
}
}
zip.close();
System.out.println("Finished Loading Images");
}
catch (IOException e)
{
e.printStackTrace();
}
}
但是,这完全跳过了 while 循环,因为 getNextZipEntry 返回 null。我尝试使用基本的 Zip 存档库,但有人推荐了 Apache Commons 库,但都没有用。我的 Jar 设置是这样的:
Jar
/game/gameClasses
/images/imageFiles
/sounds/soundFiles
/whateverOtherFoldersEclipseCreated
所以我的问题是:为什么这个当前的方法不起作用,我该如何解决?或者,我怎样才能以不同的方式加载图像/声音?我查看了许多其他问题并尝试了许多不同的方法,但没有一个对我有用。