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

Использование масок в Phaser позволяет ограничивать область видимости графики, создавая эффекты обрезки, порталов, бликов или сложных переходов. В этом примере мы разберем, как создать битмап-маску из спрайта и применить её к другому изображению. Это базовый, но мощный приём для визуального дизайна игр, не требующий дополнительных текстур или шейдеров. Понимание работы с масками особенно полезно при создании UI-элементов с нестандартной формой, анимации раскрытия областей или визуальных эффектов, связанных с камерой и светом. Мы рассмотрим ключевой метод `createBitmapMask()` и его интеграцию в сцену.

Версия 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('mask', 'assets/tests/masks/chrome-mask.png');
        this.load.image('pic', 'assets/pics/brilliance-jim-sachs.png');
    }

    create ()
    {
        const rt = this.make.sprite({
            x: 400,
            y: 300,
            key: 'mask',
            add: false
        });

        const mask = rt.createBitmapMask();

        const pic = this.add.image(400, 300, 'pic');

        pic.setMask(mask);

        console.log(mask);

        window['renderer'] = this.renderer;
    }
}

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    width: '100%',
    height: '100%',
    scale: {
        mode: Phaser.Scale.RESIZE,
        autoCenter: Phaser.Scale.CENTER_BOTH
    },
    scene: Example
};

const game = new Phaser.Game(config);

Настройка сцены и загрузка ресурсов

В методе preload() мы загружаем две текстуры: изображение-маску и основную картинку, которая будет маскироваться. Обратите внимание на использование setBaseURL() — это удобный способ указать базовый путь для всех последующих загрузок, что упрощает работу с ресурсами, хранящимися на удаленном сервере.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('mask', 'assets/tests/masks/chrome-mask.png');
    this.load.image('pic', 'assets/pics/brilliance-jim-sachs.png');
}

Создание спрайта для маски

Маска в Phaser может быть создана из любого графического объекта, например, спрайта. В данном примере мы создаем спрайт с ключом 'mask', но не добавляем его сразу на сцену (параметр add: false). Это важно, потому что сам спрайт-маска не должен отображаться как самостоятельный объект — он служит лишь источником данных для маскирования.

const rt = this.make.sprite({
    x: 400,
    y: 300,
    key: 'mask',
    add: false
});

Генерация битмап-маски и её применение

Из созданного спрайта rt мы генерируем маску с помощью метода createBitmapMask(). Эта маска использует альфа-канал (прозрачность) спрайта для определения областей видимости. Далее мы создаем основное изображение pic и применяем к нему маску через метод setMask(). В результате изображение pic будет видно только там, где маска имеет непрозрачные пиксели.

const mask = rt.createBitmapMask();
const pic = this.add.image(400, 300, 'pic');
pic.setMask(mask);

Конфигурация игры и масштабирование

Конфигурация игры использует режим масштабирования Phaser.Scale.RESIZE, который подстраивает размер игрового холста под размер окна браузера. Это особенно полезно для адаптивных веб-интерфейсов или игр, которые должны заполнять доступное пространство. Параметр autoCenter обеспечивает центрирование игровой области.

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    width: '100%',
    height: '100%',
    scale: {
        mode: Phaser.Scale.RESIZE,
        autoCenter: Phaser.Scale.CENTER_BOTH
    },
    scene: Example
};

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

Создание битмап-маски из спрайта — это простой, но эффективный способ управления визуальным контентом в Phaser. Вы можете экспериментировать, анимируя положение или размер спрайта-маски для создания эффектов плавного появления, использовать текстуры с градиентной прозрачностью для мягких переходов или комбинировать несколько масок на одном объекте. Попробуйте применить маску к группе спрайтов или частицам для создания сложных визуальных композиций.