ecsy
Version:
Entity Component System in JS
71 lines (54 loc) • 1.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ComponentManager = void 0;
var _ObjectPool = require("./ObjectPool.js");
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.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];
}
}
exports.ComponentManager = ComponentManager;