ecsy
Version:
Entity Component System in JS
83 lines (74 loc) • 2.08 kB
JavaScript
/**
* @private
* @class EventDispatcher
*/
export default class EventDispatcher {
constructor() {
this._listeners = {};
this.stats = {
fired: 0,
handled: 0,
};
}
/**
* Add an event listener
* @param {String} eventName Name of the event to listen
* @param {Function} listener Callback to trigger when the event is fired
*/
addEventListener(eventName, listener) {
let listeners = this._listeners;
if (listeners[eventName] === undefined) {
listeners[eventName] = [];
}
if (listeners[eventName].indexOf(listener) === -1) {
listeners[eventName].push(listener);
}
}
/**
* Check if an event listener is already added to the list of listeners
* @param {String} eventName Name of the event to check
* @param {Function} listener Callback for the specified event
*/
hasEventListener(eventName, listener) {
return (
this._listeners[eventName] !== undefined &&
this._listeners[eventName].indexOf(listener) !== -1
);
}
/**
* Remove an event listener
* @param {String} eventName Name of the event to remove
* @param {Function} listener Callback for the specified event
*/
removeEventListener(eventName, listener) {
var listenerArray = this._listeners[eventName];
if (listenerArray !== undefined) {
var index = listenerArray.indexOf(listener);
if (index !== -1) {
listenerArray.splice(index, 1);
}
}
}
/**
* Dispatch an event
* @param {String} eventName Name of the event to dispatch
* @param {Entity} entity (Optional) Entity to emit
* @param {Component} component
*/
dispatchEvent(eventName, entity, component) {
this.stats.fired++;
var listenerArray = this._listeners[eventName];
if (listenerArray !== undefined) {
var array = listenerArray.slice(0);
for (var i = 0; i < array.length; i++) {
array[i].call(this, entity, component);
}
}
}
/**
* Reset stats counters
*/
resetCounters() {
this.stats.fired = this.stats.handled = 0;
}
}