Add MapView class with common render() method
This commit is contained in:
parent
e52d57b396
commit
0db19bd119
2 changed files with 21 additions and 14 deletions
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue