2013-07-07 95 views
1

我正在用java寫一個遊戲,所有的工作或多或少都如你所期望的那樣工作,但我遇到的一個問題是讀取圖像並且聲音文件進入遊戲。我寫了一個在Eclipse中運行得非常好的方法,但是當我嘗試在可運行的jar(使用Eclipse導出)中測試它時,我的遊戲因爲無法讀取文件而卡在加載屏幕上。我意識到存在的問題是您無法在Jar中創建File對象,您必須使用流。這可以工作,但圖像/聲音位於文件夾內,我不太確定如何使用流讀取文件夾內的文件(即不知道文件數量)。正因爲如此,我試圖用ZipInputStream重寫方法(我發現這是在發佈之前尋找解決方案時推薦的)。這就是現在的方法:在Jar中讀取文件(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 
/game/gameClasses 
/images/imageFiles 
/sounds/soundFiles 
/whateverOtherFoldersEclipseCreated 

所以我的問題是:爲什麼不是這個當前方法的工作,如何解決?或者,我如何以不同的方式加載圖像/聲音? 我看了很多其他問題,並嘗試了很多不同的東西,但都沒有爲我工作。

+0

你的遊戲是基於GUI的嗎? –

+0

不是100%確定你的意思,但我使用緩衝策略在畫布上進行繪圖。 @JtheRocker – StrongJoshua

+0

你想提取的jar/zip文件的名稱是什麼? –

回答

1

或者,如何以不同的方式加載圖像/聲音?

一種常見的技術是在Jar中的已知位置包含資源列表。閱讀列表,然後迭代行(假設每個資源一行)&以這種方式讀取路徑。

+0

這個,我可能最終會做,但有沒有辦法讓方法檢查我是從jar還是從Eclipse運行它(檢查單詞「jar」的路徑工作?)。 – StrongJoshua

+0

所以我做了一個小課,將所有圖像和聲音「打包」到.txt文件中,如果遊戲是從Jar運行(如果(checkJar.rsrc)),則該文件將被讀取。我現在有另一個問題,但是這個問題已經解決了。謝謝 :) – StrongJoshua