如何保存游戏状态

本文关键字:游戏 状态 保存 何保存 | 更新日期: 2023-09-27 18:34:28

所以我目前正在做一个简单的游戏项目,大多数人从"breakout"开始.part我的目标是以最简单的方式制作当前游戏状态的游戏保存。例如。

==

场景==

然后假设我输掉了游戏,或者因为累了而想上床睡觉,所以我想将游戏状态重新加载到我回到球拍、球和砖块的相同位置。 唯一的问题是我有多个表单,我只想将此特定表单保存在其特定状态。

我对如何接近有一个想法(我会找到一种方法来保存球拍、球和砖块的位置以及确切的时间(,只是我不知道我将如何执行它。我究竟如何才能实现这一壮举?

如何保存游戏状态

这可能是一个非常复杂的问题,但在你的情况下,我建议从简单开始,然后随着你的游戏变得更加复杂而从那里开始。从本质上讲,概率称为序列化。或者,将应用程序的内存写出到磁盘或数据库,以便以后可以读回内存。

有很多技术可以做到这一点,例如将对象转换为XML或JSON或其他二进制文件格式。例如,位图文件只是内存中某些图像结构的序列化形式。

我真的不知道你用什么技术来制作你的游戏,除了C#(XNA?但本质上,您希望使用环境中可用的某种文件系统 API,并在其中编写序列化对象。根据您的问题,您可能需要重新设计一些游戏来促进这一点。一般来说,最好有一个单一的"真实来源"来表示你的游戏状态,但即使你没有,你仍然可以弄清楚。

因此,以下是我将采取的步骤的粗略概述...

序列化

  1. 编写一个例程,用于获取游戏状态并输出更简单的可序列化对象。
    • 这些简单对象大多具有所有没有功能的公共 getter/setter 属性。
    • 尝试只写出稍后再次重新创建游戏状态所需的最低限度信息。
    • 例如,请参阅国际象棋如何序列化游戏状态:国际象棋符号
  2. 将这些对象序列化为 JSON(因为它既简单又灵活(
  3. 将该 json 写入磁盘。
    • 我可能会在这里使用公约基础方法。
    • 如"Saves''game1.json"是第一个游戏槽的状态。
    • 只需根据正确名称的文件的存在来推断保存的游戏。

反序列化

  1. 根据上述约定查找游戏存档。
  2. 将 JSON 反序列化回简单序列化对象。
  3. 通过查看序列化对象重新创建更复杂的游戏状态。
    • 考虑使用访客模式。
  4. 使用新冻结的游戏状态恢复游戏。

[编辑:添加一些额外的链接和快速代码示例]

这是一个相当不错的开源 json 库: http://json.codeplex.com/

// somehow convert your game state into a serializable object graph
var saveState = gameState.Save();
// use json.net to convert that to a string
string json = JsonConvert.SerializeObject(saveState, Formatting.Indented);
// save that string to the file system using whatever is available to you.
fileSystemService.WriteAllText("Saves'game1.json", json);

您可以简单地将其保存在XML文件中,然后在启动时读取XML文件。