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

Режимы смешивания (Blend Modes) — мощный инструмент для создания визуальных эффектов в играх без дополнительных текстур. Они позволяют управлять тем, как накладывается пиксель одного графического объекта на другой, что открывает возможности для свечения, теней, цветовых фильтров и сложных композиций. В этой статье мы разберем, как применять режимы смешивания к частицам и спрайтам в Phaser, используя пример из официальной документации, и объясним практическое применение каждого режима. Вы научитесь оживлять игровую графику минимальными усилиями.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    constructor ()
    {
        super();
        this.sprites = [];
    }

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('bg', 'assets/skies/space1.png');
        this.load.image('particle', 'assets/particles/yellow.png');
        this.load.image('logo', 'assets/sprites/phaser2.png');
    }


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

        //  Create the particles
        for (let i = 0; i < 300; i++)
        {
            const x = Phaser.Math.Between(-64, 800);
            const y = Phaser.Math.Between(-64, 600);

            const image = this.add.image(x, y, 'particle');

            //  Canvas and WebGL:

            // NORMAL
            // ADD
            // MULTIPLY
            // SCREEN

            //  Canvas only:

            // OVERLAY
            // DARKEN
            // LIGHTEN
            // COLOR_DODGE
            // COLOR_BURN
            // HARD_LIGHT
            // SOFT_LIGHT
            // DIFFERENCE
            // EXCLUSION
            // HUE
            // SATURATION
            // COLOR
            // LUMINOSITY

            image.setBlendMode(Phaser.BlendModes.ADD);

            this.sprites.push({ s: image, r: 2 + Math.random() * 6 });
        }

        this.add.image(400, 300, 'logo').setBlendMode(Phaser.BlendModes.SCREEN);
    }

    update ()
    {
        for (let i = 0; i < this.sprites.length; i++)
        {
            const sprite = this.sprites[i].s;

            sprite.y -= this.sprites[i].r;

            if (sprite.y < -256)
            {
                sprite.y = 700;
            }
        }
    }
}

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

const game = new Phaser.Game(config);

Что такое режимы смешивания и зачем они нужны

В компьютерной графике режим смешивания определяет, как цвет пикселя источника (например, частицы) комбинируется с цветом пикселя фона. В Phaser это реализовано через класс Phaser.BlendModes, который поддерживает различные режимы, включая ADD, MULTIPLY, SCREEN и другие. Они особенно полезны для частиц, чтобы создать эффекты свечения, огня, дыма или магических аур, не рисуя каждый кадр вручную. В примере мы видим два ключевых применения: частицы с режимом ADD для имитации звездного свечения и логотип с режимом SCREEN для мягкого наложения.

Основные режимы, такие как ADD, складывают значения цветов, что делает их ярче — идеально для света. SCREEN инвертирует и перемножает цвета, давая эффект осветления без "пересвета". Важно: некоторые режимы (например, OVERLAY) работают только в Canvas-рендерере, а не в WebGL, что учитывается в коде комментариями.

Настройка сцены и загрузка ресурсов

В начале кода определяется класс сцены Example, который наследуется от Phaser.Scene. В конструкторе инициализируется массив this.sprites для хранения частиц и их скоростей.

class Example extends Phaser.Scene
{
    constructor ()
    {
        super();
        this.sprites = [];
    }

В методе preload загружаются три изображения: фон (bg), текстура частицы (particle) и логотип (logo). Базовый URL задается через this.load.setBaseURL, что упрощает доступ к ресурсам из репозитория примеров.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('bg', 'assets/skies/space1.png');
    this.load.image('particle', 'assets/particles/yellow.png');
    this.load.image('logo', 'assets/sprites/phaser2.png');
}

Создание частиц с режимом смешивания ADD

В методе create сначала добавляется фон, затем в цикле генерируется 300 частиц. Каждая частица — это изображение (this.add.image) со случайными координатами в пределах и чуть за границами экрана, чтобы обеспечить плавный поток.

for (let i = 0; i < 300; i++)
{
    const x = Phaser.Math.Between(-64, 800);
    const y = Phaser.Math.Between(-64, 600);
    const image = this.add.image(x, y, 'particle');

Ключевой шаг — применение режима смешивания ADD через image.setBlendMode. Этот режим складывает цвета частицы и фона, создавая яркое свечение, так как значения RGB добавляются, что может превышать максимум (белый цвет). Частица и ее случайная скорость (от 2 до 8 пикселей за кадр) сохраняются в массив this.sprites.

image.setBlendMode(Phaser.BlendModes.ADD);
this.sprites.push({ s: image, r: 2 + Math.random() * 6 });

Добавление логотипа с режимом SCREEN

После создания частиц в центре экрана размещается логотип Phaser. Для него используется режим SCREEN, который инвертирует цвета фона и логотипа, перемножает их, затем снова инвертирует. Это дает эффект осветления, но более мягкий, чем ADD, без "выжигания" светлых участков. Такой подход полезен для наложения интерфейсных элементов или спецэффектов.

this.add.image(400, 300, 'logo').setBlendMode(Phaser.BlendModes.SCREEN);

Обратите внимание: в коде приведен список всех доступных режимов смешивания в Phaser, разделенный на универсальные (работают в Canvas и WebGL) и специфичные только для Canvas. Это помогает выбрать подходящий режим под вашу задачу и рендерер.

Анимация частиц в игровом цикле

В методе update, который вызывается каждый кадр, происходит движение частиц. Для каждого элемента массива this.sprites координата `yуменьшается на значение скоростиr`, создавая эффект плавного подъема. Если частица уходит за верхнюю границу экрана (менее -256), она возвращается вниз (y = 700), обеспечивая бесконечный цикл анимации.

for (let i = 0; i < this.sprites.length; i++)
{
    const sprite = this.sprites[i].s;
    sprite.y -= this.sprites[i].r;
    if (sprite.y < -256)
    {
        sprite.y = 700;
    }
}

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

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

Режимы смешивания в Phaser — это быстрый путь к визуально богатой графике. В примере мы увидели, как ADD и SCREEN преображают частицы и спрайты, добавляя глубину и динамику. Для экспериментов попробуйте заменить ADD на MULTIPLY (для затемнения) или OVERLAY (в Canvas) — это изменит атмосферу сцены. Также поэкспериментируйте с цветами текстур или добавьте несколько слоев с разными режимами для сложных эффектов, например, симуляции огня или магического щита.