腌制包含pygame的字典.表面对象



所以我有一个名为Images的字典,它存储pygame.Surface对象。我不必每次运行代码时都构建整个字典,我只想从文件中读取它。

这是我尝试用来腌制和取消腌制字典的代码:

with open('Images.pkl', 'wb') as output:
pickle.dump(Images, output, pickle.HIGHEST_PROTOCOL)
with open('Images.pkl', 'rb') as input:
Images = pickle.load(input)

稍后,我使用以下代码:

class Survivor:
def __init__(self):
self.body_image=Images['Characters/Survivor/handgun/idle0']
self.body_rect=self.body_image.get_rect()

这给了我:

文件 "ZombieSurvival.py",第 1320 行,在init中 self.body_rect=self.body_image.get_rect(center=self.vector(
pygame.error: display Surface quit

pygame.Surface对象实际上是围绕SDL_Surface的包装器,是由 SDL 库处理的 C 结构。必须通过调用 SDL 库的SDL_CreateRGBSurface()函数来创建此结构。 这可能是在pygame.Surface.__init__()的某个地方完成的.

但是,取消实例不会以正常方式初始化它。正如泡菜文档所说:

当一个类实例被解腌时,它的init(( 方法通常是 未调用

所以 C 结构永远不会初始化,一切都出错了。

我能够首先使用 pygame 的pygame.image.tostring()函数将字典中的每个pygame.SurfaceImages转换为字符串,使用pygame.image.tostring()来腌制字典。然后我腌Images.每当我想使用Images时,我都会解开它并使用pygame.image.fromstring()将它中的每个字符串转换回pygame.Surface

但是,pygame.image.fromstring()要求我们告诉它即将转换的pygame.Surface的大小,因此我在使用pyame.image.tostring()函数之前保存了每个pygame.Surface的大小。

每次我要在pygame.Surface上呼叫pygame.image.tostring()时,我首先将pygame.Surface的密钥(它在Images中的位置(及其大小存储在具有字段keysizeclass实例中。我将此类的每个实例都存储在一个名为list_of_image_sizes的列表中,并对该列表进行了腌制。

现在,当您使用pygame.image.fromstring()函数时,您可以这样调用它:

for data in list_of_image_sizes:
Images[data.key]=pygame.image.fromstring(Image[data.key], data.size, 'RGBA')   
#RGBA is my particular argument, you can change it as you wish

相关内容

  • 没有找到相关文章

最新更新