保存多个精灵的游戏进度
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 的不同版本