О чем этот пример
Визуальные эффекты — ключевой элемент вовлечения игрока. Фильтры в Phaser позволяют создавать сложные переходы с минимальными усилиями. В этой статье мы разберем, как использовать фильтр 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(0.1, 0, 1, 1);
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);
Инициализация сцены и загрузка ресурсов
Как и в любом проекте на Phaser, работа начинается с создания сцены и загрузки необходимых графических ресурсов. В методе 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(). Это подготавливает спрайт к работе с системой фильтров.
create ()
{
this.add.image(400, 300, 'bg');
const sprite = this.add.image(400, 300, 'pyramid');
const fx = sprite.enableFilters().filters.internal.addWipe(0.1, 0, 1, 1);
}
После активации фильтров мы обращаемся к внутренней коллекции filters.internal и добавляем эффект Wipe с помощью метода addWipe. Первые два аргумента (0.1, 0) задают начальную позицию эффекта (X, Y) в нормализованных координатах (от 0 до 1). Следующие два аргумента (1, 1) определяют его размер (ширина, высота). На данном этапе эффект еще не анимирован.
Анимация прогресса эффекта с помощью Tween
Фильтр Wipe имеет свойство progress, которое контролирует, какая часть изображения видима (значение от 0 до 1). Мы можем анимировать это свойство, используя систему Tween Phaser. В исходнике создается tween, который плавно меняет progress от текущего значения до 1.
this.tweens.add({
targets: fx,
progress: 1,
repeatDelay: 1000,
hold: 1000,
yoyo: true,
repeat: -1,
duration: 2000
});
Ключевые параметры:
* targets: fx — указывает объект фильтра, который нужно анимировать.
* progress: 1 — целевое значение анимации (полное проявление).
* yoyo: true — включает обратную анимацию (после достижения цели значение вернется к исходному).
* repeat: -1 — делает анимацию бесконечно повторяющейся.
* duration: 2000 — длительность одного цикла в миллисекундах.
* hold и repeatDelay добавляют паузы в конце и начале цикла, делая анимацию более выразительной.
Настройка конфигурации игры
Запуск игры осуществляется через стандартную конфигурацию. Важно указать правильный тип рендерера (Phaser.AUTO), размеры холста и передать класс нашей сцены.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#0a0067',
parent: 'phaser-example',
scene: Example
};
let game = new Phaser.Game(config);
Цвет фона backgroundColor будет виден только до загрузки и отрисовки фонового изображения в сцене.
Что попробовать дальше
Фильтр Wipe — это мощный и простой инструмент для создания динамичных переходов. Вы можете экспериментировать, изменяя начальные координаты и размер эффекта в addWipe, чтобы, например, открывать объект не сверху вниз, а сбоку. Также попробуйте анимировать другие свойства фильтра, кроме progress, или применить эффект к группе спрайтов (Container) для одновременного появления целой сцены.
