Сериализация данных с помощью GameStateManagment на Windows phone - PullRequest
0 голосов
/ 24 июля 2011

Я пытаюсь сериализовать свои игровые данные. Если пользователь нажимает кнопку Windows, все должно быть сохранено. Я знаю, что мы должны переопределить событие OnExiting в игровом классе. но я использую Game State Management , я хочу сериализовать игровые данные в своем классе GamePlayScreen. Я переопределил методы Serialize и DeSerialize, но они не сработали.

ее мой код:

    public override void Serialize(Stream stream)
    {
        gameState.HumanPlayer = HumanPlayer;
        gameState.Player1 = AIPlayer1;
        gameState.Player2 = AIPlayer2;
        gameState.Player3 = AIPlayer3;
        XmlSerializer serializer = new XmlSerializer(typeof(GameState));
        serializer.Serialize(stream, gameState);
        base.Serialize(stream);
    }

    public override void Deserialize(Stream stream)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(GameState));
        gameState = (GameState)serializer.Deserialize(stream);

        if (gameState.HumanPlayer != null)
            HumanPlayer = gameState.HumanPlayer;
        if (gameState.Player1 != null)
            AIPlayer1 = gameState.Player1;
        if (gameState.Player2 != null)
            AIPlayer2 = gameState.Player2;
        if (gameState.Player3 != null)
            AIPlayer3 = gameState.Player3;

        base.Deserialize(stream);
    }

Я пытался создать свой собственный IsolatedStorageFile вместо предоставленного объекта потока, но это не сработало.

Я пытался написать тот же код в событии Load and Unload. там все работает нормально, но в случае нажатия кнопки назад. мне нужно сериализовать, если пользователь нажал кнопку Windows или кнопку поиска.

1 Ответ

1 голос
/ 25 июля 2011

Похоже, вам нужно обработать события OnDeactivated и OnActivated. Просто сделайте то же самое, что и в событии OnExiting и в конструкторе. Я бы подумал, что образец сделает это, так как правильная обработка надгробного камня / регидрата - такая большая вещь для WP7, однако, похоже, ею пренебрегли. Обратите внимание, что OnActivated НЕ вызывается при запуске приложения, а OnDeactivated НЕ вызывается, когда приложение закрывается вручную или закрывается с помощью кнопки «Назад».

Обратите внимание, что области Activated и Deactivated также доступны как события на PhonApplicationServices.Current, наряду с Launching и Closing, которые вызываются ТОЛЬКО в реальных ситуациях открытия и выхода.

EDIT Хорошо, я забираю это. OnDeactivated и OnActivated не требуются. Похоже, что OnExiting запускается как для сценариев деактивации, так и для выхода. Я скачал пример, который вы связали (XNA4 WP7, не версия Mango) и поместил этот код в GameplayScreen:

public override void Serialize(System.IO.Stream stream)
{
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(string));
    serializer.Serialize(stream, "Blah de blah blah");
    base.Serialize(stream);
}

public override void Deserialize(System.IO.Stream stream)
{
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(string));
    string testStr = (string)serializer.Deserialize(stream);

    base.Deserialize(stream);
}

Точка останова показывает, что метод Deserialize работает правильно, поэтому ваша проблема должна заключаться в том, как вы применяете свои загруженные данные, или, возможно, вы редактировали другой код, который их нарушил.

...