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

Запуск анимации в Phaser — это проще, чем кажется, но настоящая магия начинается, когда вы хотите управлять её скоростью, задержками и другими параметрами прямо в момент воспроизведения. Метод `sprite.play()` принимает не только ключ анимации, но и конфигурационный объект, позволяя динамически переопределять свойства, заданные при создании анимации. Эта статья покажет, как гибко управлять анимациями, чтобы ваши игровые объекты двигались именно так, как вам нужно, прямо в коде их создания.

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

    create ()
    {
        //  Our global 'spin' animation
        this.anims.create({
            key: 'spin',
            frames: this.anims.generateFrameNames('cube', { prefix: 'frame', start: 1, end: 23 }),
            frameRate: 50,
            repeat: -1
        });

        const colors = [ 0xef658c, 0xff9a52, 0xffdf00, 0x31ef8c, 0x21dfff, 0x31aade, 0x5275de, 0x9c55ad, 0xbd208c ];

        const sprite1 = this.add.sprite(200, 300, 'cube').setTint(colors[0]);
        const sprite2 = this.add.sprite(400, 300, 'cube').setTint(colors[1]);
        const sprite3 = this.add.sprite(600, 300, 'cube').setTint(colors[2]);

        //  Play the 'spin' animation
        sprite1.play({ key: 'spin' });

        //  Play the animation and override the default frameRate with a new one
        sprite2.play({ key: 'spin', frameRate: 20 });

        //  Play the animation and set the repeatDelay to 250ms
        sprite3.play({ key: 'spin', repeatDelay: 250 });
    }
}

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

const game = new Phaser.Game(config);

Загрузка ресурсов и создание анимации

Перед использованием анимации её необходимо создать. В методе preload загружается атлас — изображение с несколькими кадрами и JSON-файл, описывающий их расположение.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.atlas('cube', 'assets/animations/cube.png', 'assets/animations/cube.json');
}

В методе create создаётся глобальная анимация 'spin'. Метод this.anims.generateFrameNames автоматически генерирует массив кадров из атласа по заданному шаблону имени. Параметры repeat: -1 и frameRate: 50 устанавливаются по умолчанию.

this.anims.create({
    key: 'spin',
    frames: this.anims.generateFrameNames('cube', { prefix: 'frame', start: 1, end: 23 }),
    frameRate: 50,
    repeat: -1
});

Базовый запуск анимации

Самый простой способ запустить анимацию на спрайте — передать методу play() её ключ. В этом случае будут использованы все параметры, заданные при создании анимации 'spin' через this.anims.create().

const sprite1 = this.add.sprite(200, 300, 'cube').setTint(colors[0]);
sprite1.play({ key: 'spin' });

Обратите внимание, что play() ожидает объект конфигурации, даже если в нём только один параметр key. Это единообразный подход для всех вариантов вызова.

Переопределение скорости воспроизведения

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

const sprite2 = this.add.sprite(400, 300, 'cube').setTint(colors[1]);
sprite2.play({ key: 'spin', frameRate: 20 });

Здесь анимация 'spin' для sprite2 будет проигрываться со скоростью 20 кадров в секунду, вместо 50, заданных при её создании. Это не изменяет исходную анимацию, а лишь создаёт её локальную вариацию для конкретного спрайта.

Управление паузами между повторами

Ещё один мощный параметр — repeatDelay. Он устанавливает задержку в миллисекундах между завершением одного цикла анимации и началом следующего. Это полезно для создания эффекта "мерцания", "подёргивания" или любой другой прерывистой анимации.

const sprite3 = this.add.sprite(600, 300, 'cube').setTint(colors[2]);
sprite3.play({ key: 'spin', repeatDelay: 250 });

Теперь куб будет вращаться, затем делать паузу в четверть секунды, и только потом запускать вращение снова. Это добавляет анимации характер и делает её менее механической.

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

Метод sprite.play() в Phaser — это ваш инструмент для динамического контроля анимаций. Вы можете не только запускать их, но и тонко настраивать под конкретные нужды сцены или объекта. Для экспериментов попробуйте комбинировать параметры: например, установите одновременно низкий frameRate и большой repeatDelay для создания вялого, прерывистого движения. Или используйте delay, чтобы запустить анимацию не сразу, а через заданное время. Изучите другие параметры конфига в документации, такие как timeScale или showOnStart, чтобы расширить свои возможности.