Add MapView class with common render() method

This commit is contained in:
Matthias Schiffer 2018-11-17 12:38:14 +01:00
parent e52d57b396
commit 0db19bd119
Signed by: neocturne
GPG key ID: 16EF3F64CB201D9C
2 changed files with 21 additions and 14 deletions

View file

@ -4,9 +4,8 @@ import { EntityContext } from './entitycontext';
import { MapData } from '../model/data/map'; import { MapData } from '../model/data/map';
import { ButtonCode, GameInputHandler } from '../view/input/gameinput'; import { ButtonCode, GameInputHandler } from '../view/input/gameinput';
import { loadMap } from '../view/map'; import { MapView } from '../view/map';
import { Renderer } from '../view/renderer/renderer'; import { Renderer } from '../view/renderer/renderer';
import { SpriteView } from '../view/sprite';
import { Collidable } from '../math/collision'; import { Collidable } from '../math/collision';
import { Movement } from '../math/line'; import { Movement } from '../math/line';
@ -39,9 +38,9 @@ export class GameContext implements CollidableGroup {
); );
} }
private static async loadMap(renderer: Renderer, name: string): Promise<[SpriteView[], Collidable[]]> { private static async loadMap(renderer: Renderer, name: string): Promise<[MapView, Collidable[]]> {
const map = new MapData(await getJSON(`resources/map/${name}.json`)); const map = new MapData(await getJSON(`resources/map/${name}.json`));
return [await loadMap(renderer, map), mkCollision(map.collision)]; return [await MapView.load(renderer, map), mkCollision(map.collision)];
} }
private readonly initTime: number = performance.now(); private readonly initTime: number = performance.now();
@ -61,7 +60,7 @@ export class GameContext implements CollidableGroup {
private constructor( private constructor(
private readonly renderer: Renderer, private readonly renderer: Renderer,
private readonly mapView: SpriteView[], private readonly mapView: MapView,
private readonly player: EntityContext, private readonly player: EntityContext,
private readonly entities: EntityContext[], private readonly entities: EntityContext[],
private readonly collision: Collidable[], private readonly collision: Collidable[],
@ -168,10 +167,7 @@ export class GameContext implements CollidableGroup {
this.renderer.setCenter(this.player.pos); this.renderer.setCenter(this.player.pos);
this.renderer.clear(); this.renderer.clear();
for (const layer of this.mapView) for (const r of [this.mapView, ...this.entities, this.player])
layer.render();
for (const r of [...this.entities, this.player])
r.render(time); r.render(time);
window.requestAnimationFrame(this.render); window.requestAnimationFrame(this.render);

View file

@ -2,7 +2,7 @@ import { Renderer } from './renderer/renderer';
import { SpriteCoords, SpriteView, SpriteViewBuilder } from './sprite'; import { SpriteCoords, SpriteView, SpriteViewBuilder } from './sprite';
import { loadImage, mkTexture } from './util/image'; import { loadImage, mkTexture } from './util/image';
import { MapData, MapLayer } from '../model/data/map'; import { MapData } from '../model/data/map';
import { nextPowerOf2 } from '../util'; import { nextPowerOf2 } from '../util';
@ -68,9 +68,20 @@ function buildMapLayer(r: Renderer, tileset: Tileset, layer: number[][]): Sprite
return builder.build(); return builder.build();
} }
export async function loadMap(r: Renderer, map: MapData): Promise<SpriteView[]> { export class MapView {
const tiles = await loadTiles(map.tiles); public static async load(r: Renderer, map: MapData): Promise<MapView> {
const tileset = mkTileset(r, tiles); const tiles = await loadTiles(map.tiles);
const tileset = mkTileset(r, tiles);
return map.layers.map((layer) => buildMapLayer(r, tileset, layer.tiles)); const layers = map.layers.map((layer) => buildMapLayer(r, tileset, layer.tiles));
return new MapView(layers);
}
private constructor(private layers: SpriteView[]) {
}
public render(time: number) {
for (const layer of this.layers)
layer.render();
}
} }