在python,pygame中腌制游戏数据

Posted

技术标签:

【中文标题】在python,pygame中腌制游戏数据【英文标题】:Pickling game data in python, pygame 【发布时间】:2020-03-31 17:38:41 【问题描述】:

我正在使用 pygame 制作塔防级别编辑器,如果用户按下“保存”按钮,我需要能够保存用户创建的地图。目前我只是试图在塔上实现“保存”,因为这就是应用程序所做的一切。所以我有一个名为towers 的列表,其中包含塔 来自Tower() 类的对象。我试图腌制单独的塔对象,但没有用。

towers = [Tower(), Tower()]
def save_towers(self, towers):
     with open("game_data.picle", "wb") as tower_data:
          for tower in towers:
                pickle.dump(tower, tower_data)

 if user_pressed_save():
        save_towers()

然后我尝试腌制整个列表,但也没有用

with open("game_data.picle", "wb") as tower_data:
     pickle.dump(towers, tower_data)

他们都给出了同样的错误:

    pickle.dump(towers, tower_data)
TypeError: cannot pickle 'pygame.Surface' object

但是,它们都不是 pygame.Surface。我究竟做错了什么?另外,请让我知道是否有更好的方法来做到这一点,因为这是我第一次制作实际的程序。

编辑: 我觉得值得一提的是: 以下属性属于塔类,但我不明白这会如何导致错误self.tower = pygame.Surface((self.size)).convert()

【问题讨论】:

如果你得到这样的属性,你可以把它们保存到一个文件中。 -> 对于属性,vars(theObject).iteritems() 中的值: print(property,": ", value) Tower 实例可能不是pygame.Surfaces,但它们可能至少包含一个pygame.Surface - 换句话说,Tower 类的实例变量之一是一个@ 987654331@,不能腌制。我认为酸洗无论如何都不是您想要的,您最好将对象的所需属性写入 JSON 或 csv 文件或类似文件。当需要再次加载对象时,这样的格式也很容易解析/读取。 【参考方案1】:

很可能您的 Tower 类包含一些对 pygame.Surface 实例的引用,根据the documentation for pickle,可能由于几个原因而无法腌制。

无论如何,都有一些解决方法。您可以将您的 tower 类转换为可挑选的东西(如字典)或 refer to pickle's documentation 了解如何自定义您的 tower 类的酸洗。

希望这会有所帮助!

【讨论】:

以上是关于在python,pygame中腌制游戏数据的主要内容,如果未能解决你的问题,请参考以下文章

用python2.7编的小游戏

如何使用搁置模块保存 pygame 精灵组

python之pygame小游戏

Python 游戏之旅(Pygame)

蹲在python平台游戏中与pygame

Pygame/Python 游戏不接收输入