UNPKG

ecsy

Version:
69 lines (54 loc) 1.66 kB
import { ObjectPool } from "./ObjectPool.js"; export class ComponentManager { constructor() { this.Components = []; this._ComponentsMap = {}; this._componentPool = {}; this.numComponents = {}; this.nextComponentId = 0; } hasComponent(Component) { return this.Components.indexOf(Component) !== -1; } registerComponent(Component, objectPool) { if (this.Components.indexOf(Component) !== -1) { console.warn( `Component type: '${Component.getName()}' already registered.` ); return; } const schema = Component.schema; if (!schema) { throw new Error( `Component "${Component.getName()}" has no schema property.` ); } for (const propName in schema) { const prop = schema[propName]; if (!prop.type) { throw new Error( `Invalid schema for component "${Component.getName()}". Missing type for "${propName}" property.` ); } } Component._typeId = this.nextComponentId++; this.Components.push(Component); this._ComponentsMap[Component._typeId] = Component; this.numComponents[Component._typeId] = 0; if (objectPool === undefined) { objectPool = new ObjectPool(Component); } else if (objectPool === false) { objectPool = undefined; } this._componentPool[Component._typeId] = objectPool; } componentAddedToEntity(Component) { this.numComponents[Component._typeId]++; } componentRemovedFromEntity(Component) { this.numComponents[Component._typeId]--; } getComponentsPool(Component) { return this._componentPool[Component._typeId]; } }