ecsy
Version:
Entity Component System in JS
69 lines (54 loc) • 1.66 kB
JavaScript
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];
}
}