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

Визуальные эффекты, такие как огонь, магия, дым или звёздная пыль, оживляют игровой мир. В Phaser за них отвечает система частиц (Particle System). Эта статья покажет, как быстро создать базовый эмиттер частиц, управлять его поведением и настраивать рендеринг для достижения ярких эффектов, которые работают эффективно благодаря единому менеджеру текстур.

Версия 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.image('spark', 'assets/particles/blue.png');
    }

    create ()
    {
        //  First create a particle manager
        //  A single manager can be responsible for multiple emitters
        //  The manager also controls which particle texture is used by _all_ emitter
        const particles = this.add.particles('spark');

        const emitter = particles.createEmitter();

        emitter.setPosition(400, 300);
        emitter.setSpeed(200);
        emitter.setBlendMode(Phaser.BlendModes.ADD);
    }
}

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

const game = new Phaser.Game(config);

Структура примера: от загрузки до конфигурации

Код начинается с определения сцены, загрузки ресурса и настройки основного объекта игры Phaser.Game.

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

В методе preload задаётся базовый URL для загрузки и загружается одно изображение spark — будущая текстура для каждой частицы. Это стандартный подход Phaser для подготовки ресурсов.

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

const game = new Phaser.Game(config);

Конфигурационный объект config задаёт ключевые параметры: использование WebGL для лучшей производительности частиц, размеры холста, чёрный фон и указание на класс сцены. Создание экземпляра new Phaser.Game(config) запускает игру.

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

Вся работа с частицами начинается с создания менеджера.

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

Метод this.add.particles('spark') создаёт и возвращает объект ParticleEmitterManager. Ключевая его роль — управление текстурой: все эмиттеры, созданные этим менеджером, будут использовать переданное изображение spark. Это эффективно, так как множество частиц рисуются одним батчем.

const emitter = particles.createEmitter();

Метод createEmitter() фабрики менеджера создаёт и возвращает объект ParticleEmitter. Именно этот объект контролирует поведение частиц: их рождение, движение, исчезновение и внешний вид. Один менеджер может содержать множество таких эмиттеров с разными настройками.

Базовая настройка эмиттера: позиция, скорость и блендинг

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

emitter.setPosition(400, 300);

Метод setPosition(x, y) определяет поведение частиц. Вызов setPosition(400, 300) устанавливает точку их появления в центре экрана. Метод setSpeed(200) задаёт начальную скорость движения частиц в пикселях в секунду. Наконец, setBlendMode(Phaser.BlendModes.ADD) включает аддитивный блендинг: цвета частиц складываются, создавая яркие, светящиеся эффекты, которые идеально подходят для огня, энергии или бликов.

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

Всего несколькими строками кода вы можете добавить в игру динамичные визуальные эффекты. Экспериментируйте: меняйте параметры setSpeed, пробуйте другие бленд-режимы вроде SCREEN, создайте несколько эмиттеров с разными текстурами или заставьте эмиттер следовать за курсором мыши, чтобы понять систему частиц глубже.