1

私は Java でゲームを書いていますが、コーディング時に予想されるように、すべてが多かれ少なかれうまく機能していますが、私が遭遇した 1 つの問題は、画像とサウンド ファイルをゲームに読み込むことです。Eclipse 内で非常にうまく機能するメソッドを作成しましたが、(Eclipse を使用してエクスポートされた) 実行可能な jar でテストしようとすると、ファイルを読み取れないため、ゲームがロード画面でスタックします。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();
        }
    }

ただし、getNextZipEntry が null を返すため、これは while ループを完全にスキップします。ベースの Zip アーカイブ ライブラリを使用してみましたが、誰かが Apache Commons ライブラリを推奨しましたが、どちらも機能しませんでした。私のJarセットアップはこれです:

Jar
/game/gameClasses
/images/imageFiles
/sounds/soundFiles
/whateverOtherFoldersEclipseCreated

だから私の質問はこれです: なぜこの現在の方法が機能しないのですか? どうすれば修正できますか? または、別の方法で画像/サウンドを読み込むにはどうすればよいですか? 他の多くの質問を見て、さまざまなことを試しましたが、うまくいきませんでした。

4

1 に答える 1