TinyECS
A mean lean Entity-Component-System library.
Installation
Works on the server or the browser (via Browserify):
npm install tiny-ecs
Usage
Manage entities via an EntityManager
instance:
var EntityManager = EntityManager; var entities = ;
Creating Entities
Create an entity:
var hero = entities;
Working with Entities
Components are added via providing any generic constructor function:
{ thisx = 0; thisy = 0;}
{ thisimage = 'hero.png';}
Add the components:
hero;
We now have new data members on our entity for the components. TinyECS will add an instance member that is the name of the component constructor, lowercased.
heropositionx = 10;herospriteimage === 'hero.png'; // true
Add arbitrary text tags to an entity:
hero;
You can also remove components and tags in much the same way:
hero;hero;
To determine if an entity has a specific component:
if hero ...
And to check if an entity has ALL of a set of components:
if hero ...
Querying Entities
The entity manager is setup with indexed queries, allowing extremely fast querying of the current entities. Querying entities returns an array of entities.
Get all entities that have a specific set of components:
var toDraw = entities;
Get all entities with a certain tag:
var enemies = entities;
Removing Entities
Directly:
hero;
Via the manager:
entities;
Creating Components
Any object constructor can be used as a component, nothing special required. Components should be lean, primarily data containers, leaving all the heavy lifting for the systems.
{ thisx = 0; thisy = 0;}
Creating Systems
In TinyECS, there is no formal notion of a system. A system is considered any context in which entities and their components are updated. As to how this occurs will vary depending on your use.
In the example of a game, mainting a list of systems that are instantiated with some sort of IoC container that request a list of entities seems like a good idea.
function PhysicsSystem(entities)
{
// Dependency inject -- reference to our EntityManager
this.entities = entities;
}
PhysicsSystem.prototype.update = function(dt, time)
{
var toUpdate = this.entities.queryComponents([Position, Physics]);
toUpdate.forEach(function(entity) { ... });
...
}
Tern Support
The source files are all decorated with JSDoc3-style
annotations that work great with the Tern code inference
system. Combined with the Node plugin (see this project's .tern-project
file), you can have intelligent autocomplete for methods in this library.
Testing
Testing is done with Tape and can be run
with the command npm test
.
Automated CI cross-browser testing is provided by Testling.
License
Copyright 2014 Brandon Valosek
TinyECS is released under the MIT license.