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

Эффекты переходов, такие как плавное появление или исчезновение объектов, оживляют игровой процесс. В Phaser 3 для этого существуют фильтры постобработки. В этой статье разберем, как с помощью фильтра `Wipe` создать анимацию вертикального "стирания" спрайта сверху вниз и обратно, используя встроенную систему твинов для плавного управления. Этот подход полезен для создания cinematic-сцен, плавных затуханий интерфейса или нестандартных переходов между уровнями, не требуя при этом сложного шейдерного программирования.

Версия 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().setTopToBottom();

        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 3. В методе preload мы загружаем два изображения: фон (bg) и спрайт (pyramid), которые будут использоваться для демонстрации эффекта. Обратите внимание, что базовый 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 сначала добавляется фоновое изображение. Затем создается основной спрайт pyramid. Ключевой момент — активация системы фильтров для этого спрайта с помощью метода enableFilters(). Это обязательный шаг, без него фильтры применяться не будут.

create ()
{
    this.add.image(400, 300, 'bg');
    const sprite = this.add.image(400, 300, 'pyramid');
    const fx = sprite.enableFilters().filters.internal.addWipe().setTopToBottom();
}

Цепочка вызовов после enableFilters() делает следующее: 1. filters.internal — получает доступ к внутреннему менеджеру фильтров объекта. 2. addWipe() — создает и добавляет к спрайту фильтр типа "стирание". 3. setTopToBottom() — настраивает фильтр на направление стирания сверху вниз. Фильтр Wipe также поддерживает другие направления, например, setBottomToTop() или setLeftToRight().

Анимация эффекта с помощью твинов

Фильтр Wipe управляется свойством progress (прогресс), которое изменяется от 0 до 1. Когда progress равен 0, спрайт полностью виден (эффект не применен). Когда progress достигает 1, спрайт полностью "стерт" в заданном направлении.

Для анимации этого свойства используется система твинов Phaser (this.tweens.add). Конфигурация твина заставляет прогресс циклически меняться.

this.tweens.add({
    targets: fx,           // Анимируем объект фильтра
    progress: 1,          // Конечное значение прогресса (полное стирание)
    repeatDelay: 1000,    // Пауза 1 сек перед повторением
    hold: 1000,           // Удержание конечного значения 1 сек
    yoyo: true,           // После достижения конца — анимация в обратном порядке
    repeat: -1,          // Бесконечное повторение
    duration: 2000       // Длительность одного направления анимации (2 сек)
});

Благодаря параметру yoyo: true, после стирания спрайта сверху вниз (за 2 секунды до progress: 1), он будет плавно возвращаться обратно (за следующие 2 секунды до progress: 0). Паузы (hold, repeatDelay) добавляют драматичности эффекту.

Настройка игры (config)

Конфигурационный объект игры стандартен. Важно убедиться, что размеры canvas (width, height) соответствуют координатам, на которых размещаются изображения (в нашем случае центр — 400x300).

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

let game = new Phaser.Game(config);

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

Фильтр Wipe в Phaser 3 — это мощный и простой инструмент для создания динамичных переходов. Всего в несколько строк кода мы получили циклическую анимацию появления и исчезновения объекта. Для экспериментов попробуйте: изменить направление стирания на setLeftToRight; применить эффект не к спрайту, а к целой группе или контейнеру; связать прогресс фильтра не с твином, а с движением игрового персонажа, чтобы объект "проявлялся" по мере прохождения уровня.