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 { ButtonCode, GameInputHandler } from '../view/input/gameinput';
|
||||
import { loadMap } from '../view/map';
|
||||
import { MapView } from '../view/map';
|
||||
import { Renderer } from '../view/renderer/renderer';
|
||||
import { SpriteView } from '../view/sprite';
|
||||
|
||||
import { Collidable } from '../math/collision';
|
||||
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`));
|
||||
return [await loadMap(renderer, map), mkCollision(map.collision)];
|
||||
return [await MapView.load(renderer, map), mkCollision(map.collision)];
|
||||
}
|
||||
|
||||
private readonly initTime: number = performance.now();
|
||||
|
@ -61,7 +60,7 @@ export class GameContext implements CollidableGroup {
|
|||
|
||||
private constructor(
|
||||
private readonly renderer: Renderer,
|
||||
private readonly mapView: SpriteView[],
|
||||
private readonly mapView: MapView,
|
||||
private readonly player: EntityContext,
|
||||
private readonly entities: EntityContext[],
|
||||
private readonly collision: Collidable[],
|
||||
|
@ -168,10 +167,7 @@ export class GameContext implements CollidableGroup {
|
|||
this.renderer.setCenter(this.player.pos);
|
||||
this.renderer.clear();
|
||||
|
||||
for (const layer of this.mapView)
|
||||
layer.render();
|
||||
|
||||
for (const r of [...this.entities, this.player])
|
||||
for (const r of [this.mapView, ...this.entities, this.player])
|
||||
r.render(time);
|
||||
|
||||
window.requestAnimationFrame(this.render);
|
||||
|
|
|
@ -2,7 +2,7 @@ import { Renderer } from './renderer/renderer';
|
|||
import { SpriteCoords, SpriteView, SpriteViewBuilder } from './sprite';
|
||||
import { loadImage, mkTexture } from './util/image';
|
||||
|
||||
import { MapData, MapLayer } from '../model/data/map';
|
||||
import { MapData } from '../model/data/map';
|
||||
|
||||
import { nextPowerOf2 } from '../util';
|
||||
|
||||
|
@ -68,9 +68,20 @@ function buildMapLayer(r: Renderer, tileset: Tileset, layer: number[][]): Sprite
|
|||
return builder.build();
|
||||
}
|
||||
|
||||
export async function loadMap(r: Renderer, map: MapData): Promise<SpriteView[]> {
|
||||
export class MapView {
|
||||
public static async load(r: Renderer, map: MapData): Promise<MapView> {
|
||||
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