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

Создание плавных, повторяющихся анимаций — основа динамичного геймплея. Phaser 3 предоставляет мощную систему твинов, которая позволяет анимировать свойства объектов с минимальным кодом. В этой статье мы разберем, как использовать относительные значения и параметры повторения для создания компактных и эффективных циклов анимации, например, для прыжка персонажа или покачивания предмета. Это полезно для экономии времени и написания чистого, поддерживаемого кода.

Версия 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.image('block', 'assets/sprites/block.png');
    }

    create()
    {
        var image = this.add.image(400, 500, 'block');

        var tween = this.tweens.add({
            targets: image,
            y: '-=64',
            ease: 'Sine.easeInOut',
            yoyo: true,
            repeat: 6
        });

        console.log(tween);

    }
}

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#2d2d2d',
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Настройка сцены и загрузка спрайта

Вся логика примера содержится в классе сцены, унаследованном от Phaser.Scene. В методе preload мы указываем базовый URL для загрузки ассетов и загружаем одно изображение — спрайт с именем 'block'. Этот спрайт будет нашим целевым объектом для анимации.

preload()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('block', 'assets/sprites/block.png');
}

После загрузки, в методе create, мы создаем экземпляр этого изображения на сцене, помещая его в точку с координатами (400, 500).

Создание и конфигурация твина

Ключевая часть примера — создание твина. Мы вызываем метод this.tweens.add(), передавая ему объект конфигурации. Основные параметры: * targets: объект или массив объектов для анимации (наш спрайт image). * y: '-=64': Это относительное значение. Оно указывает, что свойство `y` (вертикальная позиция) цели должно уменьшиться на 64 пикселя от своего текущего значения. Это гораздо удобнее, чем вычислять и указывать абсолютные координаты. * ease: Функция плавности 'Sine.easeInOut' задает ускорение и замедление в начале и конце каждого шага анимации, делая движение более естественным.

var tween = this.tweens.add({
    targets: image,
    y: '-=64',
    ease: 'Sine.easeInOut',
    yoyo: true,
    repeat: 6
});

Повторение и режим Yoyo

Параметры repeat и yoyo работают в связке, создавая сложную циклическую анимацию из одной простой инструкции. * yoyo: true: Включает обратное проигрывание анимации. После того как спрайт достигнет конечной точки (y -= 64), он начнет двигаться обратно к стартовой позиции. * repeat: 6: Определяет, сколько раз должен повториться полный цикл анимации. Важно понимать, что один цикл — это движение «туда» (заданное y: '-=64') и, если yoyo активен, обратно. Таким образом, спрайт совершит 6 полных движений «вверх-вниз».

Созданный объект твина сохраняется в переменную tween и выводится в консоль для отладки. Через этот объект можно позднее управлять анимацией (пауза, возобновление, остановка).

Инициализация игры

Код завершается созданием конфигурационного объекта игры и экземпляра Phaser.Game. Конфигурация определяет основные параметры, такие как размер холста, цвет фона и корневой класс сцены, который будет запущен автоматически.

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#2d2d2d',
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Что попробовать дальше

Использование относительных значений ('-=64') в сочетании с yoyo и repeat — это мощный и лаконичный способ создания циклических анимаций в Phaser 3. Для экспериментов попробуйте изменить функцию плавности (ease) на 'Bounce.easeOut' для прыгающего эффекта, анимируйте другие свойства, например `xилиangle, или начните твин не сразу, установив параметрdelay. Также вы можете добавить обработчик событияonComplete` для выполнения кода после окончания всех повторений.