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

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

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    test7;
    test6;
    test5;
    test4;
    test3;
    test2;
    test1;

    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('grid', 'assets/pics/debug-grid-1920x1920.png');
    }

    create ()
    {
        this.add.image(0, 0, 'grid').setOrigin(0);

        //  Test 1
        //  Render object at given coordinates
        this.test1 = this.add.text(400, 50, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5);

        //  Test 2
        //  Render object at given coordinates factoring in origin 1
        this.test2 = this.add.text(400, 150, 'Phaser 3', { fontSize: 32 }).setOrigin(1, 0.5);

        //  Test 3
        //  Render object at given coordinates factoring in origin 0
        this.test3 = this.add.text(400, 150, 'Phaser 3', { fontSize: 32 }).setOrigin(0, 0.5);

        //  Test 4
        //  Render object with scale
        this.test4 = this.add.text(400, 250, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5).setScale(2);

        //  Test 5
        //  Render object with rotation
        this.test5 = this.add.text(400, 350, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5);

        //  Test 6
        //  Render object with alpha
        this.test6 = this.add.text(400, 450, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5).setAlpha(0.5);

        //  Test 7
        //  Render object with blend mode
        this.test7 = this.add.text(400, 550, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5).setBlendMode(1);
    }

    update ()
    {
        this.test5.rotation += 0.01;
    }
}

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

const game = new Phaser.Game(config);

Основа: Создание сцены и загрузка ресурсов

Каждый пример в Phaser начинается со сцены (Scene). В методе preload мы загружаем ресурсы, а в create — создаём игровые объекты. В данном случае загружается фоновая текстура-сетка для наглядности.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('grid', 'assets/pics/debug-grid-1920x1920.png');
}

create ()
{
    this.add.image(0, 0, 'grid').setOrigin(0);
    // ... создание текстовых объектов
}

Метод this.add.image добавляет фоновое изображение, а setOrigin(0) выставляет точку отсчёта (origin) в его левый верхний угол, что удобно для выравнивания по краю экрана.

Точка отсчёта (Origin): Ключ к точному позиционированию

Свойство origin определяет точку внутри объекта, которая будет совмещена с его координатами (x, y). По умолчанию у текста origin равен 0.5 (центр). Этот параметр критически важен для выравнивания и вращения.

//  Origin = 0.5 (по умолчанию). Текст центрируется вокруг точки (400, 50).
this.test1 = this.add.text(400, 50, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5);

//  Origin = 1 по X, 0.5 по Y. Правая сторона текста привязана к X=400.
this.test2 = this.add.text(400, 150, 'Phaser 3', { fontSize: 32 }).setOrigin(1, 0.5);

//  Origin = 0 по X, 0.5 по Y. Левая сторона текста привязана к X=400.
this.test3 = this.add.text(400, 150, 'Phaser 3', { fontSize: 32 }).setOrigin(0, 0.5);

В примере test2 и test3 имеют одинаковые координаты Y=150, но из-за разного origin по оси X они отображаются по разные стороны от вертикальной линии X=400.

Трансформации: Масштаб и непрерывное вращение

Phaser позволяет легко трансформировать объекты. Метод setScale изменяет размер, а свойство rotation — угол поворота в радианах.

//  Увеличение текста в 2 раза.
this.test4 = this.add.text(400, 250, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5).setScale(2);

//  Создание объекта для последующего вращения.
this.test5 = this.add.text(400, 350, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5);

Важно: setScale применяется после setOrigin, что гарантирует масштабирование относительно центра текста. Вращение происходит в методе update, который вызывается каждый кадр.

update ()
{
    this.test5.rotation += 0.01;
}

Изменяя свойство rotation на небольшое значение каждому кадру, мы получаем плавную анимацию вращения. Поскольку origin установлен в 0.5, объект вращается вокруг своего центра.

Визуальные эффекты: Прозрачность и режимы наложения

Помимо трансформаций, можно управлять визуальным стилем текста. Метод setAlpha задаёт уровень прозрачности (от 0 — полностью прозрачный, до 1 — полностью непрозрачный). Метод setBlendMode изменяет способ смешивания пикселей объекта с фоном.

//  Полупрозрачный текст (alpha = 0.5).
this.test6 = this.add.text(400, 450, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5).setAlpha(0.5);

//  Текст с режимом наложения ADD (значение 1).
this.test7 = this.add.text(400, 550, 'Phaser 3', { fontSize: 32 }).setOrigin(0.5).setBlendMode(1);

Режим наложения ADD (значение 1) складывает цвета текста и фона, создавая эффект «свечения». Это особенно полезно для создания неоновых надписей или частиц. Значения blendMode соответствуют константам Canvas и WebGL.

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

Объект Text в Phaser 3 — это не просто строка на экране, а полноценный игровой объект с поддержкой трансформаций, эффектов и физики. Освоив управление origin, вы получите полный контроль над позиционированием. Используя scale, rotation, alpha и blendMode, можно создавать динамичные заголовки, элементы HUD и спецэффекты. Для экспериментов попробуйте: анимировать scale для эффекта пульсации, менять blendMode в реальном времени или привязать текст к физическому телу (this.physics.add.text), чтобы он сталкивался с другими объектами.