2011-09-01 68 views
2

我一直在爲Android編寫一個紙牌遊戲,而且我拼命地停留在如何保存我的遊戲狀態。爲了簡要解釋我的程序,我有一個Sprite類來顯示我的卡片,其中包含位圖圖像,位置點和邊界矩形。我繼承這個類來創建一個卡類,其中有兩個位圖根據卡片是正面還是向下進行切換,以及用於存儲花色和等級的枚舉。這些卡片對象被放置在包含和附加位置的CardStack對象以及卡片的陣列列表中。遊戲模型包含各種CardStack,以及棧之間移動卡的規則。遊戲的效果很好。無需序列化的Java深度複製

現在我想弄清楚如何保存我的遊戲狀態。我想序列化我的整個遊戲對象並將其保存到文件中。但是,有很多不可序列化的對象(位圖,點,矩形,顏色等)。在C#中,我知道你可以使用一個MemoryStream並複製整個對象,但是我不能在Java中找到一個不需要所有東西都可序列化的類似方法。 Java中有沒有類似的東西?任何更好的方式我可以構建我的遊戲模型對象?任何建議將不勝感激。謝謝!

+4

你並不需要保存的東西像一個位圖d矩形。將堆棧的位置與位置一起保存,並在其中添加卡片的枚舉應該足以恢復狀態並且還可以節省內存。 – Joru

+0

不知道遊戲如何玩,我不知道你必須保存哪些信息。但是如果我想象的方式是正確的,那麼你是否只需要將所有堆疊中的每張牌的值和套件存儲起來就可以重新創建遊戲狀態?如果你知道卡片套件和等級,可以計算出位圖和顏色。至於位置(點和矩形)這些確切的重要嗎? I.E.允許用戶將卡/堆棧移動到任何x/y位置嗎?或者是否有允許的「插槽」?如果後者只需要存儲卡/堆棧應該在哪個插槽中。 – FoamyGuy

回答

4

抽象的圖形用戶界面爲業務對象,使GUI對象封裝這些業務對象

這樣一張卡並不需要知道它需要什麼樣顯示位圖(或者甚至它能夠在所有顯示的)

這些業務對象是你想要的序列化和GUI可以從反序列化可以重建對象

1

您可以隨時在Java的序列化框架中編寫自己的定製序列化方法。見Serializable。在序列和反序列化過程中需要進行特殊處理

的類必須實現具有下列準確簽名的特殊方法:

private void writeObject(java.io.ObjectOutputStream out) throws IOException 
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; 
private void readObjectNoData() throws ObjectStreamException; 

你是正確的,如果你的對象包含非Java的默認實現將失敗可序列化的對象,但您可以定義如何在上面的方法中序列化它們。

另外:在Android上,您可能需要使用Parcelable這是Android的序列化版本。