2017-07-27 13 views
1

私はゲームを保存したいゲームを作っています。シェルフモジュールを使用して保存したいスプライトグループがありますが、スプライトグループを保存しようとすると「表面オブジェクトをピックアップできません」というエラーが表示されます。私はスプライトグループを保存するためにシェルフモジュールを使用する方法があるかどうか疑問に思っていました。shelveモジュールを使ってpygameスプライトグループを保存するには

+0

'pygame.sprite.Sprites'と' pygame.sprite.Groups'は、オブジェクト表面とされていません'pickle'で作業してください。おそらく、ロード時に再作成する必要があるいくつかの追加のゲームオブジェクトを棚上げしようとしています。 – Eric

+0

スプライトは 'pygame.Surface'を含んでいるため、ピクルできません。また、pickleは安全ではないので、信頼できないソースからのファイルを決してunpickleしないように注意してください。これは問題になる可能性があります。たとえば、ユーザーが何かをデバッグするために保存ファイルを送信した場合などです。 – 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() 
関連する問題