UNPKG

phaser4-rex-plugins

Version:
199 lines (166 loc) 4.84 kB
import EventEmitterMethods from '../../utils/eventemitter/EventEmitterMethods.js'; import GetValue from '../../utils/object/GetValue.js'; class StateManagerBase { constructor(config) { this._states = {}; this._stateLock = false; this.enable = true; this._start = undefined; this._state = undefined; this._prevState = undefined; // Event emitter var eventEmitter = GetValue(config, 'eventEmitter', undefined); var EventEmitterClass = GetValue(config, 'EventEmitterClass', undefined); this.setEventEmitter(eventEmitter, EventEmitterClass); } shutdown() { this.destroyEventEmitter(); } destroy() { this.shutdown(); } toJSON() { return { curState: this.state, prevState: this.prevState, enable: this.enable, start: this._start }; } setEnable(e) { if (e === undefined) { e = true; } this.enable = e; return this; } toggleEnable() { this.setEnable(!this.enable); return this; } getState(name) { return this._states[name]; } addState(name, state) { if (typeof (name) !== 'string') { state = name; name = state.name; } this._states[name] = state; return this; } addStates(states) { if (Array.isArray(states)) { for (var i = 0, cnt = states.length; i < cnt; i++) { this.addState(states[i]); } } else { for (var name in states) { this.addState(name, states[name]); } } return this; } removeState(name) { if (this._states.hasOwnProperty(name)) { delete this._states[name]; } return this; } removeAllStates() { for (var name in this._states) { delete this._states[name]; } return this; } set state(newState) { if (!this.enable || this._stateLock) { return; } if (this._state === newState) { return; } this._prevState = this._state; this._state = newState; this._stateLock = true; // Lock state this.emit('statechange', this); if (this._prevState != null) { var state = this.getState(this._prevState); if (state && state.exit) { state.exit(this); } this.emit(`exit_${this._prevState}`, this); } this._stateLock = false; if (this._state != null) { var state = this.getState(this._state); if (state && state.enter) { state.enter(this); } this.emit(`enter_${this._state}`, this); } } get state() { return this._state; } get prevState() { return this._prevState; } get stateList() { return Object.keys(this._states); } start(state) { this._start = state; this._prevState = undefined; this._state = state; // Won't fire statechange events return this; } goto(nextState) { if (nextState != null) { this.state = nextState; } return this; } next() { var state = this.getState(this.state); if (!state || !state.next) { return this; } var nextState; if (typeof (state.next) === 'string') { nextState = state.next; } else { nextState = state.next(this); } this.goto(nextState); return this; } runMethod(methodName, a1, a2, a3, a4, a5) { var state = this.getState(this.state); if (!state) { return undefined; } var fn = state[methodName]; if (!fn) { return undefined; } // Copy from eventemitter3 var len = arguments.length; switch (len) { case 1: return fn(this); case 2: return fn(this, a1); case 3: return fn(this, a1, a2); case 4: return fn(this, a1, a2, a3); case 5: return fn(this, a1, a2, a3, a4); case 6: return fn(this, a1, a2, a3, a4, a5); } var args = Array.prototype.slice.call(arguments); args[0] = this; return fn.apply(undefined, args); } } Object.assign( StateManagerBase.prototype, EventEmitterMethods ); export default StateManagerBase;