【问题标题】: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)

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

【问题讨论】:

    标签: python save pygame pickle


    【解决方案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 有一个图像存储为其变量之一。我不确定我该如何解决这个问题..
    • 我已添加说明,用于解决您的某些数据无法序列化的问题。
    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多