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

BitmapText — это производительный способ отображения текста в играх, особенно когда требуется сохранить уникальный стиль шрифта. Однако иногда простого текста недостаточно: ему не хватает глубины и выразительности. Метод `setDropShadow` позволяет быстро добавить тексту лёгкую тень, отделяющую его от фона, или создать яркие неоновые эффекты, что мгновенно повышает читаемость и визуальную привлекательность интерфейсов и заголовков в вашем проекте.

Версия 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.bitmapFont('ice', 'assets/fonts/bitmap/iceicebaby.png', 'assets/fonts/bitmap/iceicebaby.xml');
    }

    create ()
    {
        const text = this.add.bitmapText(64, 64, 'ice', 'Drop Shadows', 128);

        text.setDropShadow(4, 4, 0x000000);

        const text2 = this.add.bitmapText(64, 264, 'ice', 'Drop Shadows', 128);

        text2.setDropShadow(4, 6, 0xff00ff, 0.7);

        const text3 = this.add.bitmapText(64, 464, 'ice', 'Drop Shadows', 128);

        text3.setDropShadow(0, 8, 0x000000, 0.2);
    }
}

const config = {
    type: Phaser.WEBGL,
    backgroundColor: '#2d2d2d',
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Загрузка bitmap-шрифта

Прежде чем работать с текстом, необходимо загрузить сам шрифт. Bitmap-шрифт в Phaser состоит из двух файлов: изображения (.png) со всеми символами и файла описания (часто .xml или .fnt), который содержит данные о расположении каждого символа на этом изображении.

В методе preload мы используем this.load.bitmapFont для загрузки. Первый аргумент — это ключ ('ice'), по которому мы будем обращаться к шрифту в коде. Далее указываются пути к файлам изображения и данных.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.bitmapFont('ice', 'assets/fonts/bitmap/iceicebaby.png', 'assets/fonts/bitmap/iceicebaby.xml');
}

Создание текста и базовая тень

Для создания объекта текста используется метод this.add.bitmapText. В него передаются координаты (x, y), ключ загруженного шрифта, сама текстовая строка и размер.

Сразу после создания к объекту text применяется метод setDropShadow. Первые два параметра — это смещение тени по осям X и Y (в пикселях). Третий параметр — цвет тени в шестнадцатеричном формате (например, 0x000000 для чёрного). Четвёртый, необязательный параметр — альфа-канал (прозрачность) от 0 до 1. Если он не указан, используется значение по умолчанию.

const text = this.add.bitmapText(64, 64, 'ice', 'Drop Shadows', 128);
text.setDropShadow(4, 4, 0x000000);

В данном примере создаётся классическая чёрная тень со смещением на 4 пикселя вправо и вниз. Это добавляет тексту лёгкий объём и чёткость.

Эксперименты с цветом и прозрачностью

Сила setDropShadow в гибкости. Изменяя параметры, можно добиваться совершенно разных визуальных эффектов, а не только реалистичной тени.

Второй текстовый объект (text2) демонстрирует это. Здесь тень смещена сильнее по вертикали (6 пикселей), ей задан яркий пурпурный цвет (0xff00ff) и снижена непрозрачность до 0.7. Это может имитировать неоновое свечение или стилизованный графический эффект.

const text2 = this.add.bitmapText(64, 264, 'ice', 'Drop Shadows', 128);
text2.setDropShadow(4, 6, 0xff00ff, 0.7);

Создание эффекта размытой тени

Ещё один интересный приём — использование очень размытой и прозрачной тени. Если смещение по X задать равным 0, а по Y — значительным (например, 8 пикселей), и при этом сильно уменьшить альфа-канал, получится эффект лёгкой, воздушной тени под текстом, как от рассеянного света.

Этот подход отлично подходит для минималистичных интерфейсов или для создания ощущения «парения» объекта над поверхностью.

const text3 = this.add.bitmapText(64, 464, 'ice', 'Drop Shadows', 128);
text3.setDropShadow(0, 8, 0x000000, 0.2);

Важно помнить, что тень рендерится как часть самого bitmap-текста и не является отдельным физическим объектом или частью системы освещения Phaser.

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

Метод setDropShadow — это простой и эффективный инструмент для мгновенного улучшения визуального качества текста в игре. Он не требует сложной настройки и работает исключительно с 2D-координатами, цветом и прозрачностью. Для экспериментов попробуйте анимировать параметры тени (например, меняя смещение или цвет в зависимости от времени или действий игрока) или комбинируйте несколько текстовых объектов с разными настройками теней для создания сложных композитных эффектов.