incheon
Version:
A Node.js based real-time game server
65 lines (52 loc) • 1.85 kB
JavaScript
;
/* globals AFRAME */
const EventEmitter = require('eventemitter3');
const networkedPhysics = require('./aframe/system');
/**
* The A-Frame Renderer
*/
class AFrameRenderer {
/**
* Constructor of the Renderer singleton.
* @param {GameEngine} gameEngine - Reference to the GameEngine instance.
* @param {ClientEngine} clientEngine - Reference to the ClientEngine instance.
*/
constructor(gameEngine, clientEngine) {
this.gameEngine = gameEngine;
this.clientEngine = clientEngine;
// mixin for EventEmitter
Object.assign(this, EventEmitter.prototype);
// set up the networkedPhysics as an A-Frame system
networkedPhysics.setGameEngine(gameEngine);
AFRAME.registerSystem('networked-physics', networkedPhysics);
}
/**
* Initialize the renderer.
* @return {Promise} Resolves when renderer is ready.
*/
init() {
if ((typeof window === 'undefined') || !document) {
console.log('renderer invoked on server side.');
}
let sceneElArray = document.getElementsByTagName('a-scene');
if (sceneElArray.length !== 1) {
throw new Error('A-Frame scene element not found');
}
this.scene = sceneElArray[0];
this.gameEngine.on('objectRemoved', (o) => {
o.renderObj.remove();
});
return Promise.resolve(); // eslint-disable-line new-cap
}
/**
* The main draw function. This method is called at high frequency,
* at the rate of the render loop. Typically this is 60Hz, in WebVR 90Hz.
*/
draw() {
this.gameEngine.world.forEachObject((id, o) => {
if (typeof o.refreshRenderObject === 'function')
o.refreshRenderObject();
});
}
}
module.exports = AFrameRenderer;