О чем этот пример

Хранение пользовательских данных — например, уровня предмета, его стоимости или владельца — прямо в игровом объекте, а не во внешних переменных, делает код чище и логичнее. В 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.