О чем этот пример
Статичный текст в игре может выглядеть скучно. Используя возможности `BitmapText` и систему твинов Phaser, вы можете легко добавить динамичные эффекты масштабирования, которые привлекут внимание игрока к важным сообщениям, названиям или интерфейсным элементам. В этой статье мы разберем, как создать анимацию, независимо изменяющую масштаб текста по осям X и Y, что позволит добиться эффектов "пульсации", "растяжения" или "дыхания" текста.
Версия 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(100, 100, 'ice', 'Terminator', 32);
this.tweens.add({
targets: text,
duration: 4000,
scaleX: 4,
ease: 'Quad.easeInOut',
repeat: -1,
yoyo: true
});
this.tweens.add({
targets: text,
duration: 3000,
scaleY: 8,
ease: 'Cubic.easeInOut',
repeat: -1,
yoyo: true
});
}
}
const config = {
type: Phaser.WEBGL,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Загрузка растрового шрифта
Перед созданием текстового объекта необходимо загрузить растровый (bitmap) шрифт. Это специальный формат шрифта, где каждый символ — это изображение. Он обеспечивает чёткое и быстрое отображение текста, особенно для нестандартных стилизованных шрифтов, которые используются в играх.
В методе preload() мы указываем базовый URL для загрузки ресурсов и загружаем шрифт с ключом 'ice'. Для этого используется метод this.load.bitmapFont(), который принимает ключ, путь к изображению (PNG) и путь к файлу описания (XML).
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. Метод this.add.bitmapText() принимает координаты X и Y, ключ загруженного шрифта, строку текста и исходный размер шрифта.
Далее мы создаем два независимых твина для анимации свойств scaleX и scaleY этого текстового объекта. Твин — это анимация изменения какого-либо свойства объекта с течением времени. Оба твина нацелены (targets) на один и тот же объект text.
const text = this.add.bitmapText(100, 100, 'ice', 'Terminator', 32);
Анимация масштаба по оси X
Первый твин управляет горизонтальным масштабом. Он увеличивает свойство scaleX (масштаб по оси X) до значения 4 за 4 секунды (4000 мс). Используется функция плавности (ease) 'Quad.easeInOut', которая обеспечивает плавное ускорение в начале и замедление в конце анимации. Параметры repeat: -1 и yoyo: true заставляют анимацию повторяться бесконечно, при этом после достижения конечного значения она проигрывается в обратном порядке (от 4 обратно к 1).
this.tweens.add({
targets: text,
duration: 4000,
scaleX: 4,
ease: 'Quad.easeInOut',
repeat: -1,
yoyo: true
});
Анимация масштаба по оси Y
Второй твин работает аналогично, но анимирует вертикальный масштаб (scaleY). Он установлен на увеличение до значения 8 за 3 секунды (3000 мс) с другой функцией плавности 'Cubic.easeInOut'. Разная длительность и разные целевые значения масштаба для осей X и Y создают сложный, несимметричный визуальный эффект, когда текст постоянно меняет свою форму.
Важно, что твины работают независимо друг от друга, накладывая свои эффекты на один объект.
this.tweens.add({
targets: text,
duration: 3000,
scaleY: 8,
ease: 'Cubic.easeInOut',
repeat: -1,
yoyo: true
});
Что попробовать дальше
Комбинируя независимые твины для свойств scaleX и scaleY объекта BitmapText, вы можете создавать живые и привлекающие внимание текстовые анимации для вашей игры. Для экспериментов попробуйте: изменить значения scaleX и scaleY на меньше 1 (для эффекта сжатия), использовать разные функции плавности (ease) из документации Phaser, добавить твин для свойства angle для вращения текста или анимировать цвет текста через свойство tint.
