diff --git a/front/src/Phaser/Game/CameraManager.ts b/front/src/Phaser/Game/CameraManager.ts index 589b0a6a..63e4f1be 100644 --- a/front/src/Phaser/Game/CameraManager.ts +++ b/front/src/Phaser/Game/CameraManager.ts @@ -20,6 +20,18 @@ export enum CameraMode { Focus = "Focus", } +export enum CameraManagerEvent { + CameraUpdate = "CameraUpdate", +} + +export interface CameraManagerEventCameraUpdateData { + x: number; + y: number; + width: number; + height: number; + zoom: number; +} + export class CameraManager extends Phaser.Events.EventEmitter { private scene: GameScene; private camera: Phaser.Cameras.Scene2D.Camera; @@ -78,6 +90,7 @@ export class CameraManager extends Phaser.Events.EventEmitter { (camera, progress, x, y) => { if (this.cameraMode === CameraMode.Positioned) { this.waScaleManager.zoomModifier = currentZoomModifier + progress * zoomModifierChange; + this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData()); } if (progress === 1) { this.playerToFollow?.once(hasMovedEventName, () => { @@ -125,6 +138,7 @@ export class CameraManager extends Phaser.Events.EventEmitter { true, (camera, progress, x, y) => { this.waScaleManager.zoomModifier = currentZoomModifier + progress * zoomModifierChange; + this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData()); } ); } @@ -157,6 +171,7 @@ export class CameraManager extends Phaser.Events.EventEmitter { const shiftY = (this.playerToFollow.y - this.camera.worldView.height * 0.5 - oldPos.y) * tween.getValue(); this.camera.setScroll(oldPos.x + shiftX, oldPos.y + shiftY); + this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData()); }, onComplete: () => { this.camera.startFollow(player, true); @@ -205,6 +220,7 @@ export class CameraManager extends Phaser.Events.EventEmitter { ease: Easing.SineEaseOut, onUpdate: (tween: Phaser.Tweens.Tween) => { this.waScaleManager.zoomModifier = tween.getValue(); + this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData()); }, }); } @@ -222,7 +238,26 @@ export class CameraManager extends Phaser.Events.EventEmitter { return; } this.camera.centerOn(focusOn.x + focusOn.width * 0.5, focusOn.y + focusOn.height * 0.5); + this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData()); } ); + + this.camera.on("followupdate", () => { + this.sendCameraUpdateEvent(); + }); + } + + private sendCameraUpdateEvent(): void { + this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData()); + } + + private getCameraUpdateEventData(): CameraManagerEventCameraUpdateData { + return { + x: this.camera.worldView.x, + y: this.camera.worldView.y, + width: this.camera.worldView.width, + height: this.camera.worldView.height, + zoom: this.camera.scaleManager.zoom, + }; } } diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index e71a35a3..d4f368d4 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -65,7 +65,7 @@ import type { ActionableItem } from "../Items/ActionableItem"; import type { ItemFactoryInterface } from "../Items/ItemFactoryInterface"; import type { ITiledMap, ITiledMapLayer, ITiledMapProperty, ITiledMapObject, ITiledTileSet } from "../Map/ITiledMap"; import type { AddPlayerInterface } from "./AddPlayerInterface"; -import { CameraManager } from "./CameraManager"; +import { CameraManager, CameraManagerEvent, CameraManagerEventCameraUpdateData } from "./CameraManager"; import type { HasPlayerMovedEvent } from "../../Api/Events/HasPlayerMovedEvent"; import type { Character } from "../Entity/Character"; @@ -1102,28 +1102,31 @@ ${escapedMessage} this.iframeSubscriptionList.push( iframeListener.trackCameraUpdateStream.subscribe(() => { if (!this.firstCameraUpdateSent) { - this.cameras.main.on("followupdate", (camera: Camera) => { - const cameraEvent: WasCameraUpdatedEvent = { - x: camera.worldView.x, - y: camera.worldView.y, - width: camera.worldView.width, - height: camera.worldView.height, - zoom: camera.scaleManager.zoom, - }; - if ( - this.lastCameraEvent?.x == cameraEvent.x && - this.lastCameraEvent?.y == cameraEvent.y && - this.lastCameraEvent?.width == cameraEvent.width && - this.lastCameraEvent?.height == cameraEvent.height && - this.lastCameraEvent?.zoom == cameraEvent.zoom - ) { - return; - } + this.cameraManager.on( + CameraManagerEvent.CameraUpdate, + (data: CameraManagerEventCameraUpdateData) => { + const cameraEvent: WasCameraUpdatedEvent = { + x: data.x, + y: data.y, + width: data.width, + height: data.height, + zoom: data.zoom, + }; + if ( + this.lastCameraEvent?.x == cameraEvent.x && + this.lastCameraEvent?.y == cameraEvent.y && + this.lastCameraEvent?.width == cameraEvent.width && + this.lastCameraEvent?.height == cameraEvent.height && + this.lastCameraEvent?.zoom == cameraEvent.zoom + ) { + return; + } - this.lastCameraEvent = cameraEvent; - iframeListener.sendCameraUpdated(cameraEvent); - this.firstCameraUpdateSent = true; - }); + this.lastCameraEvent = cameraEvent; + iframeListener.sendCameraUpdated(cameraEvent); + this.firstCameraUpdateSent = true; + } + ); iframeListener.sendCameraUpdated(this.cameras.main); } diff --git a/maps/tests/CameraApi/script.php b/maps/tests/CameraApi/script.php index 2db030f3..d8fb03a7 100644 --- a/maps/tests/CameraApi/script.php +++ b/maps/tests/CameraApi/script.php @@ -4,7 +4,8 @@