Хранение unpicklabe pygame.Surface объектов во внешних файлах

У меня проблема: я пишу прототип игры на Python, используя Pygame, и хочу сохранить свои игры. Все связанные с игрой данные представлены в трех экземплярах определенных классов, и я хочу сохранить эти три экземпляра в файл. Тем не менее, я попытался собрать эти экземпляры, и это не сработает. Вместо этого я получаю "TypeError: не может очертить объекты Surface". Это проблема, потому что я хочу хранить объекты Surface.

Я открыт для любых вариантов травления, которые могут быть, используя любой другой тип данных. Важно то, что эти экземпляры сохраняются и их данные затем извлекаются позже. Итак, что я могу сделать, чтобы преодолеть эту проблему? Пожалуйста, имейте в виду, я не очень опытный программист, узнав Python в свое свободное время год назад, и я не могу писать много другого языка, хотя я медленно изучаю С++.

Ответ 1

Основной точкой травления является то, что вы должны как-то сериализовать объект. Поверхность SDL является объектом памяти, содержащим много времени выполнения. Попытка сериализации это не совсем разумно.

Что вы должны сделать, так это отделить состояние вашей игры от компонентов рендеринга, чтобы вы могли сериализовать только те (травление или что-то еще).

Ему нравится пытаться сохранить состояние видео, как-то сохраняя буферы памяти, содержащие декодированное видео. Это не будет работать. Вместо этого, как вы его сохраняете, это сериализация местоположения видеофайла и смещения по времени. Затем вы можете продолжить воспроизведение при загрузке при следующем восстановлении приложения.

Ответ 2

Чтение http://docs.python.org/library/pickle.html#pickle-protocol, вам необходимо либо экспортировать объекты Surface в метод уменьшить, либо использовать модуль copy_reg рассказать о том, как обрабатывать эти данные, как описано в http://docs.python.org/library/copy_reg.html#module-copy_reg.

В любом случае, что нужно для рассола, это функция, которая превратит blob, который он не может обработать в (some_class, [arguments here]). И тогда, когда вы распакуете его, он построит новую вещь этого класса с этими аргументами.