2017-07-27 38 views
1

我正在製作一款遊戲,我想要保存遊戲功能。我有一個sprite組,我想使用shelf模塊進行保存,但當試圖保存我的sprite組時,我得到了'不能pickle Surface對象'的錯誤。我想知道是否有任何方法使用擱板模塊來保存一個Sprite組,如果沒有,我應該使用其他的保存方法嗎?如何使用擱置模塊保存一個pygame雪碧組

+0

'pygame.sprite.Sprites'和'pygame.sprite.Groups'不是表面的對象和與'pickle'一起工作。也許你想擱置一些額外的遊戲對象,而不是在加載時重新創建。 – Eric

+0

它看起來像精靈不能被醃漬,因爲它們包含一個'pygame.Surface'。另外,請記住,泡菜是不安全的,所以不要從不受信任的來源取消文件。這可能會造成問題,例如,如果用戶向您發送保存文件以調試某些內容。 – skrx

回答

1

當用戶想要保存遊戲時,我會將精靈的相關值存儲在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()