О чем этот пример
Хранение игровых данных, локализаций или конфигураций во внешних текстовых файлах — стандартная практика. Phaser позволяет легко загружать такие файлы и отображать их содержимое прямо в игре, используя мощные возможности кэширования и систему DOM. Этот подход полезен для создания справочников, логов, диалоговых окон или отладки без переписывания кода.
Версия 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.image('logo', 'assets/sprites/phaser.png');
this.load.text('data', 'assets/loader-tests/test.txt');
}
create ()
{
this.add.image(8, 8, 'logo').setOrigin(0);
const data = this.cache.text.get('data');
this.add.dom(400, 300, 'div', 'background-color: rgba(0, 0, 80); width: 600px; height: 500px; font: 12px Courier; color: white; overflow: hidden', data);
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
dom: {
createContainer: true
},
scene: Example
};
const game = new Phaser.Game(config);
Загрузка ресурсов: текст и изображения
В методе preload мы настраиваем базовый URL для загрузки и указываем два ресурса: изображение и текстовый файл. Важно понимать, что Phaser автоматически кэширует загруженные данные, делая их доступными в любой момент времени.
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('logo', 'assets/sprites/phaser.png');
this.load.text('data', 'assets/loader-tests/test.txt');
Здесь setBaseURL задает общий путь для всех последующих загрузок. Метод load.image регистрирует спрайт с ключом 'logo', а load.text — текстовый файл с ключом 'data'. После выполнения preload содержимое файла test.txt будет храниться в текстовом кэше под этим ключом.
Извлечение данных из кэша
В методе create, который выполняется после успешной загрузки всех ресурсов, мы можем получить доступ к сохраненным данным. Для этого используется менеджер кэша.
const data = this.cache.text.get('data');
Вызов this.cache.text.get('data') возвращает строку — всё содержимое загруженного файла. Эта строка хранится в переменной data для дальнейшего использования. Такой подход позволяет отделять данные от логики игры, что упрощает их обновление.
Отображение текста с помощью DOM-элемента
Phaser интегрирует DOM-элементы в игровой мир. Чтобы отобразить наш текст, мы создаем стилизованный div и помещаем в него полученное содержимое.
this.add.dom(400, 300, 'div', 'background-color: rgba(0, 0, 80); width: 600px; height: 500px; font: 12px Courier; color: white; overflow: hidden', data);
Метод this.add.dom создает новый DOM-элемент. Его параметры:
1. **400, 300** — координаты X и Y элемента в игровом мире.
2. **'div'** — тип создаваемого HTML-элемента.
3. **Строка стилей** — задает фон, размеры, шрифт, цвет и скрывает переполнение.
4. **data** — строка, которая становится внутренним содержимым (innerHTML) этого div. Это и есть текст из нашего файла.
Для работы DOM-элементов в конфигурации игры должна быть включена соответствующая опция.
Конфигурация игры: включаем поддержку DOM
Чтобы методы, связанные с DOM (например, add.dom), работали корректно, необходимо явно указать это в настройках игры при её создании.
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
dom: {
createContainer: true
},
scene: Example
};
Ключевой момент — объект dom с параметром createContainer: true. Это говорит Phaser создать специальный контейнер для DOM-элементов и интегрировать его в рендерер. Без этой настройки вызов add.dom приведет к ошибке.
Что попробовать дальше
Использование текстовых файлов для хранения данных и их отображение через DOM — это гибкий и мощный паттерн в Phaser 3. Он отлично подходит для интерфейсов, не требующих сложной игровой графики. Для экспериментов попробуйте: загрузить JSON-файл и парсить его для динамического создания контента; использовать разные стили CSS для DOM-элементов; или анимировать положение и прозрачность DOM-объекта с помощью Tween.
