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

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

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

Живой запуск

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

Исходный код


let sprites = [];
// Overlay is Canvas Blend Modes
class Example extends Phaser.Scene
{
    constructor ()
    {
        super();
    }

    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 (var i = 0; i < 300; i++)
        {
            var x = Phaser.Math.Between(-64, 800);
            var y = Phaser.Math.Between(-64, 600);

            var 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.OVERLAY);
            image.setBlendMode(Phaser.BlendModes.ADD);

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

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

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

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

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

}

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


const game = new Phaser.Game(config);

Что такое Blend Modes и зачем они нужны

Режимы смешивания (Blend Modes) определяют, как пиксели одного графического элемента (источника) комбинируются с пикселями под ним (фоновыми). Это не просто прозрачность, а математическая операция над цветами (RGB) и, иногда, альфа-каналом.

В игровой разработке это незаменимо для: * Создания эффекта свечения частиц (ADD). * Реализации затемнения или осветления областей (OVERLAY, LIGHTEN). * Добавления контраста и стилистических искажений (DIFFERENCE). * Наложения текстур или цветовых фильтров (MULTIPLY, SCREEN).

Phaser предоставляет набор констант в объекте Phaser.BlendModes. Важное ограничение: часть режимов (например, OVERLAY, DIFFERENCE) работает только при использовании рендерера Phaser.CANVAS, в то время как основные (ADD, MULTIPLY, SCREEN, NORMAL) поддерживаются и в Canvas, и в WebGL.

Разбор примера: структура и настройка

В предоставленном коде создаётся сцена с фоном, множеством частиц и логотипом. Ключевой момент — конфигурация рендерера. От неё зависит, какие режимы смешивания будут работать.

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

Указание type: Phaser.CANVAS позволяет использовать все режимы смешивания, включая эксклюзивные для Canvas, такие как DIFFERENCE и OVERLAY. Если бы использовался Phaser.WEBGL, эти специфичные режимы не сработали бы.

Создание и настройка частиц с blend mode

В методе create() создаются 300 частиц-изображений в случайных позициях. Для каждой частицы вручную задаётся режим наложения.

for (var i = 0; i < 300; i++) {
    var x = Phaser.Math.Between(-64, 800);
    var y = Phaser.Math.Between(-64, 600);
    var image = this.add.image(x, y, 'particle');
    image.setBlendMode(Phaser.BlendModes.ADD);
    sprites.push({ s: image, r: 2 + Math.random() * 6 });
}

Метод setBlendMode() вызывается у экземпляра Image. В данном примере для частиц выбран режим Phaser.BlendModes.ADD. Этот режим складывает цвета источника и фона, создавая эффект яркого свечения, идеальный для звёзд, огня или магических частиц. Частицы также сохраняются в массив sprites вместе со своей случайной скоростью (`r`) для последующей анимации.

Применение DIFFERENCE к основному спрайту

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

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

Режим Phaser.BlendModes.DIFFERENCE инвертирует цвета в области наложения, вычитая один цвет из другого. На тёмном фоне это может дать эффект «негатива», а на цветном — создаёт психоделические, контрастные области. Это наглядно показывает, как один режим может кардинально изменить восприятие объекта. Помните, что DIFFERENCE работает только при type: Phaser.CANVAS в конфиге.

Анимация частиц в update()

Динамика — важная часть эффекта. В методе update() обеспечивается движение частиц.

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

Этот код в каждом кадре перемещает каждую частицу вверх со своей сохранённой скоростью (sprites[i].r). Когда частица уходит за верхнюю границу экрана (sprite.y < -256), она телепортируется вниз (sprite.y = 700), создавая бесконечный поток. Движение в сочетании с режимом ADD усиливает иллюзию летящих звёзд или пепла.

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

Режимы смешивания — это простой, но чрезвычайно мощный инструмент для визуального оформления игры в Phaser. Они позволяют достичь сложных эффектов на уровне композиции, не прибегая к редактированию текстур или написанию шейдеров. Для экспериментов попробуйте: 1. Сменить Phaser.BlendModes.ADD на Phaser.BlendModes.OVERLAY у частиц (убедитесь, что используете Phaser.CANVAS). 2. Применить MULTIPLY или SCREEN к интерфейсным элементам для их интеграции в фон. 3. Создать несколько слоёв спрайтов с разными blend modes и анимировать их прозрачность. 4. Проверить, как одни и те же режимы выглядят при рендеринге в WebGL (заменив type в конфиге).