GameContext: async render loop

This commit is contained in:
Matthias Schiffer 2018-11-17 13:51:38 +01:00
parent 49699eeb45
commit 38e90fc2e3
Signed by: neocturne
GPG key ID: 16EF3F64CB201D9C
2 changed files with 14 additions and 8 deletions

View file

@ -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<void> {
while (true) {
this.update(await nextAnimationFrame() - this.initTime);
this.render();
}
}
}

View file

@ -78,3 +78,7 @@ export function get(url: string): Promise<XMLHttpRequest> {
export async function getJSON(url: string): Promise<any> {
return JSON.parse((await get(url)).responseText);
}
export function nextAnimationFrame(): Promise<DOMHighResTimeStamp> {
return new Promise((resolve) => window.requestAnimationFrame(resolve));
}