Sending position only every 200ms while moving
authorDavid Négrier <d.negrier@thecodingmachine.com>
Mon, 1 Jun 2020 20:42:18 +0000 (22:42 +0200)
committerDavid Négrier <d.negrier@thecodingmachine.com>
Mon, 1 Jun 2020 20:42:18 +0000 (22:42 +0200)
front/src/Enum/EnvironmentVariable.ts
front/src/Phaser/Game/GameScene.ts

index 30250d5edda5096491888c71d64dce699e635030..b646d64bfe8a1f02fe043f0c6b8c43560570c655 100644 (file)
@@ -1,13 +1,13 @@
 const DEBUG_MODE: boolean = process.env.DEBUG_MODE as any === true;
 const API_URL = process.env.API_URL || "http://api.workadventure.localhost";
-const ROOM = [process.env.ROOM || "THECODINGMACHINE"];
 const RESOLUTION = 3;
 const ZOOM_LEVEL = 1/*3/4*/;
+const POSITION_DELAY = 200; // Wait 200ms between sending position events
 
 export {
     DEBUG_MODE,
     API_URL,
     RESOLUTION,
     ZOOM_LEVEL,
-    ROOM
+    POSITION_DELAY
 }
index 41f6f212e2f957ccefe0dad35b0641c52411748b..26978c4b8fa4eb9f5b58676f41fc930d6be7bfc4 100644 (file)
@@ -5,7 +5,7 @@ import {
     MessageUserPositionInterface, PointInterface, PositionInterface
 } from "../../Connection";
 import {CurrentGamerInterface, GamerInterface, hasMovedEventName, Player} from "../Player/Player";
-import { DEBUG_MODE, ZOOM_LEVEL} from "../../Enum/EnvironmentVariable";
+import { DEBUG_MODE, ZOOM_LEVEL, POSITION_DELAY } from "../../Enum/EnvironmentVariable";
 import {ITiledMap, ITiledMapLayer, ITiledTileSet} from "../Map/ITiledMap";
 import {PLAYER_RESOURCES} from "../Entity/PlayableCaracter";
 import Texture = Phaser.Textures.Texture;
@@ -43,6 +43,15 @@ export class GameScene extends Phaser.Scene {
     RoomId: string;
     instance: string;
 
+    currentTick: number;
+    lastSentTick: number; // The last tick at which a position was sent.
+    lastMoveEventSent: HasMovedEvent = {
+        direction: '',
+        moving: false,
+        x: -1000,
+        y: -1000
+    }
+
     PositionNextScene: Array<any> = new Array<any>();
 
     static createFromUrl(mapUrlFile: string, instance: string): GameScene {
@@ -323,6 +332,34 @@ export class GameScene extends Phaser.Scene {
     }
 
     pushPlayerPosition(event: HasMovedEvent) {
+        if (this.lastMoveEventSent === event) {
+            return;
+        }
+
+        // If the player is not moving, let's send the info right now.
+        if (event.moving === false) {
+            this.doPushPlayerPosition(event);
+            return;
+        }
+
+        // If the player is moving, and if it changed direction, let's send an event
+        if (event.direction !== this.lastMoveEventSent.direction) {
+            this.doPushPlayerPosition(event);
+            return;
+        }
+
+        // If more than 200ms happened since last event sent
+        if (this.currentTick - this.lastSentTick >= POSITION_DELAY) {
+            this.doPushPlayerPosition(event);
+            return;
+        }
+
+        // Otherwise, do nothing.
+    }
+
+    private doPushPlayerPosition(event: HasMovedEvent): void {
+        this.lastMoveEventSent = event;
+        this.lastSentTick = this.currentTick;
         this.GameManager.pushPlayerPosition(event);
     }
 
@@ -342,6 +379,7 @@ export class GameScene extends Phaser.Scene {
      * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
      */
     update(time: number, delta: number) : void {
+        this.currentTick = time;
         this.CurrentPlayer.moveUser(delta);
         let nextSceneKey = this.checkToExit();
         if(nextSceneKey){