]>
git.r.bdr.sh - rbdr/serpentity/blob - lib/serpentity/serpentity.js
6d3920ccd532e441c14f998b3a12c98860ca21f1
1 if (typeof require
!== "undefined") {
6 Serpentity is a simple entity framework inspired by Ash.
10 require('serpentity');
12 ## Instantiating an engine
14 var engine = Serpentity();
16 Add entities or systems, systems are added with a priority (the smaller
17 the number, the earlier it will be called):
19 engine.addEntity(entityFactory());
20 engine.addSystem(new GameSystem(), priority);
26 Remove entities or systems:
28 engine.removeEntity(entityReference);
29 engine.removeSystem(systemReference);
33 Entities are the basic object of Serpentity, and they do nothing.
35 var entity = new Serpentity.Entity();
37 All the behavior is added through components
39 ## Creating Components
41 Components define data that we can add to an entity. This data will
42 eventually be consumed by "Systems"
44 Class("PositionComponent").inherits(Serpentity.Component)({
51 You can add components to entities by using the add method:
53 entity.add(new PositionComponent());
56 Systems can refer to entities by requesting nodes.
60 Nodes are sets of components that you define, so your system can require
61 entities that always follow the API defined in the node.
63 Class("MovementNode").inherits(Serpentity.Node)({
65 position : PositionComponent,
66 motion : MotionComponent
70 You can then request an array of all the nodes representing entities
71 that comply with that API
73 engine.getNodes(MovementNode);
77 Systems are called on every update, and they use components through nodes.
79 Class("TestSystem").inherits(Serpentity.System)({
81 added : function added(engine){
82 this.nodeList = engine.getNodes(MovementNode);
84 removed : function removed(engine){
85 this.nodeList = undefined;
87 update : function update(dt){
88 this.nodeList.forEach(function (node) {
89 console.log("Current position is: " + node.position.x + "," + node.position.y);
97 Just run `engine.update(dt)` in your game loop :D
100 Class("Serpentity")({
103 nodeCollections : null,
106 init : function init(config
) {
109 config
= config
|| {};
113 this.nodeCollections
= {};
115 for (property
in config
) {
116 if (config
.hasOwnProperty(property
)) {
117 this[property
] = config
[property
];
123 * Adds a system to the engine, so its update method will be called
124 * with the others. Triggers added hook.
126 * returns true if added succesfully, false if already added
128 addSystem : function addSystem(system
, priority
) {
129 var lastIndex
, found
;
131 if (this.systems
.indexOf(system
) >= 0) {
135 system
.priority
= priority
;
140 this.systems
.some(function findPriority(existingSystem
, i
) {
142 if (existingSystem
.priority
>= system
.priority
) {
152 this.systems
.splice(lastIndex
, 0, system
);
158 * Removes a system from the engine, so its update method will no
159 * longer will be called. Triggers the removed hook.
161 * returns true if removed succesfully, false if already added
163 removeSystem : function removeSystem(system
) {
166 position
= this.systems
.indexOf(system
);
168 this.systems
[position
].removed(this);
169 this.systems
.splice(position
, 1);
177 * Adds an entity to the engine, adds to existing node collections
179 * returns true if added, false if already there
181 addEntity : function addEntity(entity
) {
184 if (this.entities
.indexOf(entity
) >= 0) {
187 this.entities
.push(entity
);
189 for (property
in this.nodeCollections
) {
190 if (this.nodeCollections
.hasOwnProperty(property
)) {
191 this.nodeCollections
[property
].add(entity
);
198 * Removes entity from system, removing from all node collections
200 * returns true if removed, false if not present
202 removeEntity : function removeEntity(entity
) {
205 position
= this.entities
.indexOf(entity
);
207 for (property
in this.nodeCollections
) {
208 if (this.nodeCollections
.hasOwnProperty(property
)) {
209 this.nodeCollections
[property
].remove(entity
);
213 this.entities
.splice(position
, 1);
221 * Given a Node Class, retrieves a list of all the nodes for each
224 getNodes : function getNodes(nodeType
) {
227 if (this.nodeCollections
.hasOwnProperty(nodeType
)) {
228 return this.nodeCollections
[nodeType
].nodes
;
231 nodeCollection
= new Serpentity
.NodeCollection({
234 this.nodeCollections
[nodeType
] = nodeCollection
;
236 this.entities
.forEach(function (entity
) {
237 nodeCollection
.add(entity
);
240 return nodeCollection
.nodes
;
244 * Calls update for every loaded system.
246 update : function update(dt
) {
247 this.systems
.forEach(function (system
) {
254 if (typeof require
!== "undefined") {
255 require("./component.js");
256 require("./entity.js");
257 require("./node.js");
258 require("./node_collection.js");
259 require("./system.js");