解决方案不是尝试序列化表面,而是从您的游戏/游戏实体中删除它们并使用延迟加载等技术,例如在恢复游戏状态后再次获取它们。
因此,与其将表面直接传递给实体,不如将其传递给负责存储/检索表面的对象:
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)
image 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)
但是如果你的演员使用多个表面来代表他们自己,这有点麻烦。