Adding a special scene to wait for server reconnection
authorDavid Négrier <d.negrier@thecodingmachine.com>
Sat, 23 May 2020 13:43:26 +0000 (15:43 +0200)
committerDavid Négrier <d.negrier@thecodingmachine.com>
Sat, 23 May 2020 13:43:26 +0000 (15:43 +0200)
front/src/Connexion.ts
front/src/Phaser/Game/GameManager.ts
front/src/Phaser/Game/GameScene.ts
front/src/Phaser/Reconnecting/ReconnectingScene.ts [new file with mode: 0644]
front/src/index.ts

index 1b9631296b2ac5c5b6c31a4380521b74040dbd2d..1f4d26cd558aea91011f0b260cb88a601a663c00 100644 (file)
@@ -210,14 +210,14 @@ export class Connexion implements ConnexionInterface {
             });
 
             //if try to reconnect with last position
-            if(this.lastRoom) {
+            /*if(this.lastRoom) {
                 //join the room
                 this.joinARoom(this.lastRoom,
                     this.lastPositionShared ? this.lastPositionShared.x : 0,
                     this.lastPositionShared ? this.lastPositionShared.y : 0,
                     this.lastPositionShared ? this.lastPositionShared.direction : PlayerAnimationNames.WalkDown,
                     this.lastPositionShared ? this.lastPositionShared.moving : false);
-            }
+            }*/
 
             /*if(this.lastPositionShared) {
 
@@ -342,11 +342,13 @@ export class Connexion implements ConnexionInterface {
     disconnectServer(): void {
         this.socket.on(EventMessage.CONNECT_ERROR, () => {
             MessageUI.warningMessage("Trying to connect!");
+            this.GameManager.switchToDisconnectedScene();
         });
 
         this.socket.on(EventMessage.RECONNECT, () => {
             MessageUI.removeMessage();
             this.connectSocketServer();
+            this.GameManager.reconnectToGameScene(this.lastPositionShared);
         });
     }
 
index 6b848aa1aa1dbb908be443346a5c594da0b3340e..7a439fbe40bab019ab95c9027a38acc16343baa1 100644 (file)
@@ -2,12 +2,18 @@ import {GameScene} from "./GameScene";
 import {
     Connexion,
     GroupCreatedUpdatedMessageInterface,
-    ListMessageUserPositionInterface, MessageUserJoined, MessageUserMovedInterface, MessageUserPositionInterface, Point
+    ListMessageUserPositionInterface,
+    MessageUserJoined,
+    MessageUserMovedInterface,
+    MessageUserPositionInterface,
+    Point,
+    PointInterface
 } from "../../Connexion";
 import {SimplePeerInterface, SimplePeer} from "../../WebRtc/SimplePeer";
 import {getMapKeyByUrl} from "../Login/LogincScene";
 import ScenePlugin = Phaser.Scenes.ScenePlugin;
 import {AddPlayerInterface} from "./AddPlayerInterface";
+import {ReconnectingSceneName} from "../Reconnecting/ReconnectingScene";
 
 export enum StatusGameManagerEnum {
     IN_PROGRESS = 1,
@@ -174,6 +180,16 @@ export class GameManager {
         }
         return sceneKey;
     }
+
+    private oldSceneKey : string;
+    switchToDisconnectedScene(): void {
+        this.oldSceneKey = this.currentGameScene.scene.key;
+        this.currentGameScene.scene.start(ReconnectingSceneName);
+    }
+
+    reconnectToGameScene(lastPositionShared: PointInterface) {
+        this.currentGameScene.scene.start(this.oldSceneKey, { initPosition: lastPositionShared });
+    }
 }
 
 export const gameManager = new GameManager();
index 4a003b3340545cdaceb38eca69aa5fdf15a05a33..9aa6ece74fde137a299ec7d4f972a5cf602ce9e5 100644 (file)
@@ -3,7 +3,7 @@ import {
     GroupCreatedUpdatedMessageInterface,
     MessageUserJoined,
     MessageUserMovedInterface,
-    MessageUserPositionInterface
+    MessageUserPositionInterface, PointInterface, PositionInterface
 } from "../../Connexion";
 import {CurrentGamerInterface, GamerInterface, hasMovedEventName, Player} from "../Player/Player";
 import { DEBUG_MODE, RESOLUTION, ROOM, ZOOM_LEVEL} from "../../Enum/EnvironmentVariable";
@@ -19,6 +19,10 @@ export enum Textures {
     Player = "male1"
 }
 
+interface GameSceneInitInterface {
+    initPosition: PointInterface|null
+}
+
 export class GameScene extends Phaser.Scene {
     GameManager : GameManager;
     Terrains : Array<Phaser.Tilemaps.Tileset>;
@@ -33,6 +37,7 @@ export class GameScene extends Phaser.Scene {
     startX = 704;// 22 case
     startY = 32; // 1 case
     circleTexture: CanvasTexture;
+    initPosition: PositionInterface;
 
     MapKey: string;
     MapUrlFile: string;
@@ -85,7 +90,9 @@ export class GameScene extends Phaser.Scene {
     }
 
     //hook initialisation
-    init() {}
+    init(initData : GameSceneInitInterface) {
+        this.initPosition = initData.initPosition;
+    }
 
     //hook create scene
     create(): void {
@@ -209,7 +216,13 @@ export class GameScene extends Phaser.Scene {
     /**
      * @param layer
      */
-    private startUser(layer: ITiledMapLayer){
+    private startUser(layer: ITiledMapLayer): void {
+        if (this.initPosition !== undefined) {
+            this.startX = this.initPosition.x;
+            this.startY = this.initPosition.y;
+            return;
+        }
+
         let tiles : any = layer.data;
         tiles.forEach((objectKey : number, key: number) => {
             if(objectKey === 0){
diff --git a/front/src/Phaser/Reconnecting/ReconnectingScene.ts b/front/src/Phaser/Reconnecting/ReconnectingScene.ts
new file mode 100644 (file)
index 0000000..02e9f32
--- /dev/null
@@ -0,0 +1,38 @@
+import {gameManager} from "../Game/GameManager";
+import {TextField} from "../Components/TextField";
+import {TextInput} from "../Components/TextInput";
+import {ClickButton} from "../Components/ClickButton";
+import Image = Phaser.GameObjects.Image;
+import Rectangle = Phaser.GameObjects.Rectangle;
+import {PLAYER_RESOURCES} from "../Entity/PlayableCaracter";
+import {cypressAsserter} from "../../Cypress/CypressAsserter";
+
+export const ReconnectingSceneName = "ReconnectingScene";
+enum ReconnectingTextures {
+    icon = "icon",
+    mainFont = "main_font"
+}
+
+export class ReconnectingScene extends Phaser.Scene {
+    private reconnectingField: TextField;
+    private logo: Image;
+
+    constructor() {
+        super({
+            key: ReconnectingSceneName
+        });
+    }
+
+    preload() {
+        this.load.image(ReconnectingTextures.icon, "resources/logos/tcm_full.png");
+        // Note: arcade.png from the Phaser 3 examples at: https://github.com/photonstorm/phaser3-examples/tree/master/public/assets/fonts/bitmap
+        this.load.bitmapFont(ReconnectingTextures.mainFont, 'resources/fonts/arcade.png', 'resources/fonts/arcade.xml');
+    }
+
+    create() {
+        this.logo = new Image(this, this.game.renderer.width - 30, this.game.renderer.height - 20, ReconnectingTextures.icon);
+        this.add.existing(this.logo);
+
+        this.reconnectingField = new TextField(this, 10, this.game.renderer.height - 35, "Connection lost. Reconnecting...");
+    }
+}
index e6c8ce40eed1073ff66caeffc3520de0fefbb12c..2ab8d91a0cad3fd491831450d6b5850fa29c748d 100644 (file)
@@ -3,13 +3,15 @@ import GameConfig = Phaser.Types.Core.GameConfig;
 import {DEBUG_MODE, RESOLUTION} from "./Enum/EnvironmentVariable";
 import {cypressAsserter} from "./Cypress/CypressAsserter";
 import {LogincScene} from "./Phaser/Login/LogincScene";
+import {ReconnectingScene} from "./Phaser/Reconnecting/ReconnectingScene";
+import {gameManager} from "./Phaser/Game/GameManager";
 
 const config: GameConfig = {
     title: "Office game",
     width: window.innerWidth / RESOLUTION,
     height: window.innerHeight / RESOLUTION,
     parent: "game",
-    scene: [LogincScene],
+    scene: [LogincScene, ReconnectingScene],
     zoom: RESOLUTION,
     physics: {
         default: "arcade",