https://github.com/adngdb/entity-system-js
ensy - A very simple Entity System for JavaScript
https://github.com/adngdb/entity-system-js
ecs entity entity-component entity-system entity-systems game-development gamedev gamedev-library javascript
Last synced: 3 days ago
JSON representation
ensy - A very simple Entity System for JavaScript
- Host: GitHub
- URL: https://github.com/adngdb/entity-system-js
- Owner: adngdb
- License: mit
- Created: 2011-11-05T12:23:00.000Z (over 14 years ago)
- Default Branch: master
- Last Pushed: 2023-03-04T03:58:32.000Z (about 3 years ago)
- Last Synced: 2026-01-30T22:51:08.971Z (about 1 month ago)
- Topics: ecs, entity, entity-component, entity-system, entity-systems, game-development, gamedev, gamedev-library, javascript
- Language: JavaScript
- Homepage: https://entity-system-js.readthedocs.io/
- Size: 583 KB
- Stars: 88
- Watchers: 7
- Forks: 5
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- Changelog: changelog.md
- License: MIT-LICENSE.txt
Awesome Lists containing this project
README
# ensy: Entity System for JavaScript
``ensy`` is a JavaScript implementation of the Entity System model as described by Adam Martin
in his blog post series [Entity Systems are the future of MMOs](http://t-machine.org/index.php/2009/10/26/entity-systems-are-the-future-of-mmos-part-5/).
> Component/Entity Systems are an architectural pattern used mostly in game development. A CES follows the Composition over Inheritance principle to allow for greater flexibility when defining entities (anything that's part of a game's scene: enemies, doors, bullets) by building out of individual parts that can be mixed-and-matched. This eliminates the ambiguity problems of long inheritance chains and promotes clean design. However, CES systems do incur a small cost to performance.
— From the [Entity Systems Wiki](http://entity-systems.wikidot.com/)
## Installation
This module is available on [``npm``](http://npmjs.com/package/ensy) as ``ensy``. It has no dependencies.
``npm install --save ensy``
## Usage
```javascript
import EntityManager from 'ensy';
let manager = new EntityManager();
// Create a component and add it to the manager.
const PlayerComponent = {
name: 'Player',
description: "The player's state",
state: {
life: 100,
strength: 18,
charisma: 3,
}
};
manager.addComponent(PlayerComponent.name, PlayerComponent);
// Create a new entity.
const playerId = manager.createEntity(['Player']);
// Update the player's state:
let playerData = manager.getComponentDataForEntity('Player', playerId);
playerData.life = 80;
// Which is equivalent to:
manager.updateComponentDataForEntity('Player', playerId, {
life: 80,
});
// Which can also be done when creating the entity:
const playerId = manager.createEntity(['Player'], null, {
Player: {
life: 80,
},
});
console.log(playerData);
// { life: 80, strength: 18, charisma: 3 }
}
```
## Documentation
The documentation is available on [Read the docs](https://entity-system-js.readthedocs.io/). All methods are well documented and parameters are described.
For an overall explanation of ``ensy``, you can read my blog post [ensy - Entity System Reloaded](http://adrian.gaudebert.fr/blog/post/2015/07/04/ensy-mdash-entity-system-reloaded).
## Examples
There are examples in the [examples](https://github.com/adngdb/entity-system-js/tree/master/examples) directory:
* [Concentration](https://github.com/adngdb/entity-system-js/tree/master/examples/concentration)
* [Total Madness Arena](https://github.com/adngdb/nth) (Jam game, made in 3 days)
* Made something with ``ensy``? Add it here!
## For developers
Install the dependencies with ``npm install``. The source files are in ``src/``.
The code uses es6 features, and is compiled to es5 using ``babel`` and ``rollup``.
### Building the code
```bash
$ npm run build
```
We use [rollup](http://rollupjs.org/) and [babel](http://babeljs.io/) to
compile the code from es6 to es5, and [uglify](http://lisperator.net/uglifyjs/)
to minify the source code.
### Running tests
```bash
$ npm test
```
To have tests watch your files and re-run when they change:
```bash
$ npm run test-w
```
To run the tests in your browser:
```bash
$ npm run test-browser
```
### Building the API documentation
```bash
$ npm run build_doc
```