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 @@