~rbdr/serpentity

ECS framework for Javascript
11088770 — Ruben Beltran del Rio 4 months ago
Trim gitignore
af99864d — Ruben Beltran del Rio 4 months ago
Remove travis config
d6fab6f0 — Ruben Beltran del Rio 4 months ago
Remove webpack config

clone

read-only
https://git.sr.ht/~rbdr/serpentity
read/write
git@git.sr.ht:~rbdr/serpentity

You can also use your local clone with git send-email.

#Serpentity

Serpentity is a simple entity framework inspired by Ash.

Usage:

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.addEntity(entityFactory());
engine.addSystem(new GameSystem(), priority);

Update all systems:

engine.update(dt);

Remove entities or systems:

engine.removeEntity(entityReference);
engine.removeSystem(systemReference);

#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;

    super(config);
  }
};

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

engine.getNodes(MovementNode);

#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 {
  added(engine){

    this.nodeList = engine.getNodes(MovementNode);
  }

  removed(engine){

    this.nodeList = undefined;
  }

  update(dt){

    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