В библиотеке Phaser атлас (Texture Atlas) представляет собой набор изображений, объединённых в один большой файл, который оптимизирует загрузку и рендеринг графики. Каждый элемент атласа называется фреймом и может использоваться как отдельный спрайт или часть анимации.
Атлас загружается через метод this.load.atlas в сцене.
Синтаксис:
this.load.atlas(
'atlasKey', // ключ для доступа к атласу
'assets/atlas.png', // путь к изображению атласа
'assets/atlas.json' // путь к JSON с координатами фреймов
);
JSON-файл может быть в формате JSON Hash или JSON Array, где для каждого фрейма указаны координаты в текстуре, ширина и высота.
После загрузки атласа доступ к фреймам возможен через ключ атласа и имя фрейма:
const sprite = this.add.sprite(100, 100, 'atlasKey', 'frameName');
'atlasKey' — ключ атласа, указанный при загрузке.'frameName' — имя фрейма, как указано в JSON.Можно получить список всех фреймов атласа через:
const frames = this.textures.get('atlasKey').getFrameNames();
Это удобно для динамического создания спрайтов или анимаций.
Фреймы атласа часто используют для создания
анимаций. Создание анимации происходит через
this.anims.create:
this.anims.create({
key: 'walk',
frames: this.anims.generateFrameNames('atlasKey', {
prefix: 'walk_',
start: 1,
end: 6,
zeroPad: 2
}),
frameRate: 10,
repeat: -1
});
prefix — общий префикс имен фреймов.start и end — диапазон номеров
фреймов.zeroPad — количество нулей в номере фрейма (например,
walk_01).frameRate — количество кадров в секунду.repeat: -1 — зацикливание анимации.Применение анимации к спрайту:
sprite.play('walk');
Фреймы можно менять на лету, что полезно для состояния персонажей или эффекта удара:
sprite.setFrame('frameName');
Также допустимо передавать массив фреймов для последовательного отображения:
sprite.anims.loadFrame('frame1');
sprite.anims.loadFrame('frame2');
Phaser позволяет получать доступ к информации о каждом фрейме:
const frame = this.textures.get('atlasKey').get('frameName');
console.log(frame.width, frame.height, frame.cutWidth, frame.cutHeight);
frame.width и frame.height — размеры
исходного изображения.frame.cutWidth и frame.cutHeight — размеры
фрейма внутри атласа.frame.customPivot — точка привязки спрайта (при
необходимости изменить).Использование атласов вместо отдельных изображений снижает количество загрузок и ускоряет рендеринг. Рекомендуется:
generateFrameNames для
автоматической генерации последовательностей.const button = this.add.sprite(200, 300, 'uiAtlas', 'button_idle');
button.setInteractive();
button.on('pointerover', () => button.setFrame('button_hover'));
button.on('pointerout', () => button.setFrame('button_idle'));
button.on('pointerdown', () => button.setFrame('button_pressed'));
const directions = ['up', 'down', 'left', 'right'];
directions.forEach(dir => {
this.anims.create({
key: `walk_${dir}`,
frames: this.anims.generateFrameNames('playerAtlas', { prefix: `${dir}_`, start: 1, end: 4 }),
frameRate: 8,
repeat: -1
});
});
const frames = this.textures.get('particlesAtlas').getFrameNames();
const particle = this.add.sprite(400, 300, 'particlesAtlas', Phaser.Utils.Array.GetRandom(frames));
Эти методы позволяют эффективно управлять графикой и анимациями, минимизируя нагрузку на движок и обеспечивая плавность игры.
Работа с фреймами внутри атласа формирует основу для всех визуальных эффектов и анимаций в Phaser, от простых интерфейсных элементов до сложных игровых сцен.