From 38e90fc2e309d394832eee471d4cb9877ae908e2 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 17 Nov 2018 13:51:38 +0100 Subject: GameContext: async render loop --- src/controller/gamecontext.ts | 18 ++++++++++-------- src/util.ts | 4 ++++ 2 files changed, 14 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/controller/gamecontext.ts b/src/controller/gamecontext.ts index 4fcc883..1a94e3e 100644 --- a/src/controller/gamecontext.ts +++ b/src/controller/gamecontext.ts @@ -9,7 +9,7 @@ import { Renderer } from '../view/renderer/renderer'; import { Collidable } from '../math/collision'; import { Movement } from '../math/line'; -import { getJSON } from '../util'; +import { getJSON, nextAnimationFrame } from '../util'; import { vec2 } from 'gl-matrix'; @@ -84,7 +84,7 @@ export class GameContext implements CollidableGroup { } }); - window.requestAnimationFrame(this.render); + this.renderLoop(); } public getTranslation(): null { @@ -160,16 +160,18 @@ export class GameContext implements CollidableGroup { this.updateStep(); } - private render = (curTime: number) => { - const time = curTime - this.initTime; - this.update(time); - + private render(): void { this.renderer.setCenter(this.player.pos); this.renderer.clear(); for (const r of [this.mapView, ...this.entities, this.player]) - r.render(time); + r.render(this.time); + } - window.requestAnimationFrame(this.render); + private async renderLoop(): Promise { + while (true) { + this.update(await nextAnimationFrame() - this.initTime); + this.render(); + } } } diff --git a/src/util.ts b/src/util.ts index 73e30d0..cea404b 100644 --- a/src/util.ts +++ b/src/util.ts @@ -78,3 +78,7 @@ export function get(url: string): Promise { export async function getJSON(url: string): Promise { return JSON.parse((await get(url)).responseText); } + +export function nextAnimationFrame(): Promise { + return new Promise((resolve) => window.requestAnimationFrame(resolve)); +} -- cgit v1.2.3