В PixiJS управление анимацией спрайтов реализуется
через AnimatedSprite, который позволяет
отображать последовательность текстур для создания эффекта движения.
Основная идея динамической смены набора кадров заключается в том, чтобы
менять текстуры спрайта на лету, без необходимости создавать новый
объект или полностью перезапускать анимацию.
Для начала создается массив текстур:
const texturesIdle = [
PIXI.Texture.from('idle1.png'),
PIXI.Texture.from('idle2.png'),
PIXI.Texture.from('idle3.png')
];
const texturesRun = [
PIXI.Texture.from('run1.png'),
PIXI.Texture.from('run2.png'),
PIXI.Texture.from('run3.png'),
PIXI.Texture.from('run4.png')
];
Затем на основе массива текстур создается объект
AnimatedSprite:
const sprite = new PIXI.AnimatedSprite(texturesIdle);
sprite.animationSpeed = 0.1;
sprite.play();
app.stage.addChild(sprite);
Ключевой момент: animationSpeed задает
скорость анимации, а метод play() запускает проигрывание
кадров.
Для динамической смены текстур используется свойство
textures. Если нужно переключить анимацию с состояния
«idle» на «run», это делается так:
sprite.textures = texturesRun;
sprite.gotoAndPlay(0);
Здесь gotoAndPlay(0) гарантирует, что анимация начнется
с первого кадра нового набора.
Свойство loop контролирует зацикливание анимации:
sprite.loop = true; // анимация будет повторяться бесконечно
sprite.loop = false; // анимация проиграется один раз
Смена скорости анимации возможна в любой момент:
sprite.animationSpeed = 0.2; // увеличиваем скорость
PixiJS позволяет отслеживать завершение анимации через событие
onComplete:
sprite.onCompl ete = () => {
sprite.textures = texturesIdle;
sprite.gotoAndPlay(0);
};
Такой подход удобен для перехода между разными состояниями персонажей, например, «атака → возвращение в idle».
Иногда набор кадров может загружаться асинхронно:
PIXI.Loader.shared.add('jump1.png').add('jump2.png').load((loader, resources) => {
const jumpTextures = [
resources['jump1.png'].texture,
resources['jump2.png'].texture
];
sprite.textures = jumpTextures;
sprite.gotoAndPlay(0);
});
Этот метод позволяет экономить память, загружая текстуры только по необходимости.
В PixiJS можно комбинировать несколько AnimatedSprite
для сложных эффектов, например, наложение оружия на персонажа или
эффекты частиц. В этом случае динамическая смена кадров у одного слоя не
влияет на другие:
const weaponSprite = new PIXI.AnimatedSprite(weaponTexturesIdle);
weaponSprite.animationSpeed = 0.15;
weaponSprite.play();
sprite.addChild(weaponSprite);
Динамическая смена текстур на weaponSprite
осуществляется по аналогичному принципу.
gotoAndPlay(0) после смены набора
кадров.animationSpeed и
loop.Такой подход обеспечивает гибкое управление анимацией, позволяет создавать сложные игровые сцены с разнообразными динамическими эффектами без перезагрузки или пересоздания объектов.