2011-07-13 68 views
5

我正在創建一個基本的2D遊戲(以及遊戲引擎),目前我一直在爲我的數據開發文件格式。當然,爲了這個遊戲運行,我需要緩存。我發現把遊戲的所有數據都保存在一個文件中是不專業的(只要文件是某種緩存格式就不一定是這樣)。爲遊戲存儲數據的最佳方式? (圖片,地圖等)

所以這就是我來這裏問的原因。我正在考慮做一個zip文件,但我覺得這並不是最好的方法。我也在考慮做另一個二進制編寫器,它會爲每個文件設置標題(文件類型,「位置」)和封閉標籤,這樣很容易理解。但我覺得這樣太沒有效率了。

那麼請你有什麼想法嗎?

注:這個遊戲引擎真的只是爲了學習的目的。

tl; dr我需要一種有效的方式來存儲數據,例如我製作的遊戲的圖像。

+0

您是否想寫入緩存?或者您是否只是打包所有靜態內容? –

+0

大量遊戲將圖像和聲音存儲爲基本圖像和聲音文件。如果你真的想這樣做,在遊戲完成後添加它,否則它會減慢開發速度,因爲你必須編譯代碼和資產。 – thedaian

+0

@Dumum Ranatunga - 我希望能夠寫入緩存,或者至少能夠添加新內容。 – Fellixombc

回答

7

您可以將任何對象存儲爲.dat file

public class MyGame implements Serializable 
{ 
    private static void saveGame(ObjectType YourObject, String filePath) throws IOException 
    { 
     ObjectOutputStream outputStream = null; 
     try 
     { 
      outputStream = new ObjectOutputStream(new FileOutputStream(filePath)); 
      outputStream.writeObject(YourObject); 
     } 
     catch(FileNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     finally 
     { 
      try 
      { 
       if(outputStream != null) 
       { 
        outputStream.flush(); 
        outputStream.close(); 
       } 
      } 
      catch(IOException ex) 
      { 
       ex.printStackTrace(); 
      } 
     } 
    } 

    public static ObjectType loadGame(String filePath) throws IOException 
    { 
     try 
     { 
      FileInputStream fileIn = new FileInputStream(filePath); 
      ObjectInputStream in = new ObjectInputStream(fileIn); 
      return (ObjectType) in.readObject(); 
     } 
     catch(FileNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 
+0

啊,是的,我用這個寫作和閱讀我的地圖文件。這是我正在考慮的想法之一,但我怎樣才能存儲和管理圖像文件? – Fellixombc

+0

@Fellixombc存儲圖像(JPG,GIF,BMP,...等) –

+0

哦,我沒有意識到你可以做到這一點。謝謝。 – Fellixombc

2

我不認爲zip文件走錯了路。這是一個相當好的方法。只需將所有內容放在jar文件中。你甚至可以使用類加載器來加載它。

+0

+1:Jar是比Zip更好的選擇,並且使用getResourceAsInputStream()從類加載器獲取任何資源意味着您可以讓該文件成爲開發目錄,稍後在jar中而不更改代碼 –

+0

您無法寫入JAR與類加載器掛鉤。所以這個解決方案將作爲一個可寫緩存失敗。 –

+0

這實際上聽起來很有趣,而且會是一個很好的學習體驗,謝謝! – Fellixombc

1

出於實用的原因,我建議使用多個文件,但將它們全部放在temp的子目錄中。

但是,如果你學習活動的一部分,與此有關的話題,我的建議:

首先,像ZIP任何格式,其中有刪除,更新,增加了重罰躲得遠遠的,跳躍。即使使用JAR的索引文件,除了壓縮之外,它們也很差。

所以你可以閱讀文件系統。本質上,你正在寫一個文件系統,其中「磁盤」只是一個二進制文件。這應該讓你對分配表有很高的理解,等等。爲了實現這樣的設計,你需要對底層文件進行讀/寫訪問;看看java.io.RandomAccessFile

最後,如果你願意使用Java7,你可以玩新的filesystem SPIs

+0

非常感謝!我會繼續,看看RandomAccess 文件,看看我能做些什麼。是的,我正在嘗試學習新的方法來做更多的事情,同時探索java! – Fellixombc