gpt4 book ai didi

python - 我应该如何序列化包含 pygame 表面的游戏对象?

转载 作者:行者123 更新时间:2023-12-01 05:56:57 24 4
gpt4 key购买 nike

为了轻松保存游戏的游戏状态,我倾向于序列化包含所有游戏实体(也称为 Actor )的 game 对象。

我遇到的一个常见问题是无法 pickle pygame surfaces ,所以如果你的 actor 类如下所示:

class Actor(object):

def __init__(self, **kwargs):
self._image = kwargs['image']
self.pos = kwargs['pos']
...

def act(self):
...

def draw(self, surface):
surface.blit(self._image, self.pos)

你不能只用 python pickle/cpickle 来腌制它模块。

如何解决这个问题?

最佳答案

解决方案不是尝试序列化表面,而是将它们从游戏/游戏实体中删除并使用类似 lazy loading 的技术。例如恢复游戏状态后再次获取它们。

因此,不要将表面直接传递给实体,而是向其传递一个负责存储/检索表面的对象:

class Actor(object):

def __init__(self, **kwargs):
self._image_getter = kwargs['image_getter']
self.pos = kwargs['pos']
...

def draw(self, surface):
surface.blit(self._image_getter(), self.pos)

图像 getter 可能如下所示:

class SurfaceCapsule (object):

def __init__(self, resource_manager, key):
self._res = resource_manager
self._key = key

def __call__(self):
return self._res[self._key]

请注意,我在这里使用了一个类,因为方法本身也是不可选择的。

不要像这样创建实体:

actor = Actor(image=resource_manager[key])

你可以像这样创建它们:

actor = Actor(image_getter=SurfaceCapsule(resource_manager, key))

其中 resource_manager 是管理游戏所有界面的对象。

class RessourceManager(dict):

def __getitem__(self, key):
# implement lazy loading if you want, or load all images at startup
# load surface is necessary, cache it, and return it

def __load_surface_by_key(key):
# load stuff

在保存游戏状态之前,您必须clear()它,然后您就可以愉快地序列化它。

<小时/>

另一种方法是外包角色的绘制,这样您只需将标识符存储到角色的表面即可。

class Actor(object):

def __init__(self, **kwargs):
self.image_key = kwargs['image_key']

在你的游戏类中:

def draw(self):
for actor in self._actors:
self._screen.blit(resource_manager[actor.image_key], actor.pos)

但是如果你的 Actor 使用多个表面来代表他们自己,这有点麻烦。

关于python - 我应该如何序列化包含 pygame 表面的游戏对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12006672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com