О чем этот пример
Использование HTML и CSS внутри игрового движка открывает новые возможности для создания интерфейсов, меню и визуальных эффектов. Phaser 3 предоставляет встроенную систему DOM-элементов, которая позволяет позиционировать, анимировать и взаимодействовать с обычными HTML-тегами прямо на игровом холсте. Эта статья на практическом примере покажет, как создавать и анимировать DOM-объекты, расширяя арсенал инструментов для разработки игр.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('einstein', 'assets/pics/ra-einstein.png');
}
create ()
{
const element = this.add.dom(400, 300, 'div', 'background-color: rgba(255, 255, 0, 0.5); width: 300px; height: 200px; font: 48px Arial; font-weight: bold', 'Phaser 3');
element.setOrigin(0);
const marker = this.add.rectangle(400, 300, 16, 16, 0xff00ff);
this.tweens.add({
targets: element,
duration: 3000,
angle: 360,
scaleX: 2,
scaleY: 2,
ease: 'Sine.easeInOut',
loop: -1,
yoyo: true
});
}
}
const config = {
type: Phaser.AUTO,
scale: {
_mode: Phaser.Scale.FIT,
parent: 'phaser-example',
width: 800,
height: 600
},
dom: {
createContainer: true
},
scene: Example
};
const game = new Phaser.Game(config);
Подготовка и загрузка ресурсов
Класс сцены Example наследуется от Phaser.Scene. В методе preload задается базовый URL для загрузки ресурсов и загружается одно изображение. Обратите внимание, что для работы с DOM-элементами загрузка дополнительных игровых ресурсов не требуется.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('einstein', 'assets/pics/ra-einstein.png');
}
Создание и настройка DOM-элемента
В методе create создается основной объект — DOM-элемент. Метод this.add.dom принимает координаты X и Y, имя тега, строку стилей CSS и текстовое содержимое. В данном случае создается div с полупрозрачным желтым фоном, фиксированными размерами и текстом 'Phaser 3'.
const element = this.add.dom(400, 300, 'div', 'background-color: rgba(255, 255, 0, 0.5); width: 300px; height: 200px; font: 48px Arial; font-weight: bold', 'Phaser 3');
Следующей строкой точка привязки элемента (origin) смещается в его левый верхний угол с помощью element.setOrigin(0). Это важно для корректной анимации, так как по умолчанию привязка находится в центре. Для визуализации исходной точки создается небольшой прямоугольник-маркер.
element.setOrigin(0);
const marker = this.add.rectangle(400, 300, 16, 16, 0xff00ff);
Анимация с помощью системы Tween
Phaser 3 предоставляет мощную систему анимации Tweens. В примере создается твин, который воздействует на созданный DOM-элемент. Анимация длится 3 секунды, непрерывно зациклена (loop: -1) и имеет эффект 'йо-йо' (возврат к начальному состоянию).
this.tweens.add({
targets: element,
duration: 3000,
angle: 360,
scaleX: 2,
scaleY: 2,
ease: 'Sine.easeInOut',
loop: -1,
yoyo: true
});
Элемент будет плавно вращаться на 360 градусов и увеличиваться в два раза по обеим осям, используя плавную функцию Sine.easeInOut. Обратите внимание, что DOM-элементы поддерживают те же свойства трансформации, что и обычные игровые объекты.
Конфигурация игры: включение DOM-контейнера
Ключевой момент для работы с DOM — правильная настройка конфигурации игры. В объекте config должен быть включен модуль dom с параметром createContainer: true. Phaser создаст отдельный контейнер для DOM-элементов поверх основного canvas.
const config = {
type: Phaser.AUTO,
scale: {
_mode: Phaser.Scale.FIT,
parent: 'phaser-example',
width: 800,
height: 600
},
dom: {
createContainer: true
},
scene: Example
};
Также в конфигурации используется масштабирование Phaser.Scale.FIT для адаптации под размер родительского элемента с сохранением пропорций.
Что попробовать дальше
DOM-элементы в Phaser 3 — это мост между игровым миром и веб-технологиями. Они идеально подходят для создания сложных UI, текстовых блоков или интерактивных форм. Для экспериментов попробуйте добавить обработчики событий (element.addListener), вложить в элемент сложную HTML-разметку или анимировать CSS-свойства, такие как opacity и color. Это откроет путь к созданию гибридных приложений, сочетающих динамику игры и гибкость веб-интерфейсов.
