handle instant camera view change
This commit is contained in:
parent
c2b2385e96
commit
17e9c3c586
1 changed files with 38 additions and 16 deletions
|
@ -81,10 +81,22 @@ export class CameraManager extends Phaser.Events.EventEmitter {
|
||||||
}
|
}
|
||||||
this.setCameraMode(CameraMode.Positioned);
|
this.setCameraMode(CameraMode.Positioned);
|
||||||
this.waScaleManager.saveZoom();
|
this.waScaleManager.saveZoom();
|
||||||
const currentZoomModifier = this.waScaleManager.zoomModifier;
|
|
||||||
const zoomModifierChange =
|
|
||||||
setTo.width && setTo.height ? this.getZoomModifierChange(setTo.width, setTo.height) : 0;
|
|
||||||
this.camera.stopFollow();
|
this.camera.stopFollow();
|
||||||
|
|
||||||
|
const currentZoomModifier = this.waScaleManager.zoomModifier;
|
||||||
|
const zoomModifierChange = this.getZoomModifierChange(setTo.width, setTo.height);
|
||||||
|
|
||||||
|
if (duration === 0) {
|
||||||
|
this.waScaleManager.zoomModifier = currentZoomModifier + zoomModifierChange;
|
||||||
|
this.camera.centerOn(setTo.x, setTo.y);
|
||||||
|
this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData());
|
||||||
|
this.playerToFollow?.once(hasMovedEventName, () => {
|
||||||
|
if (this.playerToFollow) {
|
||||||
|
this.startFollowPlayer(this.playerToFollow, duration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.camera.pan(setTo.x, setTo.y, duration, Easing.SineEaseOut, true, (camera, progress, x, y) => {
|
this.camera.pan(setTo.x, setTo.y, duration, Easing.SineEaseOut, true, (camera, progress, x, y) => {
|
||||||
if (this.cameraMode === CameraMode.Positioned) {
|
if (this.cameraMode === CameraMode.Positioned) {
|
||||||
this.waScaleManager.zoomModifier = currentZoomModifier + progress * zoomModifierChange;
|
this.waScaleManager.zoomModifier = currentZoomModifier + progress * zoomModifierChange;
|
||||||
|
@ -100,12 +112,6 @@ export class CameraManager extends Phaser.Events.EventEmitter {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private getZoomModifierChange(width: number, height: number): number {
|
|
||||||
const targetZoomModifier = this.waScaleManager.getTargetZoomModifierFor(width, height);
|
|
||||||
const currentZoomModifier = this.waScaleManager.zoomModifier;
|
|
||||||
return targetZoomModifier - currentZoomModifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set camera to focus mode. As long as the camera is in the Focus mode, its view cannot be changed.
|
* Set camera to focus mode. As long as the camera is in the Focus mode, its view cannot be changed.
|
||||||
* @param setTo Viewport on which the camera should focus on
|
* @param setTo Viewport on which the camera should focus on
|
||||||
|
@ -115,19 +121,23 @@ export class CameraManager extends Phaser.Events.EventEmitter {
|
||||||
this.setCameraMode(CameraMode.Focus);
|
this.setCameraMode(CameraMode.Focus);
|
||||||
this.waScaleManager.saveZoom();
|
this.waScaleManager.saveZoom();
|
||||||
this.waScaleManager.setFocusTarget(focusOn);
|
this.waScaleManager.setFocusTarget(focusOn);
|
||||||
|
|
||||||
this.cameraLocked = true;
|
this.cameraLocked = true;
|
||||||
|
|
||||||
this.unlockCameraWithDelay(duration);
|
this.unlockCameraWithDelay(duration);
|
||||||
this.restoreZoomTween?.stop();
|
this.restoreZoomTween?.stop();
|
||||||
this.startFollowTween?.stop();
|
this.startFollowTween?.stop();
|
||||||
const marginMult = 1 + margin;
|
|
||||||
const currentZoomModifier = this.waScaleManager.zoomModifier;
|
|
||||||
const zoomModifierChange =
|
|
||||||
focusOn.width && focusOn.height
|
|
||||||
? this.getZoomModifierChange(focusOn.width * marginMult, focusOn.height * marginMult)
|
|
||||||
: 0;
|
|
||||||
this.camera.stopFollow();
|
this.camera.stopFollow();
|
||||||
this.playerToFollow = undefined;
|
this.playerToFollow = undefined;
|
||||||
|
|
||||||
|
const currentZoomModifier = this.waScaleManager.zoomModifier;
|
||||||
|
const zoomModifierChange = this.getZoomModifierChange(focusOn.width, focusOn.height, 1 + margin);
|
||||||
|
|
||||||
|
if (duration === 0) {
|
||||||
|
this.waScaleManager.zoomModifier = currentZoomModifier + zoomModifierChange;
|
||||||
|
this.camera.centerOn(focusOn.x, focusOn.y);
|
||||||
|
this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData());
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.camera.pan(focusOn.x, focusOn.y, duration, Easing.SineEaseOut, true, (camera, progress, x, y) => {
|
this.camera.pan(focusOn.x, focusOn.y, duration, Easing.SineEaseOut, true, (camera, progress, x, y) => {
|
||||||
this.waScaleManager.zoomModifier = currentZoomModifier + progress * zoomModifierChange;
|
this.waScaleManager.zoomModifier = currentZoomModifier + progress * zoomModifierChange;
|
||||||
this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData());
|
this.emit(CameraManagerEvent.CameraUpdate, this.getCameraUpdateEventData());
|
||||||
|
@ -192,6 +202,18 @@ export class CameraManager extends Phaser.Events.EventEmitter {
|
||||||
return this.cameraLocked;
|
return this.cameraLocked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private getZoomModifierChange(width?: number, height?: number, multiplier: number = 1): number {
|
||||||
|
if (!width || !height) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
const targetZoomModifier = this.waScaleManager.getTargetZoomModifierFor(
|
||||||
|
width * multiplier,
|
||||||
|
height * multiplier
|
||||||
|
);
|
||||||
|
const currentZoomModifier = this.waScaleManager.zoomModifier;
|
||||||
|
return targetZoomModifier - currentZoomModifier;
|
||||||
|
}
|
||||||
|
|
||||||
private unlockCameraWithDelay(delay: number): void {
|
private unlockCameraWithDelay(delay: number): void {
|
||||||
this.scene.time.delayedCall(delay, () => {
|
this.scene.time.delayedCall(delay, () => {
|
||||||
this.cameraLocked = false;
|
this.cameraLocked = false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue