resources2_ru - oxygine/oxygine-framework GitHub Wiki
Все ресурсы, которые вы собираетесь использовать в приложении желательно заранее описывать в специальном xml файле.
Вы можете создать 1 большой xml файл на все приложение или разделить ваши ресурсы логически по нескольким меньшим файлам.
Resources.xml из примера HelloWorld:
<?xml version="1.0"?>
<resources>
<set path = "images" />
<atlas>
<image file="anim.png" cols = "7" />
<image file="button.png"/>
</atlas>
<set path = "fonts" />
<font file="main.fnt" />
</resources>
В данном файле описано 3 ресурса доступные по id: anim, button и main.
Пример загрузки resources.xml и создание спрайта с изображением "button":
Resources menu;
void initMenu()
{
menu.loadXML("resources.xml");
ResAnim *resButton = menu.getResAnim("button");
spSprite close = new Sprite;
close->setResAnim(resClose);
}
В один instance Resources может быть загружено несколько разных xml одновременно, при условии что их id не пересекаются:
Resources game;
game.loadXML("monsters.xml");
game.loadXML("icons.xml");
-
Обычно ID получается из удаления расширения и имени папки из имени файла.
-
ID не чувствителен к регистру
-
Можно указывать произвольный ID:
<image id="std_btn" file="button.png"/>
ID можно указывать для любого типа ресурса, а не только < image >.
Можно задавать путь к ресурсу разными способами:
-
указывать полный путь:
<image file="images/menu/button.png"/>
-
использовать < set path />:
<set path = "images/menu" /> <image file="button.png"/> или <set path = "images" /> <image file="menu/button.png"/>
-
по умолчанию все пути указываются относительно рабочей директории приложения (в примерах это папка data)
-
чтобы указать путь относительно xml файла в котором они описаны нужно использовать префикс "./":
<image file="./button.png" /> или <set path = "./" /> <image file="button.png"/>
Основной тип ресурсов с которыми вы будете иметь дело в Oxygine - это изображения. Изображение описывается с тегом < image >. Картинка не может существовать сама по себе, потому ее обязательно нужно заключить внутрь < atlas >:
<atlas>
<image file="anim.png" />
<image file="button.png"/>
</atlas>
A texture atlas provides a way to improve the performance of your apps by combining all of the app’s image assets into one or more large images. This provides you with a way to improve the performance of your app by drawing multiple images with a single draw call.
Иногда для удобства в одном изображении можно хранить сразу несколько разных кадров, это может быть анимация или различные состояния объекта.
-
cols позволяет задать число столбцов в изображении
-
rows позволяет задать число строк в изображении
<image .... cols = "3" rows = "2" />
Например, данная картинка содержит в себе 4 столбца:
и должна быть описана таким образом:
<image file="flags.png" cols="4" />
Псевдокод ниже демонстрирует ее использование в игре:
enum state
{
state_new = 0,
state_fight = 1,
state_refresh = 2,
state_pvp = 3
}
state state = getLocationState();
int column = state;
spSprite locSprite = new Sprite;
locSprite->setResAnim(resources.getResAnim("flags"), column);
Как было уже написано выше все изображения обязательно должны быть заключены в < atlas >. Вы можете иметь много разных блоков < atlas > в одном xml файле.
По умолчанию текстура атласа генерируется при загрузке xml файла. В Oxygine входит утилита oxyresbuild для генерации атласов еще на этапе сборки приложения.
Для экономии видеопамяти можно указать особый формат пикселя для генерируемого атласа, например:
<atlas format="565">
Поддерживаемые форматы:
- 8888, 32 битный формат, который установлен по умолчанию
- 565, 16 битный формат без альфа канала, где R=5, G=6, B=5 bits
- 5551, 16 битный формат, с 1 битом на альфаканал, где R=5, G=5, B=5, A=1 bits
- 4444, 16 битный формат, по 4 бита на каждый канал, где R=4, G=4, B=4, A=4 bits
Ресурсы могут иметь произвольные свойства - атрибуты. Произвольные атрибуты могут иметь любое имя (за исключением зарезервированных).
Пример:
<image file="button.png" anim-delay = "800" offset-x = "200"/>
Доступ к атрибуту:
ResAnim *rs = resources.getResAnim("button");
int time = rs->getAttribute("anim-delay").as_int(0);
int offset = rs->getAttribute("offset-x").as_int(0);
You could set user data to any type of resource (not only image).
Oxygine supports atlas format exported for Starling/Sparrow framework.
Declare it in the resources xml:
<starling file="atlas.xml" />
Then use as usual resource:
ResAnim *rs = resources.getResAnim("image");