代码之家  ›  专栏  ›  技术社区  ›  Tesserex

有什么办法在C游戏中“拯救国家”吗?

  •  3
  • Tesserex  · 技术社区  · 15 年前

    如果答案是“不可能”,那没关系。我不会生气的。但我想知道,在使用c制作游戏时,是否有任何方法可以模拟控制台模拟器的“保存状态”功能。据我所知,模拟器有点简单,它们只是转储虚拟内存的全部内容、指令指针和所有内容。所以他们可以恢复完全相同的方式,在完全相同的地点在游戏代码一样。我知道我将无法从同一行代码恢复,但有没有任何方法,我可以保持整个游戏的状态,而不手动保存每一个变量?我想要一种方法,不需要扩展或修改每次我添加到我的游戏。

    我猜如果有可能的话,它会使用p/invoke…

    3 回复  |  直到 8 年前
        1
  •  12
  •   Joey Gumbo    15 年前

    好吧,原则上你也可以这样做。它叫 serialization . 同意,这和内存转储不是一回事,但已经足够接近了。

    要将类标记为可序列化,只需添加 Serializable attribute 对它:

    [Serializable]
    class GameState
    

    有关可能更改的类的其他信息:

    如果将新成员添加到可序列化类中,则可以使用 OptionalField attribute 允许无错误地反序列化对象的早期版本。此属性仅影响反序列化,并防止运行时在序列化流中缺少成员时引发异常。成员也可以用 NonSerialized attribute 以指示不应序列化。这将使这些成员的细节得以保密。

    修改默认的反序列化(例如,自动初始化标记为 NonSerialized ,类必须实现 IDeserializationCallback 接口并定义 IDeserializationCallback.OnDeserialization method

    对象可以以二进制格式序列化,以供其他.NET应用程序反序列化。该框架还提供 SoapFormatter XmlSerializer 对象以支持人类可读的跨平台XML中的序列化。

    艾斯 Wikipedia: Serialization, .NET Framework

        2
  •  3
  •   Robin Day    15 年前

    如果使每个“state”类都可序列化,则可以将对象按字面意思序列化为文件。然后,当需要继续时,可以从该文件重新加载它们。

    ISerializable

        3
  •  0
  •   Bill W    8 年前

    我同意其他的海报,使你的游戏状态类序列化可能是你想要的方式。其他人已经介绍了基本的序列化;对于高端的替代方案,您可以研究将对象持久化到数据库的nhibernate。您可以在以下链接中找到有关nhibernate的一些好信息: http://www.codeproject.com/KB/database/Nhibernate_Made_Simple.aspx

    http://nhibernate.info/doc/burrow/faq