d-zone
Version:
An ambient life simulation driven by the user activity within a Discord server
115 lines (104 loc) • 4.38 kB
JavaScript
'use strict';
var EventEmitter = require('events').EventEmitter;
var requestAnimationFrame = require('raf');
var inherits = require('inherits');
var ColorUtil = require('./../common/colorutil.js');
module.exports = Renderer;
inherits(Renderer, EventEmitter);
function Renderer(options) {
this.game = options.game;
this.images = options.images;
this.updateDrawn = false;
this.zBuffer = {};
this.zBufferKeys = [];
this.overlay = [];
this.frames = 0;
var lastRenderTime = 0;
var self = this;
this.game.on('render', function () {
self.updateDrawn = false;
});
var draw = function() {
if(self.updateDrawn == false) {
if(self.canvases) {
var timeThis = game.timeRenders && (self.game.ticks & 511) == 0;
if(timeThis) console.time('render');
//if(timeThis) console.log(self.zBuffer);
//if(timeThis) var renderStart = performance.now();
for(var c = 0; c < self.canvases.length; c++) {
var canvas = self.canvases[c];
canvas.draw();
if(self.bgCanvas) canvas.drawBG(self.bgCanvas);
//self.emit('draw', self.canvases[c]);
for(var z = 0; z < self.zBufferKeys.length; z++) {
var zBufferDepth = self.zBuffer[self.zBufferKeys[z]];
for(var zz = 0; zz < zBufferDepth.length; zz++) {
canvas.drawEntity(zBufferDepth[zz]);
//zBufferDepth[zz].emit('draw',self.canvases[c],self.zBufferKeys[z]);
}
}
for(var o = 0; o < self.overlay.length; o++) {
canvas.drawEntity(self.overlay[o]);
}
if(self.game.ui) self.game.ui.emit('draw',canvas);
}
if(timeThis) console.timeEnd('render');
//if(timeThis) var thisRenderTime = performance.now() - renderStart;
//if(timeThis) var renderTimeChange = thisRenderTime-lastRenderTime;
//if(timeThis && renderTimeChange <= 0) console.log('%c'+renderTimeChange, 'color: #00bb00');
//if(timeThis && renderTimeChange > 0) console.log('%c'+renderTimeChange, 'color: #ff0000');
//if(timeThis) lastRenderTime = thisRenderTime;
}
//self.frames++;
//if((self.game.ticks & 63) == 0) {
// console.log(self.frames * 60 / 64);
// self.frames = 0;
//}
self.updateDrawn = true;
}
requestAnimationFrame(draw);
};
requestAnimationFrame(draw);
}
Renderer.prototype.addCanvas = function(canvas) {
canvas.setRenderer(this);
if(!this.canvases) this.canvases = [];
this.canvases.push(canvas);
};
Renderer.prototype.addToZBuffer = function(sprite, newZDepth) {
var zBufferDepth = this.zBuffer[newZDepth];
if(zBufferDepth) {
zBufferDepth.push(sprite);
zBufferDepth.sort(function(a, b) {
return (a.position.z + a.position.fakeZ) - (b.position.z + b.position.fakeZ);
});
} else {
this.zBuffer[newZDepth] = [sprite];
}
this.zBufferKeys = Object.keys(this.zBuffer);
this.zBufferKeys.sort(function(a, b) { return a - b; });
};
Renderer.prototype.updateZBuffer = function(oldZDepth, obj, newZDepth) {
this.removeFromZBuffer(obj,oldZDepth);
this.addToZBuffer(obj, newZDepth);
};
Renderer.prototype.removeFromZBuffer = function(obj, zDepth) {
var zBufferDepth = this.zBuffer[zDepth];
for(var i = 0; i < zBufferDepth.length; i++) {
if(zBufferDepth[i] === obj) {
zBufferDepth.splice(i,1);
break;
}
}
};
Renderer.prototype.addColorSheet = function(options) {
if(!this.images[options.color]) this.images[options.color] = {};
if(this.images[options.color][options.sheet]) return;
options.image = this.images[options.sheet];
this.images[options.color][options.sheet] = ColorUtil.colorize(options);
};
Renderer.prototype.clear = function() {
this.zBuffer = {};
this.zBufferKeys = [];
this.overlay = [];
};