diff options
Diffstat (limited to 'client/src/RemotePlayerEngine.ts')
| -rw-r--r-- | client/src/RemotePlayerEngine.ts | 76 |
1 files changed, 73 insertions, 3 deletions
diff --git a/client/src/RemotePlayerEngine.ts b/client/src/RemotePlayerEngine.ts index f19ebe0..5d85f24 100644 --- a/client/src/RemotePlayerEngine.ts +++ b/client/src/RemotePlayerEngine.ts @@ -1,14 +1,84 @@ import Phaser from 'phaser'; +import type AkkamonStartScene from './scene'; import { akkamonClient } from './app'; +import type { Direction } from './Direction'; +import { + Queue, + RemotePlayerSprite +} from './RemotePlayerSprite'; +import type { + RemoteMovementQueues +} from './events'; export class RemotePlayerEngine { - private scene: Phaser.Scene + private scene: AkkamonStartScene; - constructor(scene: Phaser.Scene) { + private trainerIdToRemotePlayerSprite: Map<string, RemotePlayerSprite> = new Map(); + + constructor(scene: AkkamonStartScene) { this.scene = scene; } - update() { + push(remoteMovementQueues: RemoteMovementQueues) { + this.updateMembers(remoteMovementQueues); + this.pushMovesToSprites(remoteMovementQueues); + } + + pushMovesToSprites(remoteMovementQueues: RemoteMovementQueues) { + this.trainerIdToRemotePlayerSprite.forEach((remoteSprite: RemotePlayerSprite, key: string) => { + remoteSprite.push(remoteMovementQueues[key].value); + }); + } + + update(delta: number): void { + this.trainerIdToRemotePlayerSprite.forEach((remoteSprite: RemotePlayerSprite, key: string) => { + if (remoteSprite.isMoving()) { + console.log("remote player currently walking"); + remoteSprite.updatePixelPosition(delta); + } else if (remoteSprite.hasMovesLeft()) { + console.log("remote player starts moving"); + remoteSprite.startMoving(); + } + }); + } + + updateMembers(newRemoteMovementQueues: RemoteMovementQueues) { + const traineridToQueueValue = newRemoteMovementQueues; + + Object.keys(newRemoteMovementQueues).forEach((key: string) => { + + var moveQueue = traineridToQueueValue[key].value; + if (moveQueue !== undefined) { + + // console.log("-> key: " + key + " has position " + newTilePos.x + ", " + newTilePos.y); + + if (!this.trainerIdToRemotePlayerSprite.has(key)) { + // console.log("adding remote player sprite for " + key); + this.trainerIdToRemotePlayerSprite.set(key, + new RemotePlayerSprite({ + scene: this.scene, + tilePos: new Phaser.Math.Vector2(this.scene.spawnPointTilePos!), + texture: this.scene.textures.get("atlas"), + frame: "misa-front", + moveQueue: new Queue(moveQueue) + } + )); + } else { + // console.log("key: " + key + " already had a sprite!"); + } + } + + }); + + this.trainerIdToRemotePlayerSprite.forEach((value: RemotePlayerSprite, key: string) => { + if (!(key in newRemoteMovementQueues)) { + // console.log("removing remote player sprite for " + key); + this.trainerIdToRemotePlayerSprite.get(key)!.destroy(); + this.trainerIdToRemotePlayerSprite.delete(key); + } else { + // console.log("Player " + key + " was not removed!"); + } + }); } } |
