diff --git a/front/src/Enum/EnvironmentVariable.ts b/front/src/Enum/EnvironmentVariable.ts index 30250d5e..b646d64b 100644 --- a/front/src/Enum/EnvironmentVariable.ts +++ b/front/src/Enum/EnvironmentVariable.ts @@ -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 } diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 41f6f212..26978c4b 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -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 = new Array(); 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){