В PixiJS библиотека Assets обеспечивает удобный и
современный способ управления ресурсами, включая изображения, аудио и
спрайт-листы. Использование спрайт-листов через Assets
позволяет загружать наборы текстур сразу, оптимизировать память и
ускорять рендеринг.
Для работы с Assets необходимо подключить модуль из
pixi.js:
import { Application, Assets, Sprite, Texture } from 'pixi.js';
const app = new Application({
width: 800,
height: 600,
backgroundColor: 0x1099bb
});
document.body.appendChild(app.view);
Модуль Assets доступен напрямую и позволяет использовать
методы загрузки, такие как Assets.load и
Assets.addBundle.
Спрайт-лист в PixiJS представляет собой JSON-файл, описывающий координаты и размеры каждого фрейма внутри текстуры. Пример структуры JSON:
{
"frames": {
"walk_0": { "frame": {"x":0,"y":0,"w":64,"h":64} },
"walk_1": { "frame": {"x":64,"y":0,"w":64,"h":64} }
},
"meta": {
"image": "character.png",
"size": {"w":128,"h":64}
}
}
Ключ frames содержит набор отдельных кадров, а
meta.image указывает на файл текстуры.
Для загрузки спрайт-листа используется метод
Assets.load. Если JSON описывает несколько кадров, PixiJS
автоматически создаёт объект Textures для каждого
фрейма:
const spriteSheetUrl = 'assets/character.json';
Assets.load(spriteSheetUrl).then((sheet) => {
const texture = sheet.textures['walk_0'];
const sprite = new Sprite(texture);
sprite.x = 100;
sprite.y = 100;
app.stage.addChild(sprite);
});
Особенности:
sheet.textures — объект, где ключи совпадают с
названиями фреймов в JSON.sheet.textures['имя_кадра'].meta.image.Для управления множеством ресурсов эффективнее использовать бандлы:
Assets.addBundle('characters', {
hero: 'assets/hero.json',
enemy: 'assets/enemy.json'
});
Assets.loadBundle('characters').then((bundle) => {
const heroSprite = new Sprite(bundle.hero.textures['walk_0']);
heroSprite.x = 50;
heroSprite.y = 50;
app.stage.addChild(heroSprite);
const enemySprite = new Sprite(bundle.enemy.textures['idle_0']);
enemySprite.x = 300;
enemySprite.y = 50;
app.stage.addChild(enemySprite);
});
Преимущества использования бандлов:
PixiJS поддерживает создание анимаций с помощью класса
AnimatedSprite:
import { AnimatedSprite } from 'pixi.js';
Assets.load('assets/character.json').then((sheet) => {
const frames = Object.keys(sheet.textures)
.filter(name => name.startsWith('walk_'))
.map(name => sheet.textures[name]);
const walkAnimation = new AnimatedSprite(frames);
walkAnimation.animationSpeed = 0.15;
walkAnimation.play();
walkAnimation.x = 200;
walkAnimation.y = 200;
app.stage.addChild(walkAnimation);
});
Ключевые моменты:
Object.keys(sheet.textures) позволяет получить все
кадры.play() запускает анимацию автоматически.Assets кэширует все загруженные ресурсы, что исключает
повторные загрузки:
async function loadHero() {
const sheet = await Assets.load('assets/hero.json');
return sheet.textures['idle_0'];
}
// Позже можно использовать тот же ресурс без повторной загрузки
const idleTexture = await loadHero();
const sprite = new Sprite(idleTexture);
app.stage.addChild(sprite);
Особенности кэширования:
Assets.load для того же URL возвращает
уже загруженный ресурс.Assets.remove(key) при
необходимости освобождения памяти.Для оптимизации можно использовать форматы, поддерживающие сжатие текстур:
Assets.load('assets/character.json', {
crossOrigin: 'anonymous',
loadOptions: {
imageType: 'webp'
}
});
Опции позволяют:
Assets поддерживает динамическую загрузку ресурсов в
процессе работы приложения:
async function loadDynamicSprite(name) {
const sheet = await Assets.load(`assets/${name}.json`);
return new Sprite(sheet.textures['idle_0']);
}
const enemySprite = await loadDynamicSprite('enemy');
enemySprite.x = 400;
enemySprite.y = 100;
app.stage.addChild(enemySprite);
Такой подход позволяет подгружать только необходимые спрайт-листы, экономя память и ускоряя запуск приложения.
AnimatedSprite для воспроизведения анимаций
без ручного управления кадрами.Assets для оптимизации
повторного использования.Эти приёмы обеспечивают быстрый старт и стабильную работу графики в PixiJS при использовании спрайт-листов.