DataManager: хранение произвольных данных на объекте

Phaser предоставляет мощный инструмент для работы с произвольными данными на игровых объектах — DataManager. Он позволяет хранить, изменять и получать значения, привязанные к конкретному объекту, будь то спрайт, сцена или группа объектов. DataManager упрощает управление состоянием объектов и обеспечивает централизованное хранение информации без необходимости создавать отдельные структуры данных вручную.

Инициализация DataManager

Любой объект в Phaser, поддерживающий DataManager, имеет свойство data, которое автоматически создается при инициализации объекта. Для кастомных объектов можно подключить DataManager через конструктор:

const sprite = this.add.sprite(100, 100, 'player');
sprite.setData('health', 100);
sprite.setData('mana', 50);

В этом примере объект sprite получает два произвольных свойства: health и mana. Метод setData принимает ключ и значение, автоматически создавая внутреннюю запись.

Методы для работы с данными

1. setData(key, value) Добавляет или обновляет значение по указанному ключу.

2. getData(key) Возвращает значение по ключу, если оно существует.

let health = sprite.getData('health'); // 100

3. incData(key, amount) Увеличивает числовое значение по ключу на указанную величину. Если ключ не существует, будет создан с начальным значением amount.

sprite.incData('health', -10); // уменьшение здоровья на 10

4. toggleData(key) Меняет логическое значение на противоположное: truefalse и наоборот.

sprite.setData('isActive', true);
sprite.toggleData('isActive'); // false

5. removeData(key) Удаляет ключ с данными, если он существует.

sprite.removeData('mana');

6. getAll() Возвращает объект со всеми данными, хранящимися на объекте. Полезно для сериализации состояния объекта.

console.log(sprite.data.getAll());
// { health: 90, isActive: false }

События DataManager

DataManager позволяет отслеживать изменения данных через события, что особенно удобно для реактивного обновления UI или поведения объекта. Основные события:

  • ‘changedata’ — вызывается при изменении любого ключа.
  • ‘changedata-key’ — вызывается при изменении конкретного ключа.
sprite.data.on('changedata-health', function(parent, value, previous) {
    console.log(`Здоровье изменилось с ${previous} на ${value}`);
});
sprite.setData('health', 80); // триггер события

Аргументы обработчика:

  1. parent — объект, к которому привязан DataManager.
  2. value — новое значение ключа.
  3. previous — предыдущее значение ключа.

Использование DataManager для логики игры

DataManager идеально подходит для хранения состояния, параметров и метаданных игровых объектов без загрязнения основного объекта свойствами. Примеры использования:

  • Хранение характеристик персонажей: здоровье, энергия, броня, очки опыта.
  • Отслеживание состояний: isActive, isInvincible, hasKey.
  • Настройки объектов: скорость движения, урон оружия, режим поведения AI.
sprite.setData({
    speed: 200,
    damage: 25,
    isAlive: true
});

sprite.data.on('changedata-isAlive', (obj, value) => {
    if (!value) {
        obj.setVisible(false);
    }
});

Групповая работа с данными

DataManager не ограничен отдельными объектами. Можно массово управлять данными через массивы объектов или группы. Например, уменьшение здоровья всех врагов на сцене:

enemies.getChildren().forEach(enemy => {
    enemy.data.incData('health', -10);
});

Преимущества использования DataManager

  • Централизованное хранение данных: нет необходимости создавать дополнительные свойства на объекте.
  • Событийная модель: позволяет реагировать на изменения данных автоматически.
  • Поддержка сериализации: getAll() возвращает все данные в виде объекта, удобного для сохранения состояния игры.
  • Гибкость и масштабируемость: одинаково подходит как для отдельных объектов, так и для массивов/групп.

Советы по эффективному использованию

  • Использовать DataManager для динамических свойств, которые могут изменяться в процессе игры.
  • Не хранить тяжелые объекты или ссылки на сцены, чтобы избежать утечек памяти.
  • Комбинировать с событиями для реактивного поведения объектов, особенно при разработке UI и игровых эффектов.

DataManager является важным инструментом Phaser, позволяющим легко расширять объекты дополнительными свойствами, управлять состоянием и создавать более сложную и динамичную игровую логику без излишнего усложнения структуры кода.