diff --git a/front/src/Phaser/Game/CameraManager.ts b/front/src/Phaser/Game/CameraManager.ts index 19c4821a..b5de87d2 100644 --- a/front/src/Phaser/Game/CameraManager.ts +++ b/front/src/Phaser/Game/CameraManager.ts @@ -19,10 +19,12 @@ export class CameraManager extends Phaser.Events.EventEmitter { private cameraMode: CameraMode = CameraMode.Free; + private cameraLockedDelayedCall: Phaser.Time.TimerEvent | undefined; private restoreZoomTween?: Phaser.Tweens.Tween; private startFollowTween?: Phaser.Tweens.Tween; private cameraFollowTarget?: { x: number; y: number }; + private cameraLocked: boolean; constructor(scene: GameScene, cameraBounds: { x: number; y: number }, waScaleManager: WaScaleManager) { super(); @@ -30,6 +32,7 @@ export class CameraManager extends Phaser.Events.EventEmitter { this.camera = scene.cameras.main; this.cameraBounds = cameraBounds; + this.cameraLocked = false; this.waScaleManager = waScaleManager; @@ -56,6 +59,8 @@ export class CameraManager extends Phaser.Events.EventEmitter { this.waScaleManager.saveZoom(); this.waScaleManager.setFocusTarget(focusOn); + this.cameraLocked = true; + this.unlockCameraWithDelay(duration); this.restoreZoomTween?.stop(); this.startFollowTween?.stop(); const marginMult = 1 + margin; @@ -79,10 +84,12 @@ export class CameraManager extends Phaser.Events.EventEmitter { ); } - public leaveFocusMode(player: Player): void { + public leaveFocusMode(player: Player, duration = 0): void { + this.cameraLocked = false; this.waScaleManager.setFocusTarget(); - this.startFollow(player, 1000); - this.restoreZoom(1000); + this.unlockCameraWithDelay(duration); + this.startFollow(player, duration); + this.restoreZoom(duration); } public startFollow(target: object | Phaser.GameObjects.GameObject, duration: number = 0): void { @@ -132,7 +139,13 @@ export class CameraManager extends Phaser.Events.EventEmitter { } public isCameraLocked(): boolean { - return this.cameraMode === CameraMode.Focus; + return this.cameraLocked; + } + + private unlockCameraWithDelay(delay: number): void { + this.scene.time.delayedCall(delay, () => { + this.cameraLocked = false; + }); } private setCameraMode(mode: CameraMode): void { diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 740de4c1..f1f5389e 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -855,7 +855,7 @@ export class GameScene extends DirtyScene { for (const zone of zones) { const focusable = zone.properties?.find((property) => property.name === "focusable"); if (focusable && focusable.value === true) { - this.cameraManager.leaveFocusMode(this.CurrentPlayer); + this.cameraManager.leaveFocusMode(this.CurrentPlayer, 1000); break; } } diff --git a/maps/tests/focusable_zone_map.json b/maps/tests/focusable_zone_map.json index 8a9aa6af..e5745929 100644 --- a/maps/tests/focusable_zone_map.json +++ b/maps/tests/focusable_zone_map.json @@ -162,7 +162,7 @@ { "name":"zoom_margin", "type":"float", - "value":3 + "value":0 }], "rotation":0, "type":"zone",