Спонсор: Microsoft
Опубликован: 10.04.2009 | Уровень: специалист | Доступ: платный
Самостоятельная работа 10:

Работа с файлами, сериализация

Сериализация объектов: сохранение и загрузка игры

Сериализация объектов - это, другими словами – сохранение объекта в виде файла. Сериализованный объект можно восстановить в ходе операции десериализации. В случае с компьютерными играми сериализацию удобно использовать для сохранения игровой информации. Для того, чтобы эффективно использовать инструменты сериализации в играх, нужно заранее уяснить, какие именно объекты будут сериализованы. Желательно выделить для сериализации особые объекты, которые будут содержать лишь ту информацию, сохранение которой необходимо для успешного продолжения игрового процесса при десериализации соответствующего объекта, то есть – загрузке игры.

Игра, предусматривающая возможность сохранения игрового состояния, должна предусматривать как минимум два режима работы. Первый – когда игра начинается сначала – в таком случае поля класса, предназначенного для сериализации, заполняются некоторыми заранее заданными значениями. В ходе игры поля класса меняются, отражая изменения, произошедшие в ходе игрового процесса. Далее, после того, как объект сериализован, игра может либо начинаться сначала, либо – восстанавливать свое состояние на момент сериализации. Рассмотрим пример сохранения и восстановления состояния игры на примере проекта P10_2.

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

На рис. 14.2. вы можете видеть окно Project Explorer для проекта P10_2.

Окно Project Explorer для проекта P10_2

Рис. 14.2. Окно Project Explorer для проекта P10_2

Класс Game1 – это стандартный игровой класс.

GameDataкласс, содержащий игровые данные и предназначенный для сериализации.

gBaseClass, Wall – классы для визуализации игровых объектов.

В листинге 14.2. вы можете видеть код класса GameData.

using System;
using System.Collections.Generic;
using System.Text;

namespace P10_2
{
    //Атрибут, указывающий на то, что класс может быть сериализован
    [Serializable]
    class GameData
    {
        //Поле класса, которое содержит важные игровые данные
        public byte [,] array;
        //Конструктор класса
        public GameData (byte [,] arr)
        {
            array = new byte [8,10];
            array = arr;
        }
    }
}
Листинг 14.2. Код класса GameData

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

Рассмотрим классы gBaseClass и Wall (листинг 14.3., 14.4.) Эти классы мы уже использовали в проекте P5_1. Класс gBaseClass содержит механизмы для рисования компонента и расположения его на экране, а класс Wallпотомок класса gBaseClass – используется для управления поведением объекта.

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
using Microsoft.Xna.Framework.Content;

namespace P10_2
{
    public class gBaseClass : Microsoft.Xna.Framework.DrawableGameComponent
    {
        Texture2D sprTexture;
        public Vector2 sprPosition;
        public Rectangle sprRectangle;
        public gBaseClass(Game game, ref Texture2D _sprTexture,
            Vector2 _sprPosition, Rectangle _sprRectangle)
            : base(game)
        {
            sprTexture = _sprTexture;
            //Именно здесь производится перевод индекса элемента массива
            //в координаты на игровом экране
            sprPosition = _sprPosition * 64;
            sprRectangle = _sprRectangle;
        }

        public override void Initialize()
        {
            base.Initialize();
        }

        
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
        }
        public override void Draw(GameTime gameTime)
        {
            SpriteBatch sprBatch =
                (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));
            sprBatch.Draw(sprTexture, sprPosition, Color.White);
            base.Draw(gameTime);
        }
    }
}
Листинг 14.3. Код класса gBaseClass
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
using Microsoft.Xna.Framework.Content;

namespace P10_2
{
    /// <summary>
    /// This is a game component that implements IUpdateable.
    /// </summary>
    public class Wall : gBaseClass
    {
        public Wall(Game game, ref Texture2D _sprTexture,
            Vector2 _sprPosition, Rectangle _sprRectangle)
            : base(game, ref _sprTexture, _sprPosition, _sprRectangle)
        {
            
        }
    }
}
Листинг 14.4. Код класса Wall
Alina Lasskaja
Alina Lasskaja

Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить.....

Дмитрий Кацман
Дмитрий Кацман
Израиль
Андрей Веденин
Андрей Веденин
Россия, Белгород