Added a new LayersIterator class

This class iterates recursively over layers, flattening groups.
This enables us to simplify the code when we iterate layers. We can remove all recursive function calls in the GameScene code (it is delegated to the LayersIterator)
This commit is contained in:
David Négrier
2021-04-15 22:39:35 +02:00
parent 66b90be0da
commit 6815fe7a0a
6 changed files with 384 additions and 65 deletions
+6 -13
View File
@@ -1,4 +1,5 @@
import {ITiledMap, ITiledMapLayer} 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;
@@ -10,8 +11,10 @@ export class GameMap {
private key: number|undefined;
private lastProperties = new Map<string, string|boolean|number>();
private callbacks = new Map<string, Array<PropertyChangeCallback>>();
public readonly layersIterator: LayersIterator;
public constructor(private map: ITiledMap) {
this.layersIterator = new LayersIterator(map);
}
/**
@@ -52,15 +55,10 @@ export class GameMap {
return this.lastProperties;
}
// helper for recursive group layer support
private getPropertiesHelper(key: number, layers: ITiledMapLayer[], properties: Map<string, string|boolean|number>): Map<string, string|boolean|number> {
for (const layer of layers) {
if (layer.type === 'group') {
this.getPropertiesHelper(key, layer.layers, properties);
continue;
}
private getProperties(key: number): Map<string, string|boolean|number> {
const properties = new Map<string, string|boolean|number>();
for (const layer of this.layersIterator) {
if (layer.type !== 'tilelayer') {
continue;
}
@@ -82,11 +80,6 @@ export class GameMap {
return properties;
}
private getProperties(key: number): Map<string, string|boolean|number> {
const properties = new Map<string, string|boolean|number>();
return this.getPropertiesHelper(key, this.map.layers, properties);
}
private trigger(propName: string, oldValue: string | number | boolean | undefined, newValue: string | number | boolean | undefined, allProps: Map<string, string | boolean | number>) {
const callbacksArray = this.callbacks.get(propName);
if (callbacksArray !== undefined) {