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