]> git.r.bdr.sh - rbdr/sumo/blob - lib/systems/render.js
8d3d4468ed8b3c4104ae89ccbab13a114ef8a83d
[rbdr/sumo] / lib / systems / render.js
1 import { System } from '@serpentity/serpentity';
2
3 import RenderableNode from '../nodes/renderable';
4
5 const internals = {
6 kNoPixiError: 'No pixi application passed to render system. Make sure you set the `application` key in the config object when initializing.'
7 };
8
9 /**
10 * Renders renderable objects to console
11 *
12 * @extends {external:Serpentity.System}
13 * @class RenderSystem
14 * @param {object} config a configuration object to extend.
15 */
16 export default class RenderSystem extends System {
17
18 constructor(config = {}) {
19
20 super();
21
22 /**
23 * The node collection of renderable entities
24 *
25 * @property {external:Serpentity.NodeCollection} renderables
26 * @instance
27 * @memberof RenderSystem
28 */
29 this.renderables = null;
30
31 /**
32 * The pixi engine we will use to render
33 *
34 * @property {external:PixiJs.Application} renderables
35 * @instance
36 * @memberof RenderSystem
37 */
38 this._application = config.application;
39
40 if (!this._application) {
41 throw new Error(internals.kNoPixiError);
42 }
43 }
44
45 /**
46 * Initializes system when added. Requests renderable nodes and
47 * attaches to event listeners to add / remove them to pixi stage
48 *
49 * @function added
50 * @memberof RenderSystem
51 * @instance
52 * @param {external:Serpentity.Engine} engine the serpentity engine to
53 * which we are getting added
54 */
55 added(engine) {
56
57 this.renderables = engine.getNodes(RenderableNode);
58 this.renderables.on('nodeAdded', (event) => {
59
60 this._application.stage.addChild(event.node.container.container);
61 });
62 this.renderables.on('nodeRemoved', (event) => {
63
64 this._application.stage.removeChild(event.node.container.container);
65 });
66 }
67
68 /**
69 * Clears system resources when removed.
70 *
71 * @function removed
72 * @instance
73 * @memberof RenderSystem
74 */
75 removed() {
76
77 this.renderables.removeAllListeners('nodeAdded');
78 this.renderables.removeAllListeners('nodeRemoved');
79 this.renderables = null;
80 }
81
82 /**
83 * Runs on every update of the loop. Prints the location of every
84 * renderable
85 *
86 * @function update
87 * @instance
88 * @param {Number} currentFrameDuration the duration of the current
89 * frame
90 * @memberof RenderSystem
91 */
92 update(currentFrameDuration) {
93
94 for (const renderable of this.renderables) {
95 renderable.container.container.position.x = renderable.position.x;
96 renderable.container.container.position.y = renderable.position.y;
97 }
98 }
99 };