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

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

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.atlas('flares', 'assets/particles/flares.png', 'assets/particles/flares.json');
    }

    create ()
    {
        const curve = new Phaser.Curves.Spline([ 50, 300, 164, 246, 274, 342, 412, 257, 522, 341, 664, 264 ]);

        const particles = this.add.particles('flares');

        //  Here is a RandomZone by way of comparison
        particles.createEmitter({
            y: -200,
            frame: { frames: [ 'red', 'green', 'blue' ], cycle: true },
            scale: { start: 0.5, end: 0 },
            blendMode: 'ADD',
            emitZone: { type: 'random', source: curve, quantity: 48 }
        });

        //  An EdgeZone without using yoyo
        particles.createEmitter({
            frame: { frames: [ 'red', 'green', 'blue' ], cycle: true },
            scale: { start: 0.5, end: 0 },
            blendMode: 'ADD',
            emitZone: { type: 'edge', source: curve, quantity: 48, yoyo: false }
        });

        //  An EdgeZone with yoyo
        particles.createEmitter({
            y: 200,
            frame: { frames: [ 'red', 'green', 'blue' ], cycle: true },
            scale: { start: 0.5, end: 0 },
            blendMode: 'ADD',
            emitZone: { type: 'edge', source: curve, quantity: 48, yoyo: true }
        });
    }
}

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

const game = new Phaser.Game(config);

Создание кривой-источника

В основе всех трех эффектов лежит одна кривая, которая будет служить источником для эмиттеров. Мы создаем плавную кривую Spline, передавая конструктору массив координат точек [x, y]. Эта кривая рисуется через заданные точки и становится нашим виртуальным «путем» для частиц.

const curve = new Phaser.Curves.Spline([ 50, 300, 164, 246, 274, 342, 412, 257, 522, 341, 664, 264 ]);

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

const particles = this.add.particles('flares');

Случайная зона (RandomZone)

Первый эмиттер использует RandomZone. Частицы появляются в случайных точках по всей длине кривой. Это самая простая и хаотичная форма распределения. Эмиттер расположен выше по оси Y (y: -200), чтобы визуально отделить его эффект от других.

Ключевой параметр emitZone: - type: 'random' указывает тип зоны. - source: curve задает кривую как источник. - quantity: 48 определяет количество точек на кривой, из которых случайным образом будут выбираться места появления. Чем больше значение, тем равномернее может быть распределение.

particles.createEmitter({
    y: -200,
    frame: { frames: [ 'red', 'green', 'blue' ], cycle: true },
    scale: { start: 0.5, end: 0 },
    blendMode: 'ADD',
    emitZone: { type: 'random', source: curve, quantity: 48 }
});

Используйте RandomZone для эффектов дыма, тумана или звездного скопления вокруг невидимого контура.

Зона по краю без отскока (EdgeZone, yoyo: false)

Второй эмиттер демонстрирует EdgeZone в своем базовом режиме. Частицы последовательно появляются вдоль кривой, от начала до конца, а затем цикл начинается заново с первой точки. Это создает эффект непрерывного «пробегания» импульса или энергии по заданной траектории.

Параметр yoyo: false отключен по умолчанию, но указан явно для наглядности. Это означает, что после достижения конца кривой, следующая частица появится снова в ее начале.

particles.createEmitter({
    frame: { frames: [ 'red', 'green', 'blue' ], cycle: true },
    scale: { start: 0.5, end: 0 },
    blendMode: 'ADD',
    emitZone: { type: 'edge', source: curve, quantity: 48, yoyo: false }
});

Такой режим идеален для анимации циркулирующей энергии по проводам, замкнутому контуру щита или бегущему огню.

Зона по краю с отскоком (EdgeZone, yoyo: true)

Третий эмиттер, смещенный вниз (y: 200), показывает поведение EdgeZone с включенным режимом yoyo. В этом случае частицы движутся от начала кривой к концу, а затем в обратном порядке — от конца к началу, создавая эффект «маятника» или «дыхания».

particles.createEmitter({
    y: 200,
    frame: { frames: [ 'red', 'green', 'blue' ], cycle: true },
    scale: { start: 0.5, end: 0 },
    blendMode: 'ADD',
    emitZone: { type: 'edge', source: curve, quantity: 48, yoyo: true }
});

Параметр quantity здесь определяет, на сколько сегментов разбивается кривая для расчета позиций. Режим yoyo: true отлично подходит для эффектов сканирования (как в радаре), двустороннего тока или пульсирующего контура объекта.

Настройка внешнего вида частиц

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

- **Кадры (frame)**: Частицы циклически меняют цвет с красного на зеленый и синий, что делает движение вдоль кривой более наглядным.

frame: { frames: [ 'red', 'green', 'blue' ], cycle: true }

- **Масштаб (scale)**: Частицы появляются с размером 0.5 и плавно исчезают, уменьшаясь до 0.

scale: { start: 0.5, end: 0 }

- **Режим наложения (blendMode)**: Режим 'ADD' складывает цвета частиц с фоном, создавая яркие, светящиеся эффекты, которые не затемняются, а усиливаются при наложении.

Эти параметры легко адаптировать под нужды конкретного эффекта.

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

Phaser предоставляет мощные и гибкие инструменты для привязки систем частиц к геометрии. Используйте RandomZone для объемных, хаотичных эффектов вокруг контура. Выбирайте EdgeZone для упорядоченного движения вдоль пути, а параметр yoyo позволит легко переключаться между циклическим и возвратным движением. Для экспериментов попробуйте: заменить Spline на Ellipse или Line; анимировать саму кривую-источник и наблюдать за движением частиц; комбинировать несколько эмиттеров с разными EdgeZone на одной кривой для сложных композитных эффектов.