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

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

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('raster', 'assets/demoscene/raster-bw-800x16.png');
    }

    create ()
    {
        const group = this.add.group();

        group.createMultiple({ key: 'raster', repeat: 64 });

        const hsv = Phaser.Display.Color.HSVColorWheel();

        let i = 0;

        const _this = this;

        group.children.forEach(child =>
        {

            child.x = 400;
            child.y = 100;
            child.depth = 64 - i;

            child.setTint(hsv[i * 4].color);

            i++;

            _this.tweens.add({
                targets: child,
                props: {
                    y: { value: 500, duration: 1500 },
                    scaleX: { value: child.depth / 64, duration: 6000, hold: 2000, delay: 2000 }
                },
                yoyo: true,
                repeat: -1,
                ease: 'Sine.easeInOut',
                delay: 32 * i
            });

        });
    }
}

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

const game = new Phaser.Game(config);

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

В методе preload загружается одно растровое изображение, которое будет использовано для создания множества спрайтов. Ключевой элемент здесь — this.add.group(). Группа в Phaser — это контейнер, упрощающий управление множеством однотипных игровых объектов.

const group = this.add.group();
group.createMultiple({ key: 'raster', repeat: 64 });

Метод createMultiple создаёт 65 спрайтов (1 оригинал + 64 повторения), используя загруженное изображение 'raster'. Все они автоматически добавляются в группу group.

Настройка позиций и цвета

Далее в цикле forEach происходит начальная настройка каждого созданного спрайта (child). Все спрайты выстраиваются в одну вертикальную линию по X=400 и Y=100.

child.x = 400;
child.y = 100;
child.depth = 64 - i;
child.setTint(hsv[i * 4].color);

Свойство depth определяет порядок отрисовки. Спрайту с большим значением depth присваивается меньший порядковый номер `i, что помещает его "ближе" к камере. Цвет задаётся черезsetTint, используя предсгенерированную палитруHSVColorWheel`. Цвет берётся из палитры с шагом в 4, чтобы пройти весь спектр на всех спрайтах.

Создание цепочки анимаций

Сердце эффекта — это система твинов. Для каждого спрайта создаётся комплексная анимация с помощью this.tweens.add.

_this.tweens.add({
    targets: child,
    props: {
        y: { value: 500, duration: 1500 },
        scaleX: { value: child.depth / 64, duration: 6000, hold: 2000, delay: 2000 }
    },
    yoyo: true,
    repeat: -1,
    ease: 'Sine.easeInOut',
    delay: 32 * i
});

Анимация управляет двумя свойствами (props): координатой `yи масштабом по оси XscaleX. Криваяease: 'Sine.easeInOut'обеспечивает плавное ускорение и замедление. Параметрdelay: 32 * iсоздаёт последовательный запуск анимации для каждого следующего спрайта, формируя волну. Флагиyoyoиrepeat: -1` заставляют анимацию колебаться и повторяться бесконечно.

Работа с цветовой палитрой HSV

Phaser предоставляет удобный инструмент для генерации цветовых градиентов.

const hsv = Phaser.Display.Color.HSVColorWheel();

Вызов HSVColorWheel() возвращает массив из 360 объектов (по градусу на цветовом круге). Каждый объект содержит представление цвета в форматах HSV и RGB. В примере это используется для создания плавного цветового перехода через все спрайты, что усиливает волновой эффект.

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

Пример показывает, как комбинация групп, палитр и цепочек твинов позволяет создавать сложную анимацию из простых компонентов. Для экспериментов попробуйте изменить функцию ease, поиграть со значениями delay и duration для изменения ритма волны, или заменить scaleX на angle для создания спирального эффекта. Также можно динамически менять палитру hsv в ходе анимации.