Возможно вы искали: 'Firestorm Thunderhawk 2'

May 31 2025 02:03:43
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96425698
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18407
• Обзор The Walking ... 18853
• Обзор DMC: Devil M... 19921
• Обзор на игру Valk... 15921
• Обзор на игру Stars! 17810
• Обзор на Far Cry 3 18000
• Обзор на Resident ... 16063
• Обзор на Chivalry:... 17561
• Обзор на игру Kerb... 18021
• Обзор игры 007: Fr... 16667
Превью о играх
• Превью к игре Comp... 18003
• Превью о игре Mage... 14502
• Превью Incredible ... 14763
• Превью Firefall 13523
• Превью Dead Space 3 16378
• Превью о игре SimC... 14772
• Превью к игре Fuse 15479
• Превью Red Orche... 15589
• Превью Gothic 3 16388
• Превью Black & W... 17402
Главная » Статьи » Всё о XNA » Динамическое обновление ассетов в XNA

Динамическое обновление ассетов в XNA

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

Первое, что мы сделаем это определим общую основу для всех ассетов, которые должны будут обновляться динамически. Все что нам нужно изначально, это путь к исходному файлу, где у нас располагается ассет и дата его создания. Создадим базовый абстрактный класс, с абстрактным методом Load, который и будет содержать свойства загружаемого файла:

public abstract class AutoReloadedAsset
{
	public string FilePath { get; private set; }
	public DateTime FileWriteDate { get; set; }
 
	protected AutoReloadedAsset(string file)
	{
		FilePath = file;
	}
 
	public abstract void Load(GraphicsDevice graphicsDevice);
}

 

Далее создадим Game Component , который будет отслеживать изменение фокуса главного игрового окна и при активации окна перезагружать обновившиеся файлы.

public class AutoReloadedAssetManager : DrawableGameComponent
{
	private readonly List<AutoReloadedAsset> assets =
		new List<AutoReloadedAsset>();
	private bool loaded;
	public ReadOnlyCollection<AutoReloadedAsset> Assets { get; private set; }
 
	public AutoReloadedAssetManager(Game game)
		: base(game)
	{
		Assets = new ReadOnlyCollection<AutoReloadedAsset>(assets);
 
		// используем событие Activated чтобы занть
		// когда пользователь вернулся в игру
		game.Activated += game_Activated;
	}
 
	public void AddAsset(AutoReloadedAsset asset)
	{
		if (assets.Contains(asset))
			return;
 
		assets.Add(asset);
 
		if (loaded)
		{
			asset.FileWriteDate = File.GetLastWriteTime(asset.FilePath);
			asset.Load(GraphicsDevice);
		}
	}
 
	public bool RemoveAsset(AutoReloadedAsset asset)
	{
		return assets.Remove(asset);
	}
 
	protected override void LoadContent()
	{
		foreach (var a in Assets)
		{
			a.FileWriteDate = File.GetLastWriteTime(a.FilePath);
			a.Load(GraphicsDevice);
		}
 
		loaded = true;
	}
 
	void game_Activated(object sender, EventArgs e)
	{
		foreach (var a in Assets)
		{
			DateTime fileWriteDate = File.GetLastWriteTime(a.FilePath);
			if (fileWriteDate.CompareTo(a.FileWriteDate) > 0)
			{
				a.FileWriteDate = fileWriteDate;
				a.Load(GraphicsDevice);
			}
		}
	}
}

 

Итак у нас есть приватный список для хранения актуальных ассетов, у пользователя есть два метода для добавления и удаления ассетов их списка. После добавления в список вызывается наш абстрактный метод Load который и выполняет основную работу по загрузке ассета.

Далее мы напишем врапер для Texture2D на основе нашего базового класса, основная задача которого, как раз загрузка текстуры с указанного имени файла.

public class AutoReloadedTexture2D : AutoReloadedAsset
{
public Texture2D Texture { get; private set; }
 
public AutoReloadedTexture2D(string file)
: base(file)
{
}
 
public override void Load(GraphicsDevice graphicsDevice)
{
	Console.WriteLine("Loading texture");
	Texture = Texture2D.FromFile(graphicsDevice, FilePath);
}
 
// определяем оператор явного преобразования типа, понадобится в дальнейшем
public static implicit operator Texture2D(AutoReloadedTexture2D tex)
{
	return tex.Texture;
}
}

 

Возможно оператор явного преобразования и не лучшее дизайнерское решение, но для понимания принципов работы вполне подходит.

Для тестирования создадим пустое изображение и тестовое приложение:

public class Game1 : Game
{
	SpriteBatch spriteBatch;
	AutoReloadedTexture2D texture;
 
	public Game1()
	{
		new GraphicsDeviceManager(this);
		Content.RootDirectory = "Content";
		IsMouseVisible = true;
	}
 
	protected override void Initialize()
	{
		var assetManager = new AutoReloadedAssetManager(this);
		Components.Add(assetManager);
		texture = new AutoReloadedTexture2D("test.png");
		assetManager.AddAsset(texture);
 
		base.Initialize();
	}
 
	protected override void LoadContent()
	{
		spriteBatch = new SpriteBatch(GraphicsDevice);
	}
 
	protected override void Draw(GameTime gameTime)
	{
		GraphicsDevice.Clear(Color.CornflowerBlue);
 
		spriteBatch.Begin();
		spriteBatch.Draw(texture, Vector2.Zero, Color.White);
		spriteBatch.End();
 
		base.Draw(gameTime);
	}
}

 

Для начала скомпилируйте приложение, чтобы студия создала папки, запустите любой графический редактор, вполне подойдет Paint.NET и создайте пустой графический файл. Сохраните файл под именем test.png в папке в которую у Вас прошла компиляция проекта, не закрывая графического редактора.

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


P.S. Данная функциональность была реализована в проекте XNA Content Engine (XCE) но работала на основе событий таймера.
660 Прочтений •  [Динамическое обновление ассетов в XNA] [08.08.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Динамическое обновление ассетов в XNA Ukraine Vova 08.08.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка