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