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

Создание статичных частиц — это лишь первый шаг. Настоящая магия начинается, когда вы оживляете систему частиц, динамически меняя её параметры. В этой статье мы разберём, как использовать твины 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('bg', 'assets/tweens/sky.png');
        this.load.atlas('match3', 'assets/atlas/match3.png', 'assets/atlas/match3.json');
    }

    create ()
    {
        this.add.image(400, 300, 'bg');

        const emitter = this.add.particles(400, 300, 'match3', {
            frame: 'Match3_Icon_32',
            speed: 20,
            lifespan: 2000,
            scale: 0.3
        });

        this.tweens.add({
            targets: emitter,
            speed: 200,
            duration: 2000,
            yoyo: true,
            repeat: -1
        });
    }
}

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

const game = new Phaser.Game(config);

Основа сцены: загрузка и фон

В методе preload мы загружаем два ресурса: фоновое изображение и атлас спрайтов. Атлас match3 содержит кадры для частиц.

this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('bg', 'assets/tweens/sky.png');
this.load.atlas('match3', 'assets/atlas/match3.png', 'assets/atlas/match3.json');

В create первым делом добавляется фоновое изображение. Это создаёт визуальный контекст для эффекта частиц.

Создание эмиттера частиц

Эмиттер — это фабрика, создающая и управляющая частицами. Мы создаём его с помощью this.add.particles. Ключевые параметры инициализации: - Позиция (400, 300) — точка испускания. - frame — конкретный кадр из атласа, который будет использовать каждая частица. - speed — начальная скорость разлёта (20 пикселей в секунду). - lifespan — время жизни частицы в миллисекундах (2000 мс = 2 секунды). - scale — масштаб спрайта частицы.

const emitter = this.add.particles(400, 300, 'match3', {
    frame: 'Match3_Icon_32',
    speed: 20,
    lifespan: 2000,
    scale: 0.3
});

На этом этапе эмиттер создаёт частицы, которые разлетаются с постоянной, довольно низкой скоростью.

Анимация скорости с помощью твина

Чтобы оживить эффект, мы применяем твин к самому объекту emitter. Твин — это инструмент для плавной интерполяции свойств объекта с течением времени.

Конфигурация твина: - targets — объект, свойства которого будут меняться (наш эмиттер). - speed: 200 — целевое значение скорости. Твин будет плавно менять текущее значение speed эмиттера от 20 до 200. - duration — длительность одного цикла анимации (2000 мс). - yoyo: true — после достижения цели значение будет возвращаться к исходному (от 200 обратно к 20). - repeat: -1 — анимация будет повторяться бесконечно.

this.tweens.add({
    targets: emitter,
    speed: 200,
    duration: 2000,
    yoyo: true,
    repeat: -1
});

**Как это работает?** Твин не прерывает работу эмиттера. Частицы, которые уже выпущены, продолжают двигаться с той скоростью, которая была у эмиттера в момент их создания. А вот все *новые* частицы будут получать актуальное, анимированное значение скорости. Это создаёт плавную волну: в момент низкой скорости частицы вылетают медленно и образуют плотное скопление, а в момент пика скорости — разлетаются быстро и далеко.

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

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

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

const game = new Phaser.Game(config);

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

Сочетание системы частиц и твинов — мощный приём для создания сложных динамических эффектов с минимальными усилиями. Вы анимируете не каждую частицу по отдельности, а управляющие параметры всей системы. Для экспериментов попробуйте применить твин к другим свойствам эмиттера, например, к scale (для эффектов расширения/сжатия), angle (для вращения потока) или gravityY (чтобы заставить частицы циклически падать и взлетать).