Adding PlayersPositionInterpolator to interpolate/extrapolate players positions
This commit is contained in:
parent
d69ce8a6a6
commit
d72e60610e
4 changed files with 97 additions and 14 deletions
|
@ -13,6 +13,8 @@ import Sprite = Phaser.GameObjects.Sprite;
|
|||
import CanvasTexture = Phaser.Textures.CanvasTexture;
|
||||
import {AddPlayerInterface} from "./AddPlayerInterface";
|
||||
import {PlayerAnimationNames} from "../Player/Animation";
|
||||
import {PlayerMovement} from "./PlayerMovement";
|
||||
import {PlayersPositionInterpolator} from "./PlayersPositionInterpolator";
|
||||
|
||||
export enum Textures {
|
||||
Player = "male1"
|
||||
|
@ -37,6 +39,7 @@ export class GameScene extends Phaser.Scene {
|
|||
startY = 32; // 1 case
|
||||
circleTexture: CanvasTexture;
|
||||
initPosition: PositionInterface;
|
||||
private playersPositionInterpolator = new PlayersPositionInterpolator();
|
||||
|
||||
MapKey: string;
|
||||
MapUrlFile: string;
|
||||
|
@ -381,6 +384,17 @@ export class GameScene extends Phaser.Scene {
|
|||
update(time: number, delta: number) : void {
|
||||
this.currentTick = time;
|
||||
this.CurrentPlayer.moveUser(delta);
|
||||
|
||||
// Let's move all users
|
||||
let updatedPlayersPositions = this.playersPositionInterpolator.getUpdatedPositions(time);
|
||||
updatedPlayersPositions.forEach((moveEvent: HasMovedEvent, userId: string) => {
|
||||
let player : GamerInterface | undefined = this.MapPlayersByKey.get(userId);
|
||||
if (player === undefined) {
|
||||
throw new Error('Cannot find player with ID "' + userId +'"');
|
||||
}
|
||||
player.updatePosition(moveEvent);
|
||||
});
|
||||
|
||||
let nextSceneKey = this.checkToExit();
|
||||
if(nextSceneKey){
|
||||
this.scene.start(nextSceneKey.key);
|
||||
|
@ -424,15 +438,6 @@ export class GameScene extends Phaser.Scene {
|
|||
});
|
||||
}
|
||||
|
||||
private findPlayerInMap(UserId : string) : GamerInterface | null{
|
||||
return this.MapPlayersByKey.get(UserId);
|
||||
/*let player = this.MapPlayers.getChildren().find((player: Player) => UserId === player.userId);
|
||||
if(!player){
|
||||
return null;
|
||||
}
|
||||
return (player as GamerInterface);*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new player
|
||||
*/
|
||||
|
@ -475,6 +480,7 @@ export class GameScene extends Phaser.Scene {
|
|||
player.destroy();
|
||||
this.MapPlayers.remove(player);
|
||||
this.MapPlayersByKey.delete(userId);
|
||||
this.playersPositionInterpolator.removePlayer(userId);
|
||||
}
|
||||
|
||||
updatePlayerPosition(message: MessageUserMovedInterface): void {
|
||||
|
@ -482,7 +488,11 @@ export class GameScene extends Phaser.Scene {
|
|||
if (player === undefined) {
|
||||
throw new Error('Cannot find player with ID "' + message.userId +'"');
|
||||
}
|
||||
player.updatePosition(message.position);
|
||||
|
||||
// We do not update the player position directly (because it is sent only every 200ms).
|
||||
// Instead we use the PlayersPositionInterpolator that will do a smooth animation over the next 200ms.
|
||||
let playerMovement = new PlayerMovement({ x: player.x, y: player.y }, this.currentTick, message.position, this.currentTick + POSITION_DELAY);
|
||||
this.playersPositionInterpolator.updatePlayerPosition(player.userId, playerMovement);
|
||||
}
|
||||
|
||||
shareGroupPosition(groupPositionMessage: GroupCreatedUpdatedMessageInterface) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue