ecsy
Version:
Entity Component System in JS
150 lines (108 loc) • 3.81 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Entity = void 0;
var _Query = _interopRequireDefault(require("./Query.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class Entity {
constructor(entityManager) {
this._entityManager = entityManager || null; // Unique ID for this entity
this.id = entityManager._nextEntityId++; // List of components types the entity has
this._ComponentTypes = []; // Instance of the components
this._components = {};
this._componentsToRemove = {}; // Queries where the entity is added
this.queries = []; // Used for deferred removal
this._ComponentTypesToRemove = [];
this.alive = false; //if there are state components on a entity, it can't be removed completely
this.numStateComponents = 0;
} // COMPONENTS
getComponent(Component, includeRemoved) {
var component = this._components[Component._typeId];
if (!component && includeRemoved === true) {
component = this._componentsToRemove[Component._typeId];
}
return component;
}
getRemovedComponent(Component) {
const component = this._componentsToRemove[Component._typeId];
return component;
}
getComponents() {
return this._components;
}
getComponentsToRemove() {
return this._componentsToRemove;
}
getComponentTypes() {
return this._ComponentTypes;
}
getMutableComponent(Component) {
var component = this._components[Component._typeId];
if (!component) {
return;
}
for (var i = 0; i < this.queries.length; i++) {
var query = this.queries[i]; // @todo accelerate this check. Maybe having query._Components as an object
// @todo add Not components
if (query.reactive && query.Components.indexOf(Component) !== -1) {
query.eventDispatcher.dispatchEvent(_Query.default.prototype.COMPONENT_CHANGED, this, component);
}
}
return component;
}
addComponent(Component, values) {
this._entityManager.entityAddComponent(this, Component, values);
return this;
}
removeComponent(Component, forceImmediate) {
this._entityManager.entityRemoveComponent(this, Component, forceImmediate);
return this;
}
hasComponent(Component, includeRemoved) {
return !!~this._ComponentTypes.indexOf(Component) || includeRemoved === true && this.hasRemovedComponent(Component);
}
hasRemovedComponent(Component) {
return !!~this._ComponentTypesToRemove.indexOf(Component);
}
hasAllComponents(Components) {
for (var i = 0; i < Components.length; i++) {
if (!this.hasComponent(Components[i])) return false;
}
return true;
}
hasAnyComponents(Components) {
for (var i = 0; i < Components.length; i++) {
if (this.hasComponent(Components[i])) return true;
}
return false;
}
removeAllComponents(forceImmediate) {
return this._entityManager.entityRemoveAllComponents(this, forceImmediate);
}
copy(src) {
// TODO: This can definitely be optimized
for (var ecsyComponentId in src._components) {
var srcComponent = src._components[ecsyComponentId];
this.addComponent(srcComponent.constructor);
var component = this.getComponent(srcComponent.constructor);
component.copy(srcComponent);
}
return this;
}
clone() {
return new Entity(this._entityManager).copy(this);
}
reset() {
this.id = this._entityManager._nextEntityId++;
this._ComponentTypes.length = 0;
this.queries.length = 0;
for (var ecsyComponentId in this._components) {
delete this._components[ecsyComponentId];
}
}
remove(forceImmediate) {
return this._entityManager.removeEntity(this, forceImmediate);
}
}
exports.Entity = Entity;