Хранение unpicklabe pygame.Surface объектов во внешних файлах - PullRequest
3 голосов
/ 28 февраля 2011

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

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

Ответы [ 2 ]

5 голосов
/ 28 февраля 2011

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

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

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

2 голосов
/ 28 февраля 2011

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

.

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

...