<p>不能序列化/pickle/shelve pygame的<code>Surface</code>对象(至少不需要大量的努力)。所以你的问题的答案是:不要尝试序列化你的表面(这只会浪费磁盘空间)。在</p>
<p>例如,您可以创建一个简单的<code>dict</code>来存储曲面,并让您的类只存储键,例如:</p>
<pre><code>menuspr=pygame.image.load('images/menu.png').convert()
b1spr=pygame.image.load('images/b1.png').convert()
b2spr=pygame.image.load('images/b2.png').convert()
currentbspr=b1spr
curspr=pygame.image.load('images/curs.png').convert()
curspr.set_colorkey((0,255,0))
# create a dict to store all surfaces
surf_dict = {'b1spr': b1spr,
'b2spr': b2spr,
'currentbspr': currentbspr,
'curspr': curspr}
...
class Block(object):
def __init__(self,x,y,spr):
self.x=x
self.y=y
self.sprite=spr
# self.sprite is no longer a Surface, but a str
self.rect=surf_dict[self.sprite].get_rect(x=self.x,y=self.y)
...
...
# don't pass the surface to the Block, just the key
instances.append(Block(placepos[0],placepos[1], 'currentbspr'))
...
for i in instances:
# get the Surface from the dict, not from the instance itself
screen.blit(surf_dict[i.sprite],i.rect)
</code></pre>
<p>现在您可以节省地尝试pickle/sheldall<code>Block</code>-实例(我看到您已经问了一个相关的问题<a href="https://stackoverflow.com/questions/19003633/save-a-list-of-objects-on-exit-of-pygame-game/">here</a>)。在</p>