GameState is now save in cache
HasPlayerMoved is send when the player is actually moving on the map every 200ms.
This commit is contained in:
parent
8cef4f6e90
commit
3edfd5b285
13 changed files with 404 additions and 100 deletions
|
@ -90,9 +90,9 @@ import { TextUtils } from "../Components/TextUtils";
|
|||
import { touchScreenManager } from "../../Touch/TouchScreenManager";
|
||||
import { PinchManager } from "../UserInput/PinchManager";
|
||||
import { joystickBaseImg, joystickBaseKey, joystickThumbImg, joystickThumbKey } from "../Components/MobileJoystick";
|
||||
import { PlayerStateObject } from '../../Api/Events/ApiGameStateEvent';
|
||||
//import { PlayerStateObject } from '../../Api/Events/GameStateEvent';
|
||||
import { waScaleManager } from "../Services/WaScaleManager";
|
||||
import { HasMovedEvent } from '../../Api/Events/HasMovedEvent';
|
||||
import { HasPlayerMovedEvent } from '../../Api/Events/HasPlayerMovedEvent';
|
||||
|
||||
export interface GameSceneInitInterface {
|
||||
initPosition: PointInterface | null,
|
||||
|
@ -164,7 +164,7 @@ export class GameScene extends DirtyScene implements CenterListener {
|
|||
|
||||
currentTick!: number;
|
||||
lastSentTick!: number; // The last tick at which a position was sent.
|
||||
lastMoveEventSent: HasMovedEvent = {
|
||||
lastMoveEventSent: HasPlayerMovedEvent = {
|
||||
direction: '',
|
||||
moving: false,
|
||||
x: -1000,
|
||||
|
@ -632,11 +632,11 @@ export class GameScene extends DirtyScene implements CenterListener {
|
|||
|
||||
//listen event to share position of user
|
||||
this.CurrentPlayer.on(hasMovedEventName, this.pushPlayerPosition.bind(this))
|
||||
this.CurrentPlayer.on(hasMovedEventName, (event: HasMovedEvent) => {
|
||||
iframeListener.hasMovedEvent(event)
|
||||
this.CurrentPlayer.on(hasMovedEventName, (event: HasPlayerMovedEvent) => {
|
||||
//iframeListener.hasMovedEvent(event)
|
||||
})
|
||||
this.CurrentPlayer.on(hasMovedEventName, this.outlineItem.bind(this))
|
||||
this.CurrentPlayer.on(hasMovedEventName, (event: HasMovedEvent) => {
|
||||
this.CurrentPlayer.on(hasMovedEventName, (event: HasPlayerMovedEvent) => {
|
||||
this.gameMap.setPosition(event.x, event.y);
|
||||
})
|
||||
|
||||
|
@ -870,7 +870,7 @@ ${escapedMessage}
|
|||
this.userInputManager.restoreControls();
|
||||
}));
|
||||
this.iframeSubscriptionList.push(iframeListener.gameStateStream.subscribe(() => {
|
||||
const playerObject: PlayerStateObject = {
|
||||
/*const playerObject: PlayerStateObject = {
|
||||
[this.playerName]: {
|
||||
position: {
|
||||
x: this.CurrentPlayer.x,
|
||||
|
@ -889,15 +889,12 @@ ${escapedMessage}
|
|||
pusherId: remotePlayer.userId
|
||||
|
||||
}
|
||||
}
|
||||
}*/
|
||||
iframeListener.sendFrozenGameStateEvent({
|
||||
mapUrl: this.MapUrlFile,
|
||||
nickName: this.playerName,
|
||||
startLayerName: this.startLayerName,
|
||||
uuid: localUserStore.getLocalUser()?.uuid,
|
||||
roomId: this.RoomId,
|
||||
data: this.mapFile,
|
||||
players: playerObject
|
||||
})
|
||||
}));
|
||||
|
||||
|
@ -1158,7 +1155,7 @@ ${escapedMessage}
|
|||
this.createCollisionWithPlayer();
|
||||
}
|
||||
|
||||
pushPlayerPosition(event: HasMovedEvent) {
|
||||
pushPlayerPosition(event: HasPlayerMovedEvent) {
|
||||
if (this.lastMoveEventSent === event) {
|
||||
return;
|
||||
}
|
||||
|
@ -1188,7 +1185,7 @@ ${escapedMessage}
|
|||
* Finds the correct item to outline and outline it (if there is an item to be outlined)
|
||||
* @param event
|
||||
*/
|
||||
private outlineItem(event: HasMovedEvent): void {
|
||||
private outlineItem(event: HasPlayerMovedEvent): void {
|
||||
let x = event.x;
|
||||
let y = event.y;
|
||||
switch (event.direction) {
|
||||
|
@ -1227,7 +1224,7 @@ ${escapedMessage}
|
|||
this.outlinedItem?.selectable();
|
||||
}
|
||||
|
||||
private doPushPlayerPosition(event: HasMovedEvent): void {
|
||||
private doPushPlayerPosition(event: HasPlayerMovedEvent): void {
|
||||
this.lastMoveEventSent = event;
|
||||
this.lastSentTick = this.currentTick;
|
||||
const camera = this.cameras.main;
|
||||
|
@ -1237,6 +1234,7 @@ ${escapedMessage}
|
|||
right: camera.scrollX + camera.width,
|
||||
bottom: camera.scrollY + camera.height,
|
||||
});
|
||||
iframeListener.hasPlayerMoved(event);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1286,7 +1284,7 @@ ${escapedMessage}
|
|||
}
|
||||
// Let's move all users
|
||||
const updatedPlayersPositions = this.playersPositionInterpolator.getUpdatedPositions(time);
|
||||
updatedPlayersPositions.forEach((moveEvent: HasMovedEvent, userId: number) => {
|
||||
updatedPlayersPositions.forEach((moveEvent: HasPlayerMovedEvent, userId: number) => {
|
||||
this.dirty = true;
|
||||
const player: RemotePlayer | undefined = this.MapPlayersByKey.get(userId);
|
||||
if (player === undefined) {
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
|
||||
import { MAX_EXTRAPOLATION_TIME } from "../../Enum/EnvironmentVariable";
|
||||
import { PositionInterface } from "../../Connexion/ConnexionModels";
|
||||
import { HasMovedEvent } from '../../Api/Events/HasMovedEvent';
|
||||
import { HasPlayerMovedEvent } from '../../Api/Events/HasPlayerMovedEvent';
|
||||
|
||||
export class PlayerMovement {
|
||||
public constructor(private startPosition: PositionInterface, private startTick: number, private endPosition: HasMovedEvent, private endTick: number) {
|
||||
public constructor(private startPosition: PositionInterface, private startTick: number, private endPosition: HasPlayerMovedEvent, private endTick: number) {
|
||||
}
|
||||
|
||||
public isOutdated(tick: number): boolean {
|
||||
|
@ -18,7 +18,7 @@ export class PlayerMovement {
|
|||
return tick > this.endTick + MAX_EXTRAPOLATION_TIME;
|
||||
}
|
||||
|
||||
public getPosition(tick: number): HasMovedEvent {
|
||||
public getPosition(tick: number): HasPlayerMovedEvent {
|
||||
// Special case: end position reached and end position is not moving
|
||||
if (tick >= this.endTick && this.endPosition.moving === false) {
|
||||
//console.log('Movement finished ', this.endPosition)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* This class is in charge of computing the position of all players.
|
||||
* Player movement is delayed by 200ms so position depends on ticks.
|
||||
*/
|
||||
import { HasMovedEvent } from '../../Api/Events/HasMovedEvent';
|
||||
import { HasPlayerMovedEvent } from '../../Api/Events/HasPlayerMovedEvent';
|
||||
import { PlayerMovement } from "./PlayerMovement";
|
||||
|
||||
export class PlayersPositionInterpolator {
|
||||
|
@ -16,8 +16,8 @@ export class PlayersPositionInterpolator {
|
|||
this.playerMovements.delete(userId);
|
||||
}
|
||||
|
||||
getUpdatedPositions(tick: number): Map<number, HasMovedEvent> {
|
||||
const positions = new Map<number, HasMovedEvent>();
|
||||
getUpdatedPositions(tick: number): Map<number, HasPlayerMovedEvent> {
|
||||
const positions = new Map<number, HasPlayerMovedEvent>();
|
||||
this.playerMovements.forEach((playerMovement: PlayerMovement, userId: number) => {
|
||||
if (playerMovement.isOutdated(tick)) {
|
||||
//console.log("outdated")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue