1

我正在用 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

所以我的问题是:为什么这个当前的方法不起作用,我该如何解决?或者,我怎样才能以不同的方式加载图像/声音?我查看了许多其他问题并尝试了许多不同的方法,但没有一个对我有用。

4

1 回答 1

1

Or, how can I load the images/sounds in a different way that works?

One common technique is to include a list of resources in a known location in the Jar. Read the list, then iterate the lines (presuming one line per resource) & read the paths that way.

于 2013-07-08T05:10:57.220 回答