2011-09-01 19 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的序列化版本。