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

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

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    constructor ()
    {
        super();
    }

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('background', 'assets/bugs/background.png');
        this.load.multiatlas('spin_wave', 'assets/bugs/e_spinwave.json', 'assets/bugs');
    }

    create ()
    {
        this.add.sprite(320, 180, 'background');

        this.anims.create({
            key: "spin",
            frames: this.anims.generateFrameNames('spin_wave', {
                start: 0,
                end: 31,
                zeroPad: 3,
                prefix: 'e_spinwave_',
                suffix: '.png'
            }),
            frameRate: 15,
            yoyo: false,
            repeat: -1
        });

        let spinWave = this.add.sprite(320, 180).play('spin');

        spinWave.setBlendMode(Phaser.BlendModes.ADD);
    }
}

const config = {
	type: Phaser.WEBGL,
	width: 640,
	height: 360,
	pixelArt: true,
    parent: 'phaser-example',
	scene: Example
}

const game = new Phaser.Game(config);

Загрузка ресурсов: Фон и мультиатлас

В методе preload мы загружаем два графических ресурса, необходимых для сцены. Первый — статическое фоновое изображение.

this.load.image('background', 'assets/bugs/background.png');

Второй ресурс — мультиатлас. В отличие от обычного атласа, мультиатлас загружается по отдельному JSON-файлу, который содержит информацию о нескольких текстурах или последовательностях кадров. Это удобно для управления сложными анимациями.

this.load.multiatlas('spin_wave', 'assets/bugs/e_spinwave.json', 'assets/bugs');

Здесь 'spin_wave' — это ключ, по которому мы будем обращаться к атласу в коде, а JSON-файл описывает, какие кадры анимации в нем содержатся.

Создание анимации из кадров мультиатласа

В методе create мы сначала добавляем фон на сцену, а затем создаем анимацию. Для этого используется менеджер анимаций this.anims.

this.anims.create({
    key: "spin",
    frames: this.anims.generateFrameNames('spin_wave', {
        start: 0,
        end: 31,
        zeroPad: 3,
        prefix: 'e_spinwave_',
        suffix: '.png'
    }),
    frameRate: 15,
    yoyo: false,
    repeat: -1
});

Функция generateFrameNames генерирует массив кадров, обращаясь к мультиатласу 'spin_wave'. Параметры start и end задают диапазон кадров (от 0 до 31). zeroPad: 3 означает, что номера кадров будут дополнены нулями до трех знаков (например, e_spinwave_000.png). prefix и suffix — это части имени файла, обрамляющие номер кадра. Анимация будет проигрываться с частотой 15 кадров в секунду (frameRate), без движения в обратную сторону (yoyo: false) и бесконечно (repeat: -1).

Добавление спрайта и применение режима смешивания

После создания анимации мы добавляем на сцену спрайт и запускаем на нем анимацию 'spin'.

let spinWave = this.add.sprite(320, 180).play('spin');

Самая важная строка в этом примере — применение режима наложения пикселей (Blend Mode).

spinWave.setBlendMode(Phaser.BlendModes.ADD);

Метод setBlendMode применяет к спрайту выбранный режим смешивания. Phaser.BlendModes.ADD — это один из встроенных режимов. Его принцип работы: цвета пикселей спрайта и фона (или других объектов под ним) не перекрываются, а складываются. Это приводит к осветлению и создает эффект "свечения" или "энергии", так как яркие области становятся еще ярче. Без этого режима полупрозрачные темные области спрайта просто затемнили бы фон.

Конфигурация игры: Важность WEBGL-рендерера

Для работы большинства режимов смешивания, включая ADD, необходим WebGL-рендерер.

const config = {
    type: Phaser.WEBGL,
    width: 640,
    height: 360,
    pixelArt: true,
    parent: 'phaser-example',
    scene: Example
};

Ключевой параметр здесь — type: Phaser.WEBGL. Если установить Phaser.CANVAS, режимы смешивания могут не поддерживаться или работать некорректно. Параметр pixelArt: true включает сглаживание текстур, характерное для пиксель-арта, что важно для сохранения стилистики загруженных изображений.

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

Режим смешивания ADD — мощный инструмент для создания сложных визуальных эффектов из простых ассетов. Он позволяет реалистично имитировать светящиеся объекты, не прибегая к предварительно отрендеренным спецэффектам. Для экспериментов попробуйте применить этот режим к системам частиц (this.add.particles), чтобы создать дым или искры, или комбинируйте несколько спрайтов с разными режимами наложения (MULTIPLY, SCREEN) для получения уникальных визуальных композиций.