UNPKG

@pixi/core

Version:
87 lines (86 loc) 3.01 kB
import { Runner } from "@pixi/runner"; import { EventEmitter } from "@pixi/utils"; class SystemManager extends EventEmitter { constructor() { super(...arguments), this.runners = {}, this._systemsHash = {}; } /** * Set up a system with a collection of SystemClasses and runners. * Systems are attached dynamically to this class when added. * @param config - the config for the system manager */ setup(config) { this.addRunners(...config.runners); const priority = (config.priority ?? []).filter((key) => config.systems[key]), orderByPriority = [ ...priority, ...Object.keys(config.systems).filter((key) => !priority.includes(key)) ]; for (const i of orderByPriority) this.addSystem(config.systems[i], i); } /** * Create a bunch of runners based of a collection of ids * @param runnerIds - the runner ids to add */ addRunners(...runnerIds) { runnerIds.forEach((runnerId) => { this.runners[runnerId] = new Runner(runnerId); }); } /** * Add a new system to the renderer. * @param ClassRef - Class reference * @param name - Property name for system, if not specified * will use a static `name` property on the class itself. This * name will be assigned as s property on the Renderer so make * sure it doesn't collide with properties on Renderer. * @returns Return instance of renderer */ addSystem(ClassRef, name) { const system = new ClassRef(this); if (this[name]) throw new Error(`Whoops! The name "${name}" is already in use`); this[name] = system, this._systemsHash[name] = system; for (const i in this.runners) this.runners[i].add(system); return this; } /** * A function that will run a runner and call the runners function but pass in different options * to each system based on there name. * * E.g. If you have two systems added called `systemA` and `systemB` you could call do the following: * * ```js * system.emitWithCustomOptions(init, { * systemA: {...optionsForA}, * systemB: {...optionsForB}, * }); * ``` * * `init` would be called on system A passing `optionsForA` and on system B passing `optionsForB`. * @param runner - the runner to target * @param options - key value options for each system */ emitWithCustomOptions(runner, options) { const systemHashKeys = Object.keys(this._systemsHash); runner.items.forEach((system) => { const systemName = systemHashKeys.find((systemId) => this._systemsHash[systemId] === system); system[runner.name](options[systemName]); }); } /** destroy the all runners and systems. Its apps job to */ destroy() { Object.values(this.runners).forEach((runner) => { runner.destroy(); }), this._systemsHash = {}; } // TODO implement! // removeSystem(ClassRef: ISystemConstructor, name: string): void // { // } } export { SystemManager }; //# sourceMappingURL=SystemManager.mjs.map