Phaser — мощная библиотека для разработки 2D-игр на JavaScript,
предоставляющая гибкую систему событий. Одним из ключевых инструментов
для управления динамическими объектами являются события изменения данных
(Data Events). Они позволяют реагировать на изменение
свойств объектов, централизовать логику и упрощать управление состоянием
игры.
В Phaser каждый игровой объект (GameObject) может иметь
собственный Data Manager, который хранит произвольные
пары ключ-значение. Эти данные можно использовать для отслеживания
состояния объекта, характеристик игрока, счетчиков и других
переменных.
const player = this.add.sprite(100, 100, 'player');
player.setData('health', 100);
Метод setData(key, value) не только изменяет значение,
но и вызывает соответствующие события, если значение ключа меняется.
Phaser предоставляет несколько встроенных событий для Data Manager:
changedata — срабатывает при любом
изменении данных объекта.changedata-<ключ> —
специализированное событие, которое срабатывает только при изменении
конкретного ключа.setdata — неформальное название для
отслеживания установки значения при первом присвоении (на практике
используется changedata).Пример использования:
player.on('changedata-health', (gameObject, value, previousValue) => {
console.log(`Здоровье изменилось с ${previousValue} на ${value}`);
});
В этом примере событие отслеживает только изменение ключа
health у объекта player. Это позволяет писать
узкоспециализированные обработчики для конкретных характеристик.
Для работы с данными объектов используются следующие методы:
getData(key) — получение текущего
значения по ключу.setData(key, value) — установка
значения ключа.incData(key, increment) — увеличение
числового значения на заданную величину.toggleData(key) — переключение
булевого значения между true и false.Пример:
player.incData('score', 10);
console.log(player.getData('score')); // 10
player.toggleData('alive');
console.log(player.getData('alive')); // false, если было true
Методы incData и toggleData также вызывают
соответствующие события changedata-<ключ>, что
позволяет строить реактивную логику игры.
События изменения данных особенно полезны для централизованного контроля логики:
Пример интеграции с интерфейсом:
const healthText = this.add.text(10, 10, '', { fontSize: '20px', fill: '#fff' });
player.on('changedata-health', (playerObj, value) => {
healthText.setText(`Health: ${value}`);
});
В этом примере текст на экране автоматически обновляется при каждом
изменении здоровья игрока, без необходимости постоянно проверять
состояние в update.
off:player.off('changedata-health');
Порядок срабатывания событий зависит от очереди
подписчиков. Phaser гарантирует последовательное вызов обработчиков,
добавленных методом on.
Объект события передает три аргумента: объект, новое значение, предыдущее значение. Это позволяет сравнивать состояния и реализовывать сложные зависимости.
Data Events применимы не только к отдельным объектам, но и к группам:
const enemies = this.add.group();
enemies.children.iterate(enemy => {
enemy.setData('alive', true);
enemy.on('changedata-alive', (obj, value) => {
if (!value) {
obj.destroy();
}
});
});
Каждое изменение свойства alive у врага автоматически
вызывает удаление объекта из сцены. Такой подход облегчает управление
большим количеством игровых объектов и снижает необходимость проверки
состояния в основном цикле update.
Использование системы событий данных превращает игру в реактивную структуру, где любые изменения состояния автоматически вызывают связанные действия. Это позволяет:
health,
score, alive) для упрощения отладки.changedata-<ключ> вместо глобального
changedata, если требуется оптимизация.События изменения данных в Phaser формируют фундамент для реактивной архитектуры игры, упрощая управление состояниями объектов и создавая чистую, поддерживаемую структуру кода.