Давно была идея - сделать некоторый такой мастер файл ресурсов, эдакая коллекция экземпляров некоторого класса, который бы хранил в себе какой-то определенный игровой ресурс, его идентификатор и какую-нибудь еще полезную информацию. Но вся проблема была в том, что некоторые классы в XNA (в моем случае - Texture2D) не сериализуются. Что же делать? Ответ прост и весьма забавен.
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]);
Вот такие вот дела. До новых встреч!
Нашей коллекцией внутри класса, который мы будем сериализовать, будет коллекция MemoryStream
class ResourceClass
{
List<MemoryStream> resources;
}
Теперь попробуем поместить туда что нибудь. Будем делать по рабоче-крестьянски, просто и изящно:
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]);
Вот такие вот дела. До новых встреч!
Комментариев нет:
Отправить комментарий