ECS framework for Javascript

6f9dc34 Publish

7 months ago

3252138 Add the repo

7 months ago


Serpentity is a simple entity framework inspired by Ash.


import Serpentity from '@serpentity/serpentity';

#Instantiating an engine

const engine = new Serpentity();

Add entities or systems, systems are added with a priority (the smaller the number, the earlier it will be called):

engine.addSystem(new GameSystem(), priority);

Update all systems:


Remove entities or systems:


#Creating Entities

Entities are the basic object of Serpentity, and they do nothing.

import { Entity } from '@serpentity/serpentity';
const entity = new Entity();

All the behavior is added through components

#Creating Components

Components define data that we can add to an entity. This data will eventually be consumed by "Systems"

import { Component } from '@serpentity/serpentity';
const PositionComponent = class PositionComponent extends Component {
  constructor(config) {

    this.x = 0;
    this.y = 0;


You can add components to entities by using the add method:

entity.addComponent(new PositionComponent());

Systems can refer to entities by requesting nodes.

#Working with Nodes

Nodes are sets of components that you define, so your system can require entities that always follow the API defined in the node.

import { Node } from '@serpentity/serpentity';
const MovementNode = class MovementNode extends Node;
MovementNode.position = PositionComponent;
MovementNode.motion = MotionComponent;

You can then request an array of all the nodes representing entities that comply with that API


#Creating Systems

Systems are called on every update, and they use components through nodes.

import { System } from '@serpentity/serpentity';
const TestSystem = class TestSystem extends System {

    this.nodeList = engine.getNodes(MovementNode);


    this.nodeList = undefined;


    for (const node of this.nodeList) {
      console.log(`Current position is: ${node.position.x},${node.position.y}`);

#That's it

Just run engine.update(dt) in your game loop :D