[game] Render tiles from all layers, support multiple IntGrid layers

This commit is contained in:
John Doty 2023-08-27 08:25:44 -07:00
parent ab91fcfc53
commit 40992f840f

View file

@ -51,7 +51,7 @@ export interface Level {
ch: number; ch: number;
tile_layers: TileLayer[]; tile_layers: TileLayer[];
entities: Entity[]; entities: Entity[];
values: number[]; values: { [key: string]: number[] };
} }
export interface World { export interface World {
@ -82,25 +82,35 @@ async function load_tileset(def: LDTKTilesetDef): Promise<TileSet> {
return { id: def.uid, texture, tags }; return { id: def.uid, texture, tags };
} }
interface LDTKTileLayerInstance { interface LDTKTile {
__type: "Tiles";
__gridSize: number;
__pxTotalOffsetX: number;
__pxTotalOffsetY: number;
__tilesetDefUid: number;
gridTiles: {
px: [number, number]; px: [number, number];
src: [number, number]; src: [number, number];
f: number; f: number;
t: number; t: number;
a: number; a: number;
}[]; }
interface LDTKTileLayerInstance {
__type: "Tiles" | "IntGrid";
__identifier: string;
__gridSize: number;
__pxTotalOffsetX: number;
__pxTotalOffsetY: number;
__tilesetDefUid: number;
autoLayerTiles: LDTKTile[];
gridTiles: LDTKTile[];
} }
function load_tile_layer_instance( function load_tile_layer_instance(
tile_sets: Map<number, TileSet>, tile_sets: Map<number, TileSet>,
li: LDTKTileLayerInstance li: LDTKTileLayerInstance
): TileLayer { ): TileLayer | undefined {
const tiles = li.autoLayerTiles.concat(li.gridTiles);
if (tiles.length == 0) {
return;
}
const tileset = tile_sets.get(li.__tilesetDefUid); const tileset = tile_sets.get(li.__tilesetDefUid);
if (!tileset) { if (!tileset) {
throw new Error("Unable to find texture!!! " + li.__tilesetDefUid); throw new Error("Unable to find texture!!! " + li.__tilesetDefUid);
@ -111,7 +121,7 @@ function load_tile_layer_instance(
tileset, tileset,
grid_size: li.__gridSize, grid_size: li.__gridSize,
offset: [li.__pxTotalOffsetX, li.__pxTotalOffsetY], offset: [li.__pxTotalOffsetX, li.__pxTotalOffsetY],
tiles: li.gridTiles, tiles,
}; };
} }
@ -139,6 +149,7 @@ function load_entity_layer_instance(li: LDTKEntityLayerInstance): Entity[] {
interface LDTKIntGridLayerInstance { interface LDTKIntGridLayerInstance {
__type: "IntGrid"; __type: "IntGrid";
__identifier: string;
__cWid: number; __cWid: number;
__cHei: number; __cHei: number;
intGridCsv: number[]; intGridCsv: number[];
@ -152,7 +163,7 @@ type LDTKLayerInstance =
function is_tile_layer_instance( function is_tile_layer_instance(
x: LDTKLayerInstance x: LDTKLayerInstance
): x is LDTKTileLayerInstance { ): x is LDTKTileLayerInstance {
return x.__type == "Tiles"; return x.__type == "Tiles" || x.__type == "IntGrid";
} }
function is_entity_layer_instance( function is_entity_layer_instance(
@ -185,26 +196,30 @@ function load_level(tile_sets: Map<number, TileSet>, def: LDTKLevel): Level {
ch: 0, ch: 0,
tile_layers: [], tile_layers: [],
entities: [], entities: [],
values: [], values: {},
}; };
for (const li of def.layerInstances) { for (const li of def.layerInstances) {
if (is_tile_layer_instance(li)) { if (is_tile_layer_instance(li)) {
const tli = load_tile_layer_instance(tile_sets, li); const tli = load_tile_layer_instance(tile_sets, li);
if (tli) {
result.tile_layers.push(tli); result.tile_layers.push(tli);
} else if (is_entity_layer_instance(li)) { }
}
if (is_entity_layer_instance(li)) {
// TODO: Why would I support multiple entity layers? // TODO: Why would I support multiple entity layers?
result.entities = load_entity_layer_instance(li); result.entities = load_entity_layer_instance(li);
} else if (is_intgrid_layer_instance(li)) { }
if (is_intgrid_layer_instance(li)) {
result.cw = li.__cWid; result.cw = li.__cWid;
result.ch = li.__cHei; result.ch = li.__cHei;
result.values = li.intGridCsv; // ? result.values[li.__identifier] = li.intGridCsv;
} else {
print("WARNING: Unknown layer type");
} }
} }
result.tile_layers = result.tile_layers.reverse();
return result; return result;
} }
@ -266,7 +281,9 @@ export function has_collision(level: Level, cx: number, cy: number): boolean {
if (!level) return true; if (!level) return true;
if (cx < 0 || cx >= level.cw) return false; if (cx < 0 || cx >= level.cw) return false;
if (cy < 0 || cy >= level.ch) return false; if (cy < 0 || cy >= level.ch) return false;
return level.values[cy * level.cw + cx] != 0; // TODO: MAGIC NUMBER?
const values = level.values.collisions;
return values[cy * level.cw + cx] != 0; // TODO: MAGIC NUMBER?
} }
export function draw_level( export function draw_level(