О чем этот пример
Анимация — это сердце визуальной динамики игры. Phaser предоставляет мощный инструмент `yoyo`, который позволяет создавать более плавные и живые циклы анимации без дублирования кадров. Этот приём особенно полезен для дыхания персонажа, пульсирующих эффектов или возвратных движений. В этой статье мы разберём, как создать анимацию с эффектом йо-йо и как переключать этот параметр во время выполнения игры, что открывает возможности для интерактивной отладки или динамического изменения поведения анимаций.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
constructor ()
{
super();
}
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.atlas('ryu', 'assets/animations/sf2ryu.png', 'assets/animations/sf2ryu.json');
this.load.image('sea', 'assets/skies/sf2boat.png');
this.load.image('ground', 'assets/skies/sf2floor.png');
}
create ()
{
this.add.image(100, 130, 'sea').setScale(3);
this.add.image(400, 500, 'ground').setScale(3);
var info = [ 'Click to toggle Animation.yoyo', 'yoyo: true' ];
var text = this.add.text(400, 32, info, { color: '#113355', align: 'center' }).setOrigin(0.5, 0);
this.anims.create({
key: 'hadoken',
frames: this.anims.generateFrameNames('ryu', { prefix: 'frame_', end: 15, zeroPad: 2 }),
yoyo: true,
repeat: -1
});
var ryu = this.add.sprite(400, 350).play('hadoken').setScale(3);
this.input.on('pointerup', function () {
// Toggle 'yoyo' at runtime
ryu.anims.yoyo = !ryu.anims.yoyo;
info[1] = 'yoyo: ' + ryu.anims.yoyo;
text.setText(info);
});
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
pixelArt: true,
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Что такое эффект йо-йо?
Свойство yoyo объекта анимации в Phaser заставляет её проигрываться в обратном порядке после завершения прямого проигрывания. Вместо резкого скачка с последнего кадра к первому, анимация плавно возвращается назад, создавая непрерывный цикл.
В примере это используется для анимации движения руки персонажа Рю. Без yoyo: true анимация "хадокен" резко перескакивала бы с кадра 15 на кадр 0. С включённым эффектом она проигрывает кадры от 0 до 15, а затем от 15 до 0, что выглядит гораздо естественнее для циклического действия.
yoyo: true,
repeat: -1
Создание анимации с атласа
Перед использованием анимации необходимо загрузить её ресурсы. В методе preload загружается атлас с кадрами и фоновые изображения.
Ключевой момент — использование атласа (spritesheet + JSON data). Метод this.anims.generateFrameNames автоматически извлекает имена кадров из JSON-файла атласа, что удобно для сложных анимаций.
this.load.atlas('ryu', 'assets/animations/sf2ryu.png', 'assets/animations/sf2ryu.json');
this.anims.create({
key: 'hadoken',
frames: this.anims.generateFrameNames('ryu', { prefix: 'frame_', end: 15, zeroPad: 2 }),
yoyo: true,
repeat: -1
});
Параметр zeroPad: 2 указывает, что имена кадров в атласе имеют двузначную нумерацию (например, frame_00, frame_01). repeat: -1 задаёт бесконечное повторение анимации.
Воспроизведение анимации на спрайте
После создания анимации её можно назначить любому спрайту в сцене. В примере создаётся спрайт и сразу запускается анимация методом .play().
Масштаб спрайта увеличен в три раза командой .setScale(3), чтобы персонаж лучше смотрелся на фоне.
var ryu = this.add.sprite(400, 350).play('hadoken').setScale(3);
Спрайт автоматически унаследует все свойства созданной анимации, включая yoyo и repeat.
Динамическое переключение свойства yoyo
Одна из сильных сторон Phaser — возможность изменять параметры анимации во время выполнения игры. В примере по клику мыши переключается значение yoyo у текущей анимации спрайта.
Это делается через обращение к менеджеру анимаций спрайта: ryu.anims.yoyo. Мы изменяем его на противоположное значение и обновляем информационный текст.
this.input.on('pointerup', function () {
// Toggle 'yoyo' at runtime
ryu.anims.yoyo = !ryu.anims.yoyo;
info[1] = 'yoyo: ' + ryu.anims.yoyo;
text.setText(info);
});
Такой приём полезен не только для отладки, но и для игровой логики, например, чтобы изменить характер анимации персонажа при получении усиления.
Что попробовать дальше
Эффект йо-йо — простой, но мощный инструмент для создания плавных и привлекательных циклических анимаций. Его динамическое управление открывает двери для интерактивной настройки и сложной игровой механики.
Поэкспериментируйте: попробуйте связать переключение yoyo с игровыми событиями (например, скорость персонажа), комбинируйте его с изменением repeatDelay для создания пауз или примените к частицам для пульсирующих эффектов.
