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

Работа с текстом — неотъемлемая часть разработки игр. Phaser предлагает мощный инструмент — Bitmap Fonts, для создания стилизованных текстовых элементов с высокой производительностью. В этой статье мы разберём, как правильно позиционировать и масштабировать такой текст, используя свойства `origin` и `scale`. Понимание этих принципов позволит вам точно размещать надписи на экране, анимировать их изменение размера и создавать сложные визуальные эффекты, что критически важно для интерфейсов, титров или игровых сообщений.

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

    create ()
    {
        const text1 = this.add.bitmapText(400, 100, 'desyrel', 'Hello World', 70);

        text1.setOrigin(0.5);
        text1.setScale(1, 1);

        const text2 = this.add.bitmapText(400, 300, 'desyrel', 'Hello World', 70);

        text2.setOrigin(0.5);
        text2.setScale(0.5, 0.5);

        const text3 = this.add.bitmapText(400, 500, 'desyrel', 'Hello World', 70);

        text3.setOrigin(0.5);
        text3.setScale(0.25, 0.25);
    }
}

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

const game = new Phaser.Game(config);

Что такое Bitmap Font и зачем он нужен

В отличие от системных шрифтов, Bitmap Font (растровый шрифт) — это заранее отрисованное изображение всех глифов (символов) определённого размера и стиля. Phaser загружает его как текстуру.

Основное преимущество — полная визуальная идентичность на всех устройствах и высокая скорость отрисовки, так как не требуется растеризация шрифта "на лету". Это идеальный выбор для стилизованных заголовков, цифр счёта или любого текста, который должен выглядеть точно так, как задумал художник.

В примере используется шрифт 'Desyrel', который загружается из двух файлов: PNG-изображения с символами и XML-файла с их разметкой.

this.load.bitmapFont('desyrel', 'assets/fonts/bitmap/desyrel.png', 'assets/fonts/bitmap/desyrel.xml');

Создание и позиционирование текста

Объект Bitmap Text создаётся с помощью метода this.add.bitmapText(). Важно понимать, что изначально точка привязки (origin) объекта находится в его левом верхнем углу.

Метод принимает несколько ключевых аргументов: координаты X и Y на сцене, ключ загруженного шрифта, сам текст и размер шрифта в пикселях (тот, для которого был создан bitmap-файл).

const text1 = this.add.bitmapText(400, 100, 'desyrel', 'Hello World', 70);

После создания объект text1 будет помещён так, что его левый верхний угол окажется в точке (400, 100) на сцене. Это часто неудобно для центрирования или вращения.

Меняем точку отсчёта (Origin)

Свойство origin определяет точку внутри игрового объекта, которая будет совмещена с его координатами (X, Y) на сцене. Это внутренняя точка привязки.

Значения от 0 до 1 представляют собой долю от ширины и высоты объекта. Установка origin в (0.5, 0.5) означает центр объекта. Теперь координаты (400, 100) будут указывать не на левый верхний угол, а на центр текстового блока, что значительно упрощает выравнивание.

text1.setOrigin(0.5);

Метод setOrigin(0.5) устанавливает и X, и Y компоненты origin в 0.5. Это эквивалентно setOrigin(0.5, 0.5).

Управление масштабом (Scale)

Свойство scale позволяет пропорционально или непропорционально изменять размер отображаемого объекта. Это преобразование применяется после всех расчётов с origin.

Значение по умолчанию — (1, 1), что означает исходный размер. Уменьшение масштаба, как в примере, делает объект визуально меньше, но его *логическая* точка origin и координаты (X, Y) остаются прежними. Это мощный инструмент для анимаций "появления", "пульсации" или создания текста разного размера из одного базового шрифта.

text2.setScale(0.5, 0.5);
text3.setScale(0.25, 0.25);

В примере text2 отрисовывается в два раза меньше исходного размера, а text3 — в четыре раза. При этом все три строки текста отцентрированы по горизонтали относительно X=400, потому что их origin установлен в центр.

Порядок операций и практический смысл

Критически важно понимать последовательность, в которой Phaser применяет эти трансформации к объекту: 1. **Создание:** Объект создаётся в своей «родной» системе координат с origin в (0, 0). 2. **Установка Origin:** Система координат объекта смещается так, что выбранная точка origin становится его новой "локальной нулевой точкой". 3. **Позиционирование:** Эта новая нулевая точка (origin) помещается в заданные мировые координаты (например, 400, 300). 4. **Масштабирование:** К уже позиционированному объекту применяется масштаб, "растягивая" или "сжимая" его относительно точки origin.

Именно поэтому в финальной сцене все три текстовых блока разного размера выровнены по центру экрана по вертикали — их центры (origin=0.5) зафиксированы на разных координатах Y (100, 300, 500), и масштабирование происходит симметрично относительно этого центра.

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

Контроль над origin и scale — это фундамент для точного размещения и трансформации любых игровых объектов в Phaser, и Bitmap Text не исключение. Используйте origin для выравнивания (например, setOrigin(0, 0.5) для выравнивания по левому краю и центру по вертикали), а scale — для динамических изменений. Для экспериментов попробуйте: анимировать свойство scale с помощью твинов для эффекта "всплывающего" текста; использовать разные значения scale.x и scale.y для создания сжатого или растянутого текста; привязать scale к игровой статистике (например, чтобы счет "пульсировал" при изменении).