Система событий: pc.EventHandler, on, off, fire

Введение в систему событий

Система событий в PlayCanvas играет важную роль в организации взаимодействия между объектами и компонентами в приложении. С помощью этой системы можно удобно отслеживать и обрабатывать различные события, такие как клики, перемещения, изменения состояний и многое другое. В PlayCanvas используется объект pc.EventHandler, который предоставляет функциональность для регистрации, обработки и удаления событий.

pc.EventHandler

pc.EventHandler — это основной класс для работы с событиями. Он реализует методы для привязки и отвязывания обработчиков событий, а также для их активации. Каждый объект, который должен участвовать в обработке событий, может наследовать этот класс, получая доступ ко всем его возможностям.

Важной особенностью является то, что pc.EventHandler использует систему событий с подписками, где каждый обработчик события выполняется в момент возникновения события. Это позволяет создавать гибкую и масштабируемую архитектуру, при которой можно обрабатывать различные события на разных уровнях приложения.

Регистрация событий с помощью on

Метод on используется для регистрации обработчиков событий на объекте. Этот метод принимает два основных аргумента: название события и саму функцию-обработчик.

entity.on('click', function() {
    console.log('Entity clicked');
});

В примере выше обработчик будет вызываться каждый раз, когда событие click будет вызвано на объекте entity. Первый аргумент метода — это строка, указывающая название события, которое будет обрабатываться. Второй аргумент — это функция, которая будет выполнена в ответ на это событие.

Важной особенностью метода on является возможность подписки на несколько обработчиков одного события:

entity.on('click', function() {
    console.log('Click handler 1');
});

entity.on('click', function() {
    console.log('Click handler 2');
});

В таком случае оба обработчика будут вызваны при наступлении события.

Отписка от событий с помощью off

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

var handler = function() {
    console.log('This handler will be removed');
};

// Регистрация обработчика
entity.on('click', handler);

// Удаление обработчика
entity.off('click', handler);

Если необходимо удалить все обработчики для определённого события, можно вызвать off без указания обработчика:

entity.off('click');

Это приведет к удалению всех обработчиков, привязанных к событию click.

Вызов события с помощью fire

Метод fire позволяет вручную инициировать событие, вызывая все зарегистрированные обработчики для этого события. Это полезно, если нужно выполнить действие в ответ на некоторую логику программы, а не на действия пользователя.

entity.fire('click');

В примере выше все обработчики, зарегистрированные на событие click для объекта entity, будут выполнены. Метод fire также может передавать дополнительные аргументы, которые будут доступны в обработчике:

entity.on('update', function(data) {
    console.log('Update event fired with data:', data);
});

// Вызов события с передачей данных
entity.fire('update', { value: 42 });

Здесь в обработчик будет передан объект { value: 42 }, который можно использовать внутри функции.

Управление событиями с параметрами

Система событий PlayCanvas позволяет также использовать параметры при регистрации событий. Это особенно полезно, если требуется добавлять дополнительные данные или настраивать обработчики в зависимости от контекста.

entity.on('click', function(event, data) {
    console.log('Event data:', data);
});

// Вызов события с дополнительными данными
entity.fire('click', { x: 100, y: 200 });

При вызове события можно передавать любые объекты как параметры. Эти данные будут доступны в обработчике и могут быть использованы для более детальной обработки.

Пример использования

Рассмотрим пример использования системы событий в контексте обработки кликов и движений мыши.

var entity = new pc.Entity();

// Обработчик клика
entity.on('click', function() {
    console.log('Entity clicked');
});

// Обработчик движения мыши
entity.on('mousemove', function(event) {
    console.log('Mouse moved to:', event.x, event.y);
});

// Вызов событий
entity.fire('click');
entity.fire('mousemove', { x: 150, y: 250 });

В этом примере создается объект entity, на который регистрируются два события: click и mousemove. При вызове этих событий соответствующие обработчики выводят информацию в консоль.

Удаление всех событий

Чтобы полностью очистить все обработчики событий, можно использовать метод off без указания имени события:

entity.off();

Этот вызов удалит все обработчики для всех событий на объекте.

Сложные события

Система событий в PlayCanvas поддерживает более сложные сценарии, например, обработку событий с несколькими аргументами или синхронизацию действий между несколькими объектами. Это позволяет создавать более сложные взаимодействия между компонентами игры или приложения, где каждый объект может реагировать на события, происходящие в других частях системы.

var player = new pc.Entity();
var enemy = new pc.Entity();

// Регистрируем событие на объекте игрока
player.on('damage', function(damageAmount) {
    console.log('Player received damage:', damageAmount);
});

// Враг наносит урон игроку
enemy.fire('damage', 10);

В данном примере объект player слушает событие damage, и при его вызове выводится количество полученного урона.

Заключение

Система событий PlayCanvas на основе pc.EventHandler предоставляет мощные средства для обработки различных событий в приложении. Методы on, off и fire позволяют удобно управлять регистрацией, удалением и активацией событий, что является важным инструментом для создания динамичного взаимодействия в игровом процессе или других приложениях.