so://phie

game-engine

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

blob: 4de0de12429fe8cf0ca37ed291a31a0010f661a3 (1570 bytes)[doc][blame][raw]

1import GameEngine from './game-engine.js';

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

3

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

47 }

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}