XNA – Используем атласы текстур

Сегодня я поделюсь с вами собственным классом, который хранит изображения в моих играх. Этот класс самостоятельно загружает текстуры при запуске игры (в обход Content Pipeline) и предоставляет возможность изменять их во время исполнения. Сегодня я также доработал его до такого состояния, что теперь можно абстрагироваться от необходимости работы текстурами внутри атласа.

Следующая структура хранит информацию о изображении:

Ничего необычного, кроме того, что данная структура может сама себя отрисовать через SpriteBatch с помощью метода Draw.

Дальше идет класс ImageManager в котором хранятся все изображения:

Изображения я храню в виде хеш-таблицы с доступом по названию текстуры.

Это конструктор, которых вылавливает все директории, которые находятся внутри Content/Images/ и вытаскивает из них все изображения. Если ваш проект настолько запутан сложен, что вы храните изображения в папках внутри папок, которые находятся внутри третьих папок, то добавляйте еще один цикл поиска директорий.

Это наш xml-файл, в котором хранится информация о каждой текстуре-атласе.

В этом блоке мы загружаем наши текстуры в заносим в string key имя текстуры в виде “folder/filename” лишая ее разрешения. По-этому имени можно будет обратиться к атласу-текстуре целиком.

В этом блоке, мы ищем информацию о более мелких текстурах, которые входят в наш атлас текстур. Если таковая находятся то каждая из мелких текстур заносится в хеш-таблицу.

В заключении, заносим в хеш-таблицу саму текстуру-атлас. Обращаю ваше внимание на то, что несмотря на то, что мы создаем структуру Image для каждой мелкой текстуры, входящей в состав атласа, сама текстура-атлас(Texture2D texture) хранится в памяти всего один раз, а доступ к ней предоставляется по ссылке.

XNA: Как нарисовать линию

Достаточно простой, но не очевидный, способ, как нарисовать линию с помощью Net XNA Framework. Для начала потребуется небольшая подготовка:

  • т.к. в XNA все выводимое на экран должно быть задано в виде 3D объекта, то для начала создаем текстуру “линии”:

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

  • теперь текстура готова и мы можем использовать ее для рисования линии следующим образом:
  • И в случае, если линию нужно развернуть:

NET XNA: увеличение производительности

Одна из основных проблем, с которыми сталкиваются разработчики игр – низкая производительность их творения. NET XNA не является исключением в этом вопросе, а скорее даже наоборот, т.к. за легкость разработки игры приходится жертвовать производительностью.

Если вы хотите получить в итоге хорошую игру, а не очередную поделку на коленях, то вам придется начать задумываться об оптимизации производительности XNA. В этой статье я поделюсь некоторыми не очевидными моментами, касающиеся разработки игр на NET XNA, которые мне удалось узнать. Если у вас есть что добавить – прошу вас сделать это в комментариях.

Read the rest of this entry »