О чем этот пример
BitmapText — это отличный способ использовать стильные растровые шрифты в вашей игре без потери производительности. В этом примере мы покажем, как не только анимировать вращение такого текста, но и динамически менять его содержимое по клику. Этот подход полезен для создания интерактивных меню, титров или любых элементов интерфейса, где текст должен быть эффектным и отзывчивым.
Версия 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 ()
{
let i = 0;
const films = [ 'Aliens', 'Terminator', 'Star Wars', 'The Thing', 'Red Dawn', 'Commando', 'Terminator 2', 'Robocop', 'Batman', 'Street Fighter', 'Back to the Future' ];
const text = this.add.bitmapText(400, 300, 'ice', films[i], 96).setOrigin(0.5);
this.tweens.add({
targets: text,
duration: 2000,
angle: 360,
ease: 'Quad.easeInOut',
repeat: -1,
yoyo: true
});
this.input.on('pointerdown', function () {
i++;
if (i === films.length)
{
i = 0;
}
text.setText(films[i]);
});
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Загрузка растрового шрифта
Первый шаг — загрузить растровый шрифт (Bitmap Font). Он состоит из двух файлов: изображения (.png) с глифами и файла описания (.xml), который определяет положение каждого символа на этом изображении.
В методе preload мы используем this.load.bitmapFont. Первый аргумент — это ключ ('ice'), по которому мы будем обращаться к шрифту в коде. Остальные аргументы — пути к файлам. Метод setBaseURL задаёт базовый URL, чтобы не писать полные пути к ресурсам.
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 мы создаём объект BitmapText. Первые два аргумента — координаты X и Y. Третий аргумент — ключ загруженного шрифта. Четвёртый — начальная строка текста, которую мы берём из массива films. Пятый — размер шрифта. Метод setOrigin(0.5) центрирует точку вращения текста.
Затем мы создаём анимацию (твин) с помощью this.tweens.add. Целью (targets) является наш текстовый объект. Мы задаём анимацию непрерывного вращения на 360 градусов с плавным замедлением и повторением. Параметр yoyo: true заставляет анимацию проигрываться в обратном порядке после завершения, создавая колебательный эффект.
const text = this.add.bitmapText(400, 300, 'ice', films[i], 96).setOrigin(0.5);
this.tweens.add({
targets: text,
duration: 2000,
angle: 360,
ease: 'Quad.easeInOut',
repeat: -1,
yoyo: true
});
Динамическая смена текста по клику
Чтобы сделать текст интерактивным, мы добавляем обработчик события клика (pointerdown) на всю игровую область. При каждом клике увеличивается индекс `i`, который указывает на текущее название фильма в массиве. Если индекс достигает длины массива, он сбрасывается в ноль.
Ключевой метод для обновления содержимого BitmapText — setText(). Мы передаём ему новую строку из массива. Важно: сам объект текста и его анимация (в данном случае вращение) не пересоздаются, а просто обновляется его видимое содержимое. Это эффективно с точки зрения производительности.
this.input.on('pointerdown', function () {
i++;
if (i === films.length)
{
i = 0;
}
text.setText(films[i]);
});
Настройка игры (конфигурация)
Конфигурационный объект config определяет основные параметры игры. Важно указать наш класс сцены (Example) в свойстве scene. Это позволяет Phaser создать экземпляр нашей сцены при запуске.
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Что попробовать дальше
Вы узнали, как создать анимированный и интерактивный BitmapText в Phaser 3. Сочетание твинов для плавной анимации и обработки ввода для реакции на действия игрока — мощный паттерн для разработки UI. Для экспериментов попробуйте изменить параметры твина (например, duration или ease), добавить анимацию масштабирования вместе с вращением или менять цвет текста (setTint) при клике.
