X-Git-Url: https://git.r.bdr.sh/rbdr/serpentity/blobdiff_plain/6e4e4188e5e067aad7d228443d5bb512527c99b0..af99864df5ed44434783c39775db398f8c5b2dcc:/lib/serpentity.js diff --git a/lib/serpentity.js b/lib/serpentity.js index 1360f92..c5c3850 100644 --- a/lib/serpentity.js +++ b/lib/serpentity.js @@ -1,107 +1,23 @@ -'use strict'; +export { Component } from './serpentity/component.js'; +export { Entity } from './serpentity/entity.js'; +export { Node } from './serpentity/node.js'; +export { System } from './serpentity/system.js'; -/* -Serpentity is a simple entity framework inspired by Ash. - -Usage: - - let Serpentity = require('serpentity'); - -## Instantiating an engine - - let engine = 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. - - let entity = new Serpentity.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" - - let PositionComponent = class PositionComponent extends Serpentity.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 +import { NodeCollection } from './serpentity/node_collection.js'; -Nodes are sets of components that you define, so your system can require -entities that always follow the API defined in the node. - - let MovementNode = class MovementNode extends Serpentity.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. - - let TestSystem = class TestSystem extends Serpentity.System { - added (engine){ - this.nodeList = engine.getNodes(MovementNode); - }, - removed (engine){ - this.nodeList = undefined; - } - update (dt){ - let node; - for (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 +/* + * Serpentity is the main engine class + */ +export default class Serpentity { -*/ -let Serpentity = class Serpentity { + constructor(config) { - constructor (config) { this.systems = []; this.entities = []; this._nodeCollections = []; this._nodeCollectionKeys = []; - Object.assign(this, config || {}); + Object.assign(this, config); } /* @@ -110,8 +26,7 @@ let Serpentity = class Serpentity { * * returns true if added succesfully, false if already added */ - addSystem (system, priority) { - let lastIndex, found; + addSystem(system, priority) { if (this.systems.indexOf(system) >= 0) { return false; @@ -119,13 +34,12 @@ let Serpentity = class Serpentity { system.priority = priority; - found = false; - lastIndex = 0; + let lastIndex = 0; + + const found = this.systems.some((existingSystem, i) => { - this.systems.some(function findPriority(existingSystem, i) { lastIndex = i; if (existingSystem.priority >= system.priority) { - found = true; return true; } }); @@ -145,10 +59,9 @@ let Serpentity = class Serpentity { * * returns true if removed succesfully, false if already added */ - removeSystem (system) { - let position; + removeSystem(system) { - position = this.systems.indexOf(system); + const position = this.systems.indexOf(system); if (position >= 0) { this.systems[position].removed(this); this.systems.splice(position, 1); @@ -163,15 +76,17 @@ let Serpentity = class Serpentity { * * returns true if added, false if already there */ - addEntity (entity) { + addEntity(entity) { + if (this.entities.indexOf(entity) >= 0) { return false; } + this.entities.push(entity); - this._nodeCollections.forEach(function (collection) { + for (const collection of this._nodeCollections) { collection.add(entity); - }); + } return true; } @@ -181,14 +96,13 @@ let Serpentity = class Serpentity { * * returns true if removed, false if not present */ - removeEntity (entity) { - let position; + removeEntity(entity) { - position = this.entities.indexOf(entity); + const position = this.entities.indexOf(entity); if (position >= 0) { - this._nodeCollections.forEach(function (collection) { + for (const collection of this._nodeCollections) { collection.remove(entity); - }); + } this.entities.splice(position, 1); return true; @@ -201,46 +115,35 @@ let Serpentity = class Serpentity { * Given a Node Class, retrieves a list of all the nodes for each * applicable entity. */ - getNodes (nodeType) { - let position, nodeCollection; + getNodes(nodeType) { - position = this._nodeCollectionKeys.indexOf(nodeType); + const position = this._nodeCollectionKeys.indexOf(nodeType); if (position >= 0) { - return this._nodeCollections[position].nodes; + return this._nodeCollections[position]; } - nodeCollection = new Serpentity.NodeCollection({ - type : nodeType + const nodeCollection = new NodeCollection({ + type: nodeType }); this._nodeCollectionKeys.push(nodeType); this._nodeCollections.push(nodeCollection); - this.entities.forEach(function (entity) { + for (const entity of this.entities) { nodeCollection.add(entity); - }); + } - return nodeCollection.nodes; + return nodeCollection; } /* * Calls update for every loaded system. */ - update (dt) { - this.systems.forEach(function (system) { + update(dt) { + + for (const system of this.systems) { system.update(dt); - }); + } } -}; - -// Add namespaced objects. -if (typeof module !== 'undefined' && this.module !== module) { - Serpentity.Component = require('./serpentity/component.js'); - Serpentity.Entity = require('./serpentity/entity.js'); - Serpentity.Node = require('./serpentity/node.js'); - Serpentity.NodeCollection = require('./serpentity/node_collection.js'); - Serpentity.System = require('./serpentity/system.js'); - - module.exports = Serpentity; }