О чем этот пример
Эффекты фильтров в Phaser 3 позволяют создавать сложные визуальные трансформации спрайтов без редактирования исходных изображений. В этой статье разберем, как работает фильтр Wipe для создания плавного эффекта 'протирания' спрайта. Этот подход универсален: его можно адаптировать для переходов между сценами, появления объектов или создания стилизованных анимаций интерфейса, добавив игре полировки с минимальными затратами ресурсов.
Версия 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('pyramid', 'assets/sprites/pyramid.png');
this.load.image('bg', 'assets/skies/space4.png');
}
create ()
{
this.add.image(400, 300, 'bg');
const sprite = this.add.image(400, 300, 'pyramid');
const fx = sprite.enableFilters().filters.internal.addWipe().setLeftToRight();
this.tweens.add({
targets: fx,
progress: 1,
repeatDelay: 1000,
hold: 1000,
yoyo: true,
repeat: -1,
duration: 2000
});
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#0a0067',
parent: 'phaser-example',
scene: Example
};
let game = new Phaser.Game(config);
Подготовка сцены и загрузка ресурсов
Вся работа начинается в методе preload. Здесь мы загружаем изображения, которые будут использоваться в качестве фона и основного спрайта. Важно правильно указать базовый URL, чтобы загрузчик мог найти ресурсы.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('pyramid', 'assets/sprites/pyramid.png');
this.load.image('bg', 'assets/skies/space4.png');
}
Создание графики и включение фильтров
В методе create мы размещаем фон и спрайт на сцене. Ключевой шаг — активация фильтров для спрайта с помощью метода .enableFilters(). Это подготавливает спрайт к применению постобработки. После этого мы получаем доступ к внутренней коллекции фильтров объекта.
this.add.image(400, 300, 'bg');
const sprite = this.add.image(400, 300, 'pyramid');
const fx = sprite.enableFilters().filters.internal.addWipe().setLeftToRight();
Фильтр addWipe() создает эффект 'шторки', а setLeftToRight() задает направление его движения — слева направо. По умолчанию спрайт полностью скрыт этим фильтром.
Анимация фильтра с помощью Tween
Сам эффект проявляется при анимации свойства progress фильтра. Значение от 0 до 1 контролирует, какая часть спрайта 'протерта' (видна). Мы используем систему Tween Phaser для плавного изменения этого значения.
this.tweens.add({
targets: fx, // Цель анимации — наш фильтр
progress: 1, // Конечное значение прогресса (полностью видимый спрайт)
repeatDelay: 1000, // Пауза перед повторением
hold: 1000, // Пауза на конечном значении
yoyo: true, // Возврат к начальному значению (0)
repeat: -1, // Бесконечное повторение
duration: 2000 // Движение в одну сторону занимает 2 секунды
});
В результате спрайт будет плавно появляться слева направо, затем оставаться видимым, исчезать и цикл повторится.
Настройка игрового экземпляра (Config)
Конфигурационный объект определяет основные параметры нашего приложения Phaser. Здесь задается размер холста, цвет фона (который виден до загрузки ресурсов) и корневой класс сцены.
const config = {
type: Phaser.AUTO, // Автовыбор WebGL или Canvas
width: 800,
height: 600,
backgroundColor: '#0a0067',
parent: 'phaser-example', // ID DOM-элемента для вставки canvas
scene: Example // Наша основная сцена
};
let game = new Phaser.Game(config);
Что попробовать дальше
Фильтр Wipe в Phaser 3 — это мощный и простой инструмент для создания анимированных переходов. Вы можете экспериментировать: изменить направление на setRightToLeft() или setTopToBottom, анимировать свойство progress не через tween, а вручную в методе update в ответ на действия игрока, или комбинировать несколько фильтров на одном спрайте для получения сложных визуальных эффектов.
