allow properties on tiles

# Conflicts:
#	front/src/Phaser/Game/GameMap.ts
#	front/src/Phaser/Map/ITiledMap.ts
This commit is contained in:
jonny 2021-06-19 15:17:28 +02:00
parent 61809aad21
commit 74dda8ab69
3 changed files with 61 additions and 1 deletions

View file

@ -1,5 +1,8 @@
import type {ITiledMap, ITiledMapLayer} from "../Map/ITiledMap";
import {LayersIterator} from "../Map/LayersIterator";
import { CustomVector, Vector2 } from '../../utility/vector';
import type { ITiledMap, ITiledMapLayerProperty } from "../Map/ITiledMap";
import { LayersIterator } from "../Map/LayersIterator";
export type PropertyChangeCallback = (newValue: string | number | boolean | undefined, oldValue: string | number | boolean | undefined, allProps: Map<string, string | boolean | number>) => void;
@ -11,12 +14,37 @@ export class GameMap {
private key: number|undefined;
private lastProperties = new Map<string, string|boolean|number>();
private callbacks = new Map<string, Array<PropertyChangeCallback>>();
/**
* tileset.firstgid => (Map<tileid,Array<ITiledMapLayerProperty>>)
*/
private tileSetPropertyMap = new Map<number, Map<number, Array<ITiledMapLayerProperty>>>()
public readonly layersIterator: LayersIterator;
public exitUrls: Array<string> = []
public constructor(private map: ITiledMap) {
this.layersIterator = new LayersIterator(map);
for (const tileset of map.tilesets) {
if (!this.tileSetPropertyMap.has(tileset.firstgid)) {
this.tileSetPropertyMap.set(tileset.firstgid, new Map())
}
tileset?.tiles?.forEach(tile => {
if (tile.properties) {
this.tileSetPropertyMap.get(tileset.firstgid)?.set(tile.id, tile.properties)
tile.properties.forEach(prop => {
if (prop.name == "exitUrl" && typeof prop.value == "string") {
this.exitUrls.push(prop.value);
}
})
}
})
}
}
/**
* Sets the position of the current player (in pixels)
* This will trigger events if properties are changing.
@ -59,12 +87,15 @@ export class GameMap {
const properties = new Map<string, string|boolean|number>();
for (const layer of this.layersIterator) {
let tileIndex: number | undefined = undefined;
if (layer.type !== 'tilelayer') {
continue;
}
const tiles = layer.data as number[];
if (tiles[key] == 0) {
continue;
tileIndex = tiles[key]
}
// There is a tile in this layer, let's embed the properties
if (layer.properties !== undefined) {
@ -75,6 +106,23 @@ export class GameMap {
properties.set(layerProperty.name, layerProperty.value);
}
}
if (tileIndex) {
const tileset = this.map.tilesets.find(tileset => tileset.firstgid + tileset.tilecount > (tileIndex as number))
if (tileset) {
const tileProperties = this.tileSetPropertyMap.get(tileset?.firstgid)?.get(tileIndex - tileset.firstgid)
if (tileProperties) {
for (const property of tileProperties) {
if (property.value) {
properties.set(property.name, property.value)
} else if (properties.has(property.name)) {
properties.delete(property.name)
}
}
}
}
}
}
return properties;

View file

@ -447,6 +447,11 @@ export class GameScene extends DirtyScene implements CenterListener {
}
}
}
this.gameMap.exitUrls.forEach(exitUrl => {
this.loadNextGame(exitUrl)
})
if (depth === -2) {
throw new Error('Your map MUST contain a layer of type "objectgroup" whose name is "floorLayer" that represents the layer characters are drawn at. This layer cannot be contained in a group.');
}

View file

@ -167,7 +167,7 @@ export interface ITiledTileSet {
tilewidth: number;
transparentcolor: string;
terrains: ITiledMapTerrain[];
tiles: {[key: string]: { terrain: number[] }};
tiles?: Array<ITile>;
/**
* Refers to external tileset file (should be JSON)
@ -175,6 +175,13 @@ export interface ITiledTileSet {
source: string;
}
export interface ITile {
id: number,
type?: string
properties?: Array<ITiledMapLayerProperty>
}
export interface ITiledMapTerrain {
name: string;
tile: number;