在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.Surface
s,但它们可能至少包含一个pygame.Surface
- 换句话说,Tower
类的实例变量之一是一个@ 987654331@,不能腌制。我认为酸洗无论如何都不是您想要的,您最好将对象的所需属性写入 JSON 或 csv 文件或类似文件。当需要再次加载对象时,这样的格式也很容易解析/读取。
【参考方案1】:
很可能您的 Tower 类包含一些对 pygame.Surface 实例的引用,根据the documentation for pickle,可能由于几个原因而无法腌制。
无论如何,都有一些解决方法。您可以将您的 tower 类转换为可挑选的东西(如字典)或 refer to pickle's documentation 了解如何自定义您的 tower 类的酸洗。
希望这会有所帮助!
【讨论】:
以上是关于在python,pygame中腌制游戏数据的主要内容,如果未能解决你的问题,请参考以下文章