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

Фильтры в Phaser 3 открывают двери к визуальным эффектам, которые можно применять к игровым объектам в реальном времени, не подготавливая заранее текстуры. В этой статье мы разберем, как добавить динамический эффект «бочки» (barrel distortion) к тексту, создавая впечатление выпуклой линзы. Этот прием отлично подходит для выделения заголовков, создания психоделических переходов или просто для добавления «живости» статичным элементам интерфейса.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('bg', 'assets/pics/spacey.jpg');
    }

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

        const text = this.add.text(400, 300, 'Phaser\nBarrel FX', { align: 'center' });

        text.setOrigin(0.5, 0.5);
        text.setResolution(window.devicePixelRatio);
        text.setFontFamily('Arial');
        text.setFontStyle('bold');
        text.setFontSize(128);
        text.setShadow(8, 8);

        const fx = text.enableFilters().filters.internal.addBarrel(0.6);

        this.tweens.add({
            targets: fx,
            amount: 1.6,
            yoyo: true,
            loop: -1,
            ease: 'sine.inout'
        });
    }
}

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

const game = new Phaser.Game(config);

Подготовка сцены и загрузка ассетов

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

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('bg', 'assets/pics/spacey.jpg');
}

В методе create сначала добавляется фоновое изображение, а затем создается текстовый объект. Ключевой момент — позиционирование текста по центру экрана с помощью setOrigin(0.5, 0.5).

Создание и настройка текстового объекта

Перед применением фильтра необходимо правильно создать и стилизовать текст. Установка высокого разрешения (setResolution) обеспечивает четкое отображение на экранах с высокой плотностью пикселей.

const text = this.add.text(400, 300, 'Phaser\nBarrel FX', { align: 'center' });

text.setOrigin(0.5, 0.5);
text.setResolution(window.devicePixelRatio);
text.setFontFamily('Arial');
text.setFontStyle('bold');
text.setFontSize(128);
text.setShadow(8, 8);

Включение фильтров и добавление эффекта «Бочка»

Чтобы применить фильтр, нужно сначала активировать систему фильтров для текстового объекта с помощью метода enableFilters(). После этого мы получаем доступ к менеджеру фильтров filters.internal и добавляем эффект Barrel. Параметр 0.6 в addBarrel — это начальное значение искажения.

const fx = text.enableFilters().filters.internal.addBarrel(0.6);

Фильтр возвращает объект fx, свойствами которого (например, amount) можно управлять для анимации эффекта.

Анимация параметра фильтра

Динамика — вот что делает эффект по-настоящему интересным. Используя систему твинов Phaser, мы анимируем свойство amount фильтра. Значение amount контролирует силу искажения: чем больше, тем сильнее эффект «выпуклости».

this.tweens.add({
    targets: fx,
    amount: 1.6,
    yoyo: true,
    loop: -1,
    ease: 'sine.inout'
});

Конфигурация твина заставляет значение amount колебаться между начальным (0.6) и целевым (1.6), создавая пульсирующий эффект. Параметр yoyo: true обеспечивает обратное движение, а loop: -1 — бесконечное повторение.

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

Эффект «Бочка» — это мощный инструмент для добавления визуальной динамики тексту и другим игровым объектам в Phaser 3. Поэкспериментируйте с привязкой силы искажения amount к игровым событиям (например, к мощности заклинания или скорости движения). Попробуйте применить этот же фильтр к спрайтам или тайловым слоям, чтобы создать эффекты теплового марева, водной ряби или гравитационной линзы.