О чем этот пример
Фильтры в Phaser 3 позволяют применять к игровым объектам мощные пост-обработки в реальном времени, такие как размытие, свечение или цветокоррекция. Это отличный способ добавить визуальный акцент, создать эффекты повреждения, иллюзию скорости или магические ауры без необходимости редактировать исходные текстуры. В этой статье мы разберем, как легко подключить и анимировать фильтр размытия к любому спрайту, используя встроенную систему фильтров движка.
Версия 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('background', 'assets/sprites/blur-bg.png');
this.load.image('phaserlogo', 'assets/sprites/phaser2.png');
}
create ()
{
this.add.image(400, 300, 'background').setScale(0.7);
const logo = this.add.image(400, 300, 'phaserlogo');
logo.enableFilters();
const fx = logo.filters.external.addBlur();
this.tweens.add({
targets: fx,
strength: 0,
duration: 2000,
yoyo: true,
repeat: -1
});
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000022',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка сцены и загрузка ассетов
Как и в любой сцене Phaser, первым делом необходимо загрузить ресурсы. В методе preload() мы устанавливаем базовый URL для удобства и загружаем два изображения: фоновое и логотип Phaser, который станет нашим основным объектом для экспериментов с фильтром.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('background', 'assets/sprites/blur-bg.png');
this.load.image('phaserlogo', 'assets/sprites/phaser2.png');
}
Создание объектов и активация фильтров
В методе create() мы сначала добавляем и масштабируем фоновое изображение. Затем создаем объект logo — спрайт с логотипом. Ключевой момент: чтобы начать применять фильтры к объекту, необходимо явно вызвать для него метод enableFilters(). Этот метод подготавливает объект для последующей обработки шейдерами.
create ()
{
this.add.image(400, 300, 'background').setScale(0.7);
const logo = this.add.image(400, 300, 'phaserlogo');
logo.enableFilters();
}
Добавление и настройка фильтра размытия
После активации фильтров у объекта появляется свойство filters.external. С его помощью можно добавлять различные предустановленные эффекты. В нашем случае мы добавляем фильтр размытия методом addBlur(). Этот метод возвращает экземпляр фильтра (fx), который мы сможем в дальнейшем настраивать и анимировать.
const fx = logo.filters.external.addBlur();
Фильтр Blur по умолчанию имеет некоторую начальную силу размытия. Его основное свойство для управления — strength (сила).
Анимация параметров фильтра
Самая интересная часть — динамическое изменение фильтра. Phaser 3 позволяет анимировать свойства фильтров с помощью своей системы твинов, как и любые другие числовые свойства. Мы создаем твин, который плавно меняет свойство strength фильтра от текущего значения до нуля (полная четкость) и обратно, создавая цикличный эффект "проявления".
this.tweens.add({
targets: fx, // Цель анимации — наш фильтр
strength: 0, // Конечное значение силы размытия
duration: 2000, // Длительность анимации в миллисекундах
yoyo: true, // Воспроизвести анимацию в обратном порядке
repeat: -1 // Бесконечное повторение
});
Конфигурация игры
Код завершается стандартной для Phaser 3 конфигурацией игры, где указывается тип рендерера, размеры холста, цвет фона, родительский HTML-элемент и стартовая сцена.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000022',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что попробовать дальше
Всего несколько строк кода — и статичный спрайт оживает, обретая динамический визуальный эффект. Система фильтров Phaser 3, доступная через filters.external, проста в использовании и мощна. Для экспериментов попробуйте анимировать другие свойства фильтров (например, quality у Blur), комбинировать несколько фильтров на одном объекте или привязывать силу эффекта к игровой логике (скорости персонажа, уровню маны).
