Любой способ "сохранить состояние" в игре C #? - PullRequest
3 голосов
/ 17 февраля 2010

Это нормально, если ответ на этот вопрос «это невозможно». Я не буду расстроен Но мне интересно, при создании игры на C # можно ли имитировать функциональность функции сохранения состояния консольных эмуляторов. Насколько я понимаю, в эмуляторах это довольно просто: они просто выгружают все содержимое виртуализированной памяти, указатели инструкций и все такое. Таким образом, они могут возобновить точно так же, в том же месте в коде игры, что и раньше. Я знаю, что не смогу возобновить работу с той же строки кода, но есть ли способ сохранить все состояние игры, не сохраняя вручную каждую переменную? Мне нужен способ, который не нужно расширять или изменять каждый раз, когда я добавляю что-то в свою игру.

Я предполагаю, что если бы был какой-либо возможный способ сделать это, он использовал бы p / invoke ...

Ответы [ 3 ]

12 голосов
/ 17 февраля 2010

Ну, в C # вы можете сделать то же самое, в принципе. Это называется сериализация . Согласен, это не то же самое, что дамп памяти, но достаточно близко.

Чтобы пометить класс как сериализуемый, просто добавьте к нему атрибут Serializable :

[Serializable]
class GameState

Дополнительная информация о классах, которые могут измениться:

Если новые члены добавляются в сериализуемый класс, они могут быть помечены атрибутом OptionalField , чтобы разрешить десериализацию предыдущих версий объекта без ошибок. Этот атрибут влияет только на десериализацию и не позволяет среде выполнения генерировать исключение, если член отсутствует в сериализованном потоке. Член также может быть помечен атрибутом NonSerialized , чтобы указать, что его нельзя сериализовать. Это позволит сохранить детали этих членов в тайне.

Чтобы изменить десериализацию по умолчанию (например, для автоматической инициализации члена, помеченного NonSerialized), класс должен реализовать интерфейс IDeserializationCallback и определить метод IDeserializationCallback.OnDeserialization .

Объекты могут быть сериализованы в двоичном формате для десериализации другими приложениями .NET. Инфраструктура также предоставляет объекты SoapFormatter и XmlSerializer для поддержки сериализации в читаемом человеком кроссплатформенном XML.

- Википедия: Сериализация, .NET Framework

3 голосов
/ 17 февраля 2010

Если вы сделаете каждый из ваших «состояний» классов Serializable, то вы можете буквально сериализовать объекты в файл. Затем вы можете снова загрузить их все из этого файла, когда вам нужно будет продолжить.

См. ISerializable

0 голосов
/ 17 февраля 2010

Я согласен с другими авторами в том, что сделать классы состояний игры Serializable - это, вероятно, то, что вам нужно Другие охватили базовую сериализацию; для альтернативы высокого уровня вы можете посмотреть в NHibernate, который будет сохранять объекты в базе данных. Вы можете найти полезную информацию о NHibernate по этим ссылкам: http://www.codeproject.com/KB/database/Nhibernate_Made_Simple.aspx

http://nhibernate.info/doc/burrow/faq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...