@pixi/core
Version:
Core PixiJS
85 lines (84 loc) • 3.04 kB
JavaScript
var runner = require("@pixi/runner"), utils = require("@pixi/utils");
class SystemManager extends utils.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.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(runner2, options) {
const systemHashKeys = Object.keys(this._systemsHash);
runner2.items.forEach((system) => {
const systemName = systemHashKeys.find((systemId) => this._systemsHash[systemId] === system);
system[runner2.name](options[systemName]);
});
}
/** destroy the all runners and systems. Its apps job to */
destroy() {
Object.values(this.runners).forEach((runner2) => {
runner2.destroy();
}), this._systemsHash = {};
}
// TODO implement!
// removeSystem(ClassRef: ISystemConstructor, name: string): void
// {
// }
}
exports.SystemManager = SystemManager;
//# sourceMappingURL=SystemManager.js.map
;