О чем этот пример
Фильтры в 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 к игровым событиям (например, к мощности заклинания или скорости движения). Попробуйте применить этот же фильтр к спрайтам или тайловым слоям, чтобы создать эффекты теплового марева, водной ряби или гравитационной линзы.
