В игровых проектах на Phaser эффективное управление графическими ресурсами критически важно для производительности и удобства разработки. Текстурные атласы позволяют объединять множество спрайтов в одно изображение, сокращая количество обращений к видеопамяти и упрощая организацию ресурсов. Phaser поддерживает несколько форматов описания атласов, среди которых JSON Array, JSON Hash и XML. Каждый формат имеет свои особенности и области применения.
JSON Array — это формат, в котором информация о спрайтах хранится в виде массива объектов. Каждый объект описывает отдельный фрейм атласа.
Пример структуры JSON Array:
{
"frames": [
{
"filename": "hero_idle",
"frame": { "x": 0, "y": 0, "w": 64, "h": 64 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 64, "h": 64 },
"sourceSize": { "w": 64, "h": 64 }
},
{
"filename": "hero_run",
"frame": { "x": 64, "y": 0, "w": 64, "h": 64 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 64, "h": 64 },
"sourceSize": { "w": 64, "h": 64 }
}
]
}
Ключевые моменты JSON Array:
В Phaser загрузка JSON Array выполняется через
this.load.atlas():
this.load.atlas('hero', 'assets/hero.png', 'assets/hero.json');
Использование JSON Array удобно для проектов с регулярными фреймами одинакового размера или с последовательными анимациями.
JSON Hash отличается тем, что фреймы хранятся не в массиве, а в объекте, где ключи — это имена спрайтов, а значения — их параметры. Это ускоряет поиск конкретного фрейма по имени, особенно при большом количестве спрайтов.
Пример структуры JSON Hash:
{
"frames": {
"hero_idle": {
"frame": { "x": 0, "y": 0, "w": 64, "h": 64 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 64, "h": 64 },
"sourceSize": { "w": 64, "h": 64 }
},
"hero_run": {
"frame": { "x": 64, "y": 0, "w": 64, "h": 64 },
"rotated": false,
"trimmed": true,
"spriteSourceSize": { "x": 0, "y": 0, "w": 64, "h": 64 },
"sourceSize": { "w": 64, "h": 64 }
}
}
}
Особенности JSON Hash:
Загрузка аналогична JSON Array:
this.load.atlas('hero', 'assets/hero.png', 'assets/hero_hash.json');
JSON Hash особенно полезен для динамических игр с большим количеством спрайтов, где важна скорость обращения к данным.
Формат XML является старым, но все еще
поддерживаемым способом описания текстурных атласов. В XML каждая
текстура представлена отдельным элементом
<SubTexture> с атрибутами, определяющими координаты и
размеры.
Пример структуры XML:
<TextureAtlas imagePath="hero.png">
<SubTexture name="hero_idle" x="0" y="0" width="64" height="64"/>
<SubTexture name="hero_run" x="64" y="0" width="64" height="64"/>
</TextureAtlas>
Особенности XML:
imagePath указывает на файл атласа.<SubTexture> содержит атрибуты name,
x, y, width,
height.Загрузка XML в Phaser выполняется так:
this.load.atlasXML('hero', 'assets/hero.png', 'assets/hero.xml');
XML используется чаще для совместимости с инструментами, которые не экспортируют JSON, например, старые версии TexturePacker.
| Формат | Структура хранения | Преимущества | Недостатки |
|---|---|---|---|
| JSON Array | Массив объектов | Простота, удобен для последовательных фреймов | Поиск по имени медленнее |
| JSON Hash | Объект с ключами | Быстрый доступ к фрейму по имени | Меньшая совместимость со старыми инструментами |
| XML | Элементы <SubTexture> |
Широкая поддержка, совместимость с Legacy | Нет детальной информации о обрезке/повороте |
Выбор формата зависит от масштаба проекта, требуемой производительности и используемых инструментов для создания атласов. JSON Hash эффективен для динамических и больших игр, JSON Array — для простых последовательностей, XML — для интеграции со старыми редакторами или импортом из внешних ресурсов.
Создание анимации из атласа:
this.anims.create({
key: 'hero_run',
frames: this.anims.generateFrameNames('hero', {
prefix: 'hero_run',
start: 0,
end: 5,
zeroPad: 0
}),
frameRate: 10,
repeat: -1
});
this.add.sprite(100, 200, 'hero').play('hero_run');
Важно учитывать:
prefix должен совпадать с именем ключа
фрейма.Использование атласов сокращает количество draw calls, экономит память и повышает производительность, что особенно критично для мобильных игр и браузерных приложений.