Prepare support for adding extra elements to map layers
This commit is contained in:
parent
e77b54f01b
commit
ec0e51231f
4 changed files with 58 additions and 46 deletions
64
dist/resources/map/test.json
vendored
64
dist/resources/map/test.json
vendored
|
@ -16,36 +16,40 @@
|
||||||
"stone/wall/bottom_left_inner"
|
"stone/wall/bottom_left_inner"
|
||||||
],
|
],
|
||||||
"layers": [
|
"layers": [
|
||||||
[
|
{
|
||||||
[0, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 0],
|
"tiles": [
|
||||||
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
[0, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 0],
|
||||||
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
||||||
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
||||||
[3, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 3],
|
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
||||||
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
[3, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 3],
|
||||||
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||||
[5, 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 5],
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||||
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
[5, 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 5],
|
||||||
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
||||||
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
||||||
[0, 10, 5, 5, 5, 14, 1, 1, 13, 5, 5, 5, 9, 0],
|
[0, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0],
|
||||||
[0, 0, 0, 0, 0, 6, 1, 1, 4, 0, 0, 0, 0, 0]
|
[0, 10, 5, 5, 5, 14, 1, 1, 13, 5, 5, 5, 9, 0],
|
||||||
],
|
[0, 0, 0, 0, 0, 6, 1, 1, 4, 0, 0, 0, 0, 0]
|
||||||
[
|
]
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
},
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
{
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
"tiles": [
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
|
||||||
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
|
||||||
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0]
|
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
||||||
]
|
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0]
|
||||||
|
]
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"collision": [
|
"collision": [
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,7 +39,7 @@ 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<[SpriteView[], 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 loadMap(renderer, map), mkCollision(map.collision)];
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,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: SpriteView[],
|
||||||
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,7 +168,8 @@ export class GameContext implements CollidableGroup {
|
||||||
this.renderer.setCenter(this.player.pos);
|
this.renderer.setCenter(this.player.pos);
|
||||||
this.renderer.clear();
|
this.renderer.clear();
|
||||||
|
|
||||||
this.mapView.render();
|
for (const layer of this.mapView)
|
||||||
|
layer.render();
|
||||||
|
|
||||||
for (const r of [...this.entities, this.player])
|
for (const r of [...this.entities, this.player])
|
||||||
r.render(time);
|
r.render(time);
|
||||||
|
|
|
@ -1,14 +1,18 @@
|
||||||
import { Collision } from './collision';
|
import { Collision } from './collision';
|
||||||
|
|
||||||
|
export interface MapLayer {
|
||||||
|
readonly tiles: number[][];
|
||||||
|
}
|
||||||
|
|
||||||
export interface MapDataInput {
|
export interface MapDataInput {
|
||||||
readonly tiles: string[];
|
readonly tiles: string[];
|
||||||
readonly layers: number[][][];
|
readonly layers: MapLayer[];
|
||||||
readonly collision: Collision[];
|
readonly collision: Collision[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export class MapData {
|
export class MapData {
|
||||||
public readonly tiles: string[];
|
public readonly tiles: string[];
|
||||||
public readonly layers: number[][][];
|
public readonly layers: MapLayer[];
|
||||||
public readonly collision: Collision[];
|
public readonly collision: Collision[];
|
||||||
|
|
||||||
public readonly width: number;
|
public readonly width: number;
|
||||||
|
@ -19,7 +23,7 @@ export class MapData {
|
||||||
this.layers = data.layers;
|
this.layers = data.layers;
|
||||||
this.collision = data.collision;
|
this.collision = data.collision;
|
||||||
|
|
||||||
this.height = this.layers[0].length;
|
this.height = this.layers[0].tiles.length;
|
||||||
this.width = this.layers[0][0].length;
|
this.width = this.layers[0].tiles[0].length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 } from '../model/data/map';
|
import { MapData, MapLayer } from '../model/data/map';
|
||||||
|
|
||||||
import { nextPowerOf2 } from '../util';
|
import { nextPowerOf2 } from '../util';
|
||||||
|
|
||||||
|
@ -58,16 +58,19 @@ function addSprite(builder: SpriteViewBuilder, tileset: Tileset, x: number, y: n
|
||||||
builder.addSprite([x, y, x + 1, y + 1], tilePos);
|
builder.addSprite([x, y, x + 1, y + 1], tilePos);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function loadMap(r: Renderer, map: MapData): Promise<SpriteView> {
|
function buildMapLayer(r: Renderer, tileset: Tileset, layer: number[][]): SpriteView {
|
||||||
const tiles = await loadTiles(map.tiles);
|
|
||||||
const tileset = mkTileset(r, tiles);
|
|
||||||
|
|
||||||
const builder = new SpriteViewBuilder(r, tileset.texture);
|
const builder = new SpriteViewBuilder(r, tileset.texture);
|
||||||
|
|
||||||
for (const layer of map.layers)
|
for (let x = 0; x < layer[0].length; x++)
|
||||||
for (let x = 0; x < map.width; x++)
|
for (let y = 0; y < layer.length; y++)
|
||||||
for (let y = 0; y < map.height; y++)
|
addSprite(builder, tileset, x, y, layer[y][x]);
|
||||||
addSprite(builder, tileset, x, y, layer[y][x]);
|
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function loadMap(r: Renderer, map: MapData): Promise<SpriteView[]> {
|
||||||
|
const tiles = await loadTiles(map.tiles);
|
||||||
|
const tileset = mkTileset(r, tiles);
|
||||||
|
|
||||||
|
return map.layers.map((layer) => buildMapLayer(r, tileset, layer.tiles));
|
||||||
|
}
|
||||||
|
|
Reference in a new issue