so://phie

game-engine

A lightweight JavaScript game engine
git clone git://soophie.de/game-engine

blob: 7cf8ea6533f989f1aee3088e3af43561dd23c2d7 (1361 bytes)[doc][blame][raw]

1import { scaleCanvas } from './util/canvas.js';

2

3export 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 // nothing

41 }

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}