О чем этот пример

Анимация — это сердце визуальной динамики игры. 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 для создания пауз или примените к частицам для пульсирующих эффектов.