Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用搁置模块保存pygame sprite组_Python_Pygame - Fatal编程技术网

Python 如何使用搁置模块保存pygame sprite组

Python 如何使用搁置模块保存pygame sprite组,python,pygame,Python,Pygame,我正在制作一个游戏,我想在其中有一个保存游戏的功能。我有一个sprite组,我想使用shelf模块保存它,但是在尝试保存sprite组时,我遇到了一个“不能pickle Surface objects”错误。我想知道是否有任何方法可以使用shelf模块来保存精灵组,如果没有,我应该使用什么其他保存方法?当用户想要保存游戏时,我会将精灵的相关值存储在json文件中。要加载游戏,请清空精灵组,用加载的数据重建精灵并将其添加到组中。例如(单击精灵将其拖动,然后按“s”保存,按“w”加载): pygam

我正在制作一个游戏,我想在其中有一个保存游戏的功能。我有一个sprite组,我想使用shelf模块保存它,但是在尝试保存sprite组时,我遇到了一个“不能pickle Surface objects”错误。我想知道是否有任何方法可以使用shelf模块来保存精灵组,如果没有,我应该使用什么其他保存方法?

当用户想要保存游戏时,我会将精灵的相关值存储在json文件中。要加载游戏,请清空精灵组,用加载的数据重建精灵并将其添加到组中。例如(单击精灵将其拖动,然后按“s”保存,按“w”加载):


pygame.sprite.sprite
pygame.sprite.Groups
不是表面对象,可以使用
pickle
。可能您正试图搁置一些应在加载时重新创建的其他游戏对象。看起来无法对精灵进行酸洗,因为它们包含
pygame.Surface
。另外,请记住pickle是不安全的,所以永远不要从不受信任的来源解除pickle文件。这可能会有问题,例如,如果用户向您发送一个保存文件以调试某些内容。
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()