1
我正在製作一款遊戲,我想要保存遊戲功能。我有一個sprite組,我想使用shelf模塊進行保存,但當試圖保存我的sprite組時,我得到了'不能pickle Surface對象'的錯誤。我想知道是否有任何方法使用擱板模塊來保存一個Sprite組,如果沒有,我應該使用其他的保存方法嗎?如何使用擱置模塊保存一個pygame雪碧組
我正在製作一款遊戲,我想要保存遊戲功能。我有一個sprite組,我想使用shelf模塊進行保存,但當試圖保存我的sprite組時,我得到了'不能pickle Surface對象'的錯誤。我想知道是否有任何方法使用擱板模塊來保存一個Sprite組,如果沒有,我應該使用其他的保存方法嗎?如何使用擱置模塊保存一個pygame雪碧組
當用戶想要保存遊戲時,我會將精靈的相關值存儲在json文件中。要加載遊戲,請清空精靈組,使用加載的數據重建精靈並將它們添加到組中。例如。 (點擊精靈來拖動它們,按「S」鍵保存並「W」來加載):
import json
import pygame as pg
class Actor(pg.sprite.Sprite):
def __init__(self, pos, color):
super().__init__()
self.color = color
self.image = pg.Surface((32, 52))
self.image.fill(self.color)
self.rect = self.image.get_rect(topleft=pos)
class Game:
def __init__(self):
self.fps = 30
self.done = False
self.bg_color = pg.Color('gray13')
self.clock = pg.time.Clock()
self.screen = pg.display.set_mode((640, 480))
actor1 = Actor((250, 120), pg.Color('steelblue1'))
actor2 = Actor((400, 260), pg.Color('sienna1'))
self.all_sprites = pg.sprite.Group(actor1, actor2)
self.selected = None
def run(self):
while not self.done:
self.handle_events()
self.run_logic()
self.draw()
self.clock.tick(self.fps)
def handle_events(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.done = True
elif event.type == pg.MOUSEBUTTONDOWN:
if self.selected:
self.selected = None
else:
for sprite in self.all_sprites:
if sprite.rect.collidepoint(event.pos):
self.selected = sprite
elif event.type == pg.MOUSEMOTION:
if self.selected:
self.selected.rect.x += event.rel[0]
self.selected.rect.y += event.rel[1]
elif event.type == pg.KEYDOWN:
if event.key == pg.K_s:
self.save()
elif event.key == pg.K_w:
self.load()
def run_logic(self):
self.all_sprites.update()
def draw(self):
self.screen.fill(self.bg_color)
self.all_sprites.draw(self.screen)
pg.display.flip()
def save(self):
with open('save_game.json', 'w') as file:
print('Saving')
data = [(sprite.rect.topleft, sprite.color[:4])
for sprite in self.all_sprites]
json.dump(data, file)
def load(self):
with open('save_game.json', 'r') as file:
print('Loading')
data = json.load(file)
self.selected = None
self.all_sprites.empty()
for pos, color in data:
self.all_sprites.add(Actor(pos, color))
if __name__ == '__main__':
pg.init()
Game().run()
pg.quit()
'pygame.sprite.Sprites'和'pygame.sprite.Groups'不是表面的對象和與'pickle'一起工作。也許你想擱置一些額外的遊戲對象,而不是在加載時重新創建。 – Eric
它看起來像精靈不能被醃漬,因爲它們包含一個'pygame.Surface'。另外,請記住,泡菜是不安全的,所以不要從不受信任的來源取消文件。這可能會造成問題,例如,如果用戶向您發送保存文件以調試某些內容。 – skrx