A lightweight JavaScript game engine
git clone git://soophie.de/game-engine
blob: 4de0de12429fe8cf0ca37ed291a31a0010f661a3 (1570 bytes)[doc][blame][raw]
1
import GameEngine from './game-engine.js';2
import { scaleCanvas } from './util/canvas.js';4
export default class Game {5
constructor(width, height, { fps } = {}) {6
this.width = width || 900;7
this.height = height || 600;8
this.fps = 1000 / (fps || 60);9
this.then = Date.now();10
this.canvas = document.createElement('canvas');11
scaleCanvas(this.canvas, this.width, this.height);12
this.g = this.canvas.getContext('2d');13
this.g.imageSmoothingEnabled = false;14
this.events = [];15
this.sprites = [];16
GameEngine.instance = this;17
}18
async start() {19
for(const sprite of this.sprites) {20
await sprite.load();21
}22
if(this.onspriteload) {23
this.onspriteload();24
}25
requestAnimationFrame(this.loop.bind(this));26
this.update();27
this.render(this.g);28
}29
loop() {30
requestAnimationFrame(this.loop.bind(this));31
this.now = Date.now();32
this.elapsed = this.now - this.then;33
if(this.elapsed > this.fps) {34
this.then = this.now - (this.elapsed % this.fps);35
for(const event of this.events) {36
if(this['on' + event.type]) {37
this['on' + event.type](event);38
}39
}40
this.update();41
this.render(this.g);42
this.events = [];43
}44
}45
update() {46
// nothing47
}48
render() {49
this.g.clearRect(0, 0, this.width, this.height);50
}51
resize(width, height) {52
this.width = width;53
this.height = height;54
scaleCanvas(this.canvas, this.width, this.height);55
this.g.imageSmoothingEnabled = false;56
}57
bindEvent(element, type) {58
element['on' + type] = event => this.events.push(event);59
}60
loadSprite(sprite) {61
this.sprites.push(sprite);62
}63
}