保存多个精灵的游戏进度

Posted

技术标签:

【中文标题】保存多个精灵的游戏进度【英文标题】:Save Game Progress for Multiple Sprites 【发布时间】:2016-06-23 15:47:43 【问题描述】:

我正在 Pygame 中开发一个游戏,其中包括一个玩家类和一个敌人类。每个类中都有多个变量。我试图弄清楚如何使用 Python 的内置 pickle 模块来保存这些精灵的数据。我想过做类似的事情:

data_file = open_file("save.dat","wb")
for i in enemyList:
    pickle.dump(i.health)
    pickle.dump(i.rect.x)
    pickle.dump(i.rect.y)
    pickle.dump(i.image)

对每个变量以此类推。如何保存数据并以与之前相同的状态检索数据?

【问题讨论】:

【参考方案1】:

回答

由于 pickle 是对象序列化,您应该能够转储整个对象。 wb 中的 b 用于二进制。这是因为你不必知道一个对象是如何用二进制表示的,你可以像这样转储它:

data_file = open_file("save.dat","wb")
for i in enemyList:
  pickle.dump(i, data_file)

然后,当您重新加载它时,您将拥有整个对象。

打开它:

with open('save.dat', 'rb') as fp:
  i = pickle.load(fp)

我以前没用过pickle,但是因为它都是二进制的,如果它是一个对象,你应该能够转储你的enemyList:

data_file = open_file("save.dat","wb")
pickle.dump(enemyList, data_file)

with open('save.dat', 'rb') as fp:
  enemyList = pickle.load(fp)

排除/包含其他状态

Pickle 使用__getstate____setstate__ 方法在读写pickle 序列化数据之前改变状态。如果您希望省略反序列化数据,则必须覆盖这些方法。以下是帮助您执行此操作的文档:

Pickle State

考虑

序列化(以及 python pickle)被视为创建自己的文件格式的替代方法。很多时候,我发现根据数据类型更容易。如果您无法控制对象层次结构,有时您不想创建自己的继承对象来尝试控制所有数据。有时编写自己的文件格式更容易。

【讨论】:

它给了我TypeError: can't pickle Surface objects 我相信这是因为我的enemyList 有一个图像存储为其变量之一。我不确定我该如何解决这个问题.. 我已添加说明,用于解决您的某些数据无法序列化的问题。

以上是关于保存多个精灵的游戏进度的主要内容,如果未能解决你的问题,请参考以下文章

什么是在 Unity3D 制作的游戏中保存游戏进度的最佳实践,以及适用于 Android 和 iOS 的不同版本

Cocos2dx学习笔记12:cocos2dx进度条(ProgressTimer)

打游戏要存进度-备忘录模式

是否可以在没有外部文件的情况下在 Java 中保存进度?

Swift,SpriteKit:如何保存场景的整个进度

Python处理列表/队列中的项目并保存进度