Phaser предоставляет мощный инструмент для работы с произвольными данными на игровых объектах — 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) Меняет логическое значение на
противоположное: true → false и наоборот.
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 позволяет отслеживать изменения данных через события, что особенно удобно для реактивного обновления UI или поведения объекта. Основные события:
sprite.data.on('changedata-health', function(parent, value, previous) {
console.log(`Здоровье изменилось с ${previous} на ${value}`);
});
sprite.setData('health', 80); // триггер события
Аргументы обработчика:
DataManager идеально подходит для хранения состояния, параметров и метаданных игровых объектов без загрязнения основного объекта свойствами. Примеры использования:
isActive,
isInvincible, hasKey.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);
});
getAll()
возвращает все данные в виде объекта, удобного для сохранения состояния
игры.DataManager является важным инструментом Phaser, позволяющим легко расширять объекты дополнительными свойствами, управлять состоянием и создавать более сложную и динамичную игровую логику без излишнего усложнения структуры кода.