From 9ddf22d36bc27a88d03ef7116f1dae8d111af91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=A9grier?= Date: Wed, 3 Jun 2020 10:45:25 +0200 Subject: [PATCH] Removing GameScene from the list of known GameScene when leaving This is important because when we come back to the GameScene later, some properties of the GameScene object might be initialized with the values of the previous GameScene. Like the position if the user previously disconnected. Closes #146 --- front/src/Phaser/Game/GameScene.ts | 40 ++++++++++++++++++------------ 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 60acf98d..a655be9a 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -81,21 +81,16 @@ export class GameScene extends Phaser.Scene { preload(): void { this.GameManager.setCurrentGameScene(this); this.load.on('filecomplete-tilemapJSON-'+this.MapKey, (key: string, type: string, data: any) => { - // Triggered when the map is loaded - // Load tiles attached to the map recursively - this.map = data.data; - let url = this.MapUrlFile.substr(0, this.MapUrlFile.lastIndexOf('/')); - this.map.tilesets.forEach((tileset) => { - if (typeof tileset.name === 'undefined' || typeof tileset.image === 'undefined') { - console.warn("Don't know how to handle tileset ", tileset) - return; - } - //TODO strategy to add access token - this.load.image(tileset.name, `${url}/${tileset.image}`); - }) + this.onMapLoad(data); }); //TODO strategy to add access token this.load.tilemapTiledJSON(this.MapKey, this.MapUrlFile); + // If the map has already been loaded as part of another GameScene, the "on load" event will not be triggered. + // In this case, we check in the cache to see if the map is here and trigger the event manually. + if (this.cache.tilemap.exists(this.MapKey)) { + let data = this.cache.tilemap.get(this.MapKey); + this.onMapLoad(data); + } //add player png PLAYER_RESOURCES.forEach((playerResource: any) => { @@ -109,6 +104,21 @@ export class GameScene extends Phaser.Scene { this.load.bitmapFont('main_font', 'resources/fonts/arcade.png', 'resources/fonts/arcade.xml'); } + private onMapLoad(data: any): void { + // Triggered when the map is loaded + // Load tiles attached to the map recursively + this.map = data.data; + let url = this.MapUrlFile.substr(0, this.MapUrlFile.lastIndexOf('/')); + this.map.tilesets.forEach((tileset) => { + if (typeof tileset.name === 'undefined' || typeof tileset.image === 'undefined') { + console.warn("Don't know how to handle tileset ", tileset) + return; + } + //TODO strategy to add access token + this.load.image(tileset.name, `${url}/${tileset.image}`); + }) + } + //hook initialisation init(initData : GameSceneInitInterface) { this.initPosition = initData.initPosition; @@ -397,6 +407,8 @@ export class GameScene extends Phaser.Scene { let nextSceneKey = this.checkToExit(); if(nextSceneKey){ + // We are completely destroying the current scene to avoid using a half-backed instance when coming back to the same map. + this.scene.remove(this.scene.key); this.scene.start(nextSceneKey.key); } } @@ -526,9 +538,5 @@ export class GameScene extends Phaser.Scene { let startPos = mapUrlStart.indexOf('://')+3; let endPos = mapUrlStart.indexOf(".json"); return mapUrlStart.substring(startPos, endPos); - - - let tab = mapUrlStart.split("/"); - return tab[tab.length -1].substr(0, tab[tab.length -1].indexOf(".json")); } }