пятница, 30 декабря 2011 г.

Мини-статья: Простое хранилище ресурсов.

Давно была идея - сделать некоторый такой мастер файл ресурсов, эдакая коллекция экземпляров некоторого класса, который бы хранил в себе какой-то определенный игровой ресурс, его идентификатор и какую-нибудь еще полезную информацию. Но вся проблема была в том, что некоторые классы в XNA (в моем случае - Texture2D) не сериализуются. Что же делать? Ответ прост и весьма забавен.
Нашей коллекцией внутри класса, который мы будем сериализовать, будет коллекция MemoryStream


class ResourceClass
{
    List<MemoryStream> resources;
}


Теперь попробуем поместить туда что нибудь. Будем делать по рабоче-крестьянски, просто и изящно:


Texture2D texture;
BinaryFormatter binFormater;

FileStream file = new FileStream(@"Texture\Grass1.png",FileMode.Open);
texture = Texture2D.FromStream(graphics.GraphicsDevice, file);

MemoryStream stream = new MemoryStream();
texture.SaveAsPng(stream, 256, 256);

Resource.resources.Add(stream);

FileStream fileStream = new FileStream("textures.resource", FileMode.Create);
binFormater.Serialize(fileStream, (object) Resource );
fileStream.Close();


Вот и все. Рядом с нашим приложением появится файлик textures.resource, который и будет нашим хранилищем. А как читать? Да проще простого - открываем файл в поток, десериализуем и записываем в обнуденный предварительно экземпляр(это не обязательно, просто, чтобы убедиться):

Resource = null;


fileStream = new FileStream("textures.resource", FileMode.Open);
Resource =  ( ResourceClass)binFormater.Deserialize(fileStream);

А как прочитать текстуру с какого то MemoryStream нашей коллекции - описано далее:

texture = Texture2D.FromStream(graphics.GraphicsDevice, Resource.resources[0]);

Вот такие вот дела. До новых встреч!

Комментариев нет:

Отправить комментарий