О чем этот пример
Динамический BitmapText — это мощный инструмент для отображения текста в играх на Phaser. В отличие от обычного текста, он использует растровые шрифты, что позволяет легко менять содержимое строки во время выполнения, а также применять различные визуальные эффекты. Эта статья покажет, как создавать, позиционировать и анимировать такой текст, что полезно для интерфейсов, счетчиков очков или любых динамических надписей.
Версия 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');
this.load.bitmapFont('desyrel', 'assets/fonts/bitmap/desyrel.png', 'assets/fonts/bitmap/desyrel.xml');
}
create ()
{
this.add.image(0, 0, 'grid').setOrigin(0);
// Test 1
// Render object at given coordinates
this.test1 = this.add.dynamicBitmapText(400, 50, 'desyrel', 'PHASER 3', 32).setOrigin(0.5);
// Test 2
// Render object at given coordinates factoring in origin 1
this.test2 = this.add.dynamicBitmapText(400, 150, 'desyrel', 'PHASER 3', 32).setOrigin(1, 0.5);
// Test 3
// Render object at given coordinates factoring in origin 0
this.test3 = this.add.dynamicBitmapText(400, 150, 'desyrel', 'PHASER 3', 32).setOrigin(0, 0.5);
// Test 4
// Render object with scale
this.test4 = this.add.dynamicBitmapText(400, 250, 'desyrel', 'PHASER 3', 32).setOrigin(0.5).setScale(2);
// Test 5
// Render object with rotation
this.test5 = this.add.dynamicBitmapText(400, 350, 'desyrel', 'PHASER 3', 32).setOrigin(0.5);
// Test 6
// Render object with alpha
this.test6 = this.add.dynamicBitmapText(400, 450, 'desyrel', 'PHASER 3', 32).setOrigin(0.5).setAlpha(0.5);
// Test 7
// Render object with blend mode
this.test7 = this.add.dynamicBitmapText(400, 550, 'desyrel', 'PHASER 3', 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);
Что такое DynamicBitmapText и зачем он нужен
Класс DynamicBitmapText предназначен для отображения текста с использованием предварительно загруженного растрового шрифта (bitmap font). Главное его отличие от статического BitmapText — возможность изменять строку текста (text) непосредственно во время работы игры, без пересоздания объекта.
Это делает его идеальным выбором для элементов, где текст часто обновляется: счетчики FPS, таймеры, количество монет или здоровья. В исходном примере мы создаем семь таких объектов, чтобы продемонстрировать их основные свойства.
Перед использованием необходимо загрузить сам шрифт. Это делается в методе preload() с помощью this.load.bitmapFont().
this.load.bitmapFont('desyrel', 'assets/fonts/bitmap/desyrel.png', 'assets/fonts/bitmap/desyrel.xml');
Создание и базовое позиционирование
Объект создается с помощью фабричного метода this.add.dynamicBitmapText(). В метод передаются координаты X и Y, ключ загруженного шрифта, начальная текстовая строка и размер шрифта.
this.test1 = this.add.dynamicBitmapText(400, 50, 'desyrel', 'PHASER 3', 32);
Важнейший метод для управления позицией — .setOrigin(). Он устанавливает точку привязки (origin) объекта. По умолчанию она равна (0, 0) — левому верхнему углу текста. Изменяя origin, вы меняете точку, относительно которой рассчитываются координаты, масштаб и поворот.
// Текст будет центрирован относительно точки (400, 150)
this.test2.setOrigin(0.5);
// Текст будет выровнен по правому краю относительно точки (400, 150)
this.test2.setOrigin(1, 0.5);
В примере test1, test2 и test3 наглядно показывают разницу в позиционировании при разных значениях origin.
Визуальные трансформации: масштаб, поворот и прозрачность
Как и любой игровой объект в Phaser, DynamicBitmapText поддерживает стандартные трансформации.
Метод .setScale() позволяет увеличить или уменьшить текст. В примере test4 текст увеличен в два раза.
this.test4.setScale(2);
Поворот задается через свойство .rotation. В методе update() примера значение rotation для test5 постоянно увеличивается, создавая анимацию вращения.
// В create()
this.test5 = this.add.dynamicBitmapText(400, 350, 'desyrel', 'PHASER 3', 32).setOrigin(0.5);
// В update()
this.test5.rotation += 0.01;
Прозрачность регулируется методом .setAlpha(), где 1 — полностью непрозрачный, 0 — полностью прозрачный. Объект test6 имеет полупрозрачность.
this.test6.setAlpha(0.5);
Расширенные эффекты: режимы наложения (Blend Modes)
Phaser позволяет применять к объектам различные режимы наложения пикселей (blend modes), которые определяют, как цвет объекта смешивается с цветом фона или объектов под ним.
Установить режим можно с помощью метода .setBlendMode(). В примере для test7 используется режим с кодом `1, который соответствуетPhaser.BlendModes.ADD` (аддитивное наложение). Этот режим часто используется для создания эффектов свечения или света.
this.test7.setBlendMode(1);
Номер режима — это числовое значение из перечисления Phaser.BlendModes. Использование режимов наложения — простой способ добавить визуальной сложности тексту без использования шейдеров.
Что попробовать дальше
DynamicBitmapText в Phaser — это гибкий и производительный способ работы с динамическим текстом в играх. Вы научились создавать такие объекты, управлять их точкой привязки для точного позиционирования, применять трансформации и визуальные эффекты.
Для экспериментов попробуйте: анимировать свойство scale для эффекта пульсации, менять текст test1.text в update() в зависимости от игровых событий, или комбинировать несколько эффектов (прозрачность + поворот) на одном объекте. Это откроет путь к созданию живой и отзывчивой текстовой части вашего игрового интерфейса.
