1
私はゲームを保存したいゲームを作っています。シェルフモジュールを使用して保存したいスプライトグループがありますが、スプライトグループを保存しようとすると「表面オブジェクトをピックアップできません」というエラーが表示されます。私はスプライトグループを保存するためにシェルフモジュールを使用する方法があるかどうか疑問に思っていました。shelveモジュールを使ってpygameスプライトグループを保存するには
私はゲームを保存したいゲームを作っています。シェルフモジュールを使用して保存したいスプライトグループがありますが、スプライトグループを保存しようとすると「表面オブジェクトをピックアップできません」というエラーが表示されます。私はスプライトグループを保存するためにシェルフモジュールを使用する方法があるかどうか疑問に思っていました。shelveモジュールを使って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'を含んでいるため、ピクルできません。また、pickleは安全ではないので、信頼できないソースからのファイルを決してunpickleしないように注意してください。これは問題になる可能性があります。たとえば、ユーザーが何かをデバッグするために保存ファイルを送信した場合などです。 – skrx