О чем этот пример
Хранение пользовательских данных — например, уровня предмета, его стоимости или владельца — прямо в игровом объекте, а не во внешних переменных, делает код чище и логичнее. В Phaser для этого есть встроенная система Data Manager. В этой статье мы разберем, как активировать её для любого спрайта, текста или другого игрового объекта, чтобы привязывать к нему произвольные данные и легко извлекать их для отображения или игровой логики.
Версия 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('gem', 'assets/sprites/gem.png');
}
create ()
{
var gem = this.add.image(300, 300, 'gem');
// Store some data about this Gem:
gem.setDataEnabled();
gem.data.set('name', 'Red Gem Stone');
gem.data.set('level', 2);
gem.data.set('gold', 150);
gem.data.set('owner', 'Link');
// Display it
const text = this.add.text(350, 250, '', { font: '16px Courier', fill: '#00ff00' });
text.setText([
'Name: ' + gem.data.get('name'),
'Level: ' + gem.data.get('level'),
'Value: ' + gem.data.get('gold') + ' gold',
'Owner: ' + gem.data.get('owner')
]);
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Что такое Data Manager и зачем он нужен
Data Manager — это встроенный в Phaser компонент, который позволяет хранить произвольные пары «ключ-значение» внутри игровых объектов. Вместо того чтобы создавать отдельные переменные или сложные структуры для отслеживания характеристик предмета (например, gemLevel, gemGold), вы можете «привязать» эти данные непосредственно к самому объекту gem.
Это делает код более модульным и безопасным: данные живут и умирают вместе с объектом, их проще сериализовать для сохранения игры, и они не засоряют глобальную область видимости.
Активация Data Manager для объекта
Перед тем как начать записывать данные, нужно активировать систему Data Manager для конкретного объекта. Это делается с помощью метода setDataEnabled(). В нашем примере это спрайт драгоценного камня.
gem.setDataEnabled();
После этого вызова у объекта gem появляется свойство data, через которое осуществляется вся дальнейшая работа.
Запись данных: метод `set`
Для записи данных используется метод set() у свойства data объекта. Он принимает два аргумента: ключ (название свойства, строка) и значение. Значением может быть что угодно: число, строка, объект или массив.
gem.data.set('name', 'Red Gem Stone');
gem.data.set('level', 2);
gem.data.set('gold', 150);
gem.data.set('owner', 'Link');
В этом блоке мы сохраняем имя, уровень, стоимость в золоте и имя владельца для нашего камня. Каждая пара сохраняется независимо.
Чтение данных: метод `get`
Чтобы получить сохраненное значение, используется метод get() с указанием нужного ключа. Если по такому ключу ничего не сохранено, метод вернет undefined.
let gemName = gem.data.get('name'); // 'Red Gem Stone'
let gemValue = gem.data.get('gold'); // 150
В исходном примере значения извлекаются напрямую внутри вызова setText() для формирования строки вывода на экран.
Практическое применение: отображение данных
Чаще всего сохраненные данные нужно куда-то вывести — в интерфейс, консоль или использовать в условной логике. В примере данные извлекаются и форматируются в массив строк, который передается в текстовый объект.
const text = this.add.text(350, 250, '', { font: '16px Courier', fill: '#00ff00' });
text.setText([
'Name: ' + gem.data.get('name'),
'Level: ' + gem.data.get('level'),
'Value: ' + gem.data.get('gold') + ' gold',
'Owner: ' + gem.data.get('owner')
]);
Это наглядный способ показать, что данные действительно сохранены и могут быть легко получены.
Что попробовать дальше
Data Manager — это простой и мощный инструмент для связывания данных с игровыми объектами в Phaser. Он отлично подходит для хранения характеристик предметов, статусов персонажей или любой другой динамической информации. Для экспериментов попробуйте: изменить данные в реальном времени по клику мыши, использовать объекты или массивы в качестве значений, или организовать поиск всех объектов на сцене с определенным значением в их data.
