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

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

Версия 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 image1 = this.add.image(130, 50, 'block');
        var image2 = this.add.image(190, 80, 'block');
        var image3 = this.add.image(50, 150, 'block');

        this.tweens.add({
            targets: [image1, image2, image3],
            props: {
                x: { value: '+=600', duration: 3000, ease: 'Power2' },
                y: { value: '500', duration: 1500, ease: 'Bounce.easeOut' }
            },
            delay: 1000
        });

    }
}

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

const game = new Phaser.Game(config);

Подготовка сцены и загрузка ассетов

В методе preload мы загружаем текстуру спрайта. Для этого используется метод this.load.image(), где первый аргумент — ключ ассета, а второй — путь к файлу.

this.load.image('block', 'assets/sprites/block.png');

В методе create создаются три игровых спрайта с помощью this.add.image(). Метод принимает координаты X, Y и ключ загруженного изображения. Эти спрайты станут целями для нашей анимации.

var image1 = this.add.image(130, 50, 'block');
var image2 = this.add.image(190, 80, 'block');
var image3 = this.add.image(50, 150, 'block');

Создание группового твина

Основная логика анимации сосредоточена в вызове this.tweens.add(). Конфигурационный объект твина содержит несколько важных полей.

Поле targets принимает массив объектов, которые будут анимированы. В нашем случае это три созданных спрайта.

targets: [image1, image2, image3],

Поле props определяет свойства, которые будут изменяться. Это объект, где ключами являются имена свойств (например, `xиy`), а значениями — конфигурации для их анимации.

props: {
    x: { value: '+=600', duration: 3000, ease: 'Power2' },
    y: { value: '500', duration: 1500, ease: 'Bounce.easeOut' }
},

Для свойства `xзадано относительное значение'+=600', что означает увеличение текущей координаты X на 600 пикселей. Анимация займет 3000 миллисекунд и будет использовать функцию плавности'Power2'`. Для свойства `yзадано абсолютное значение'500'— спрайты переместятся в Y-координату 500. Эта анимация короче (1500 мс) и использует эффект отскока'Bounce.easeOut'`.

Поле delay устанавливает задержку в 1000 миллисекунд перед стартом всей анимации.

delay: 1000

Полный код создания твина

Соберем весь код создания твина в один блок. Это наглядный пример конфигурации, которую передают в систему анимаций Phaser.

this.tweens.add({
    targets: [image1, image2, image3],
    props: {
        x: { value: '+=600', duration: 3000, ease: 'Power2' },
        y: { value: '500', duration: 1500, ease: 'Bounce.easeOut' }
    },
    delay: 1000
});

Конфигурация игры

Запуск игры происходит после определения ее конфигурации. В объекте config задаются базовые параметры: тип рендерера, размеры холста, цвет фона и класс основной сцены.

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

const game = new Phaser.Game(config);

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

Система твинов Phaser предоставляет мощный и лаконичный API для создания сложных анимаций. Показанный подход с массивом targets и объектом props позволяет централизованно управлять анимацией группы объектов. **Идеи для экспериментов:** 1. Попробуйте задать разные значения delay для каждого свойства в объекте props. 2. Добавьте анимацию других свойств, например alpha (прозрачность) или scaleX/scaleY (масштаб). 3. Используйте callback-функции onComplete внутри конфигурации свойства, чтобы запускать цепочки действий после завершения отдельных анимаций.