86 lines
2.2 KiB
TypeScript
86 lines
2.2 KiB
TypeScript
import Phaser from "phaser";
|
|
import { TILE_SIZE } from "../../core/constants";
|
|
import { GAME_CONFIG } from "../../core/config/GameConfig";
|
|
|
|
/**
|
|
* Manages camera controls including zoom, panning, and follow mode.
|
|
* Extracted from GameScene to reduce complexity and improve testability.
|
|
*/
|
|
export class CameraController {
|
|
private camera: Phaser.Cameras.Scene2D.Camera;
|
|
private followMode: boolean = true;
|
|
|
|
constructor(camera: Phaser.Cameras.Scene2D.Camera) {
|
|
this.camera = camera;
|
|
}
|
|
|
|
/**
|
|
* Enable follow mode - camera will track the target entity
|
|
*/
|
|
enableFollowMode(): void {
|
|
this.followMode = true;
|
|
}
|
|
|
|
/**
|
|
* Disable follow mode - camera stays at current position
|
|
*/
|
|
disableFollowMode(): void {
|
|
this.followMode = false;
|
|
}
|
|
|
|
/**
|
|
* Check if camera is in follow mode
|
|
*/
|
|
get isFollowing(): boolean {
|
|
return this.followMode;
|
|
}
|
|
|
|
/**
|
|
* Center camera on a specific world position (in pixels)
|
|
*/
|
|
centerOn(worldX: number, worldY: number): void {
|
|
this.camera.centerOn(worldX, worldY);
|
|
}
|
|
|
|
/**
|
|
* Center camera on a tile position
|
|
*/
|
|
centerOnTile(tileX: number, tileY: number): void {
|
|
const worldX = tileX * TILE_SIZE + TILE_SIZE / 2;
|
|
const worldY = tileY * TILE_SIZE + TILE_SIZE / 2;
|
|
this.camera.centerOn(worldX, worldY);
|
|
}
|
|
|
|
/**
|
|
* Handle mouse wheel zoom
|
|
* @param deltaY - Wheel delta (positive = zoom out, negative = zoom in)
|
|
*/
|
|
handleWheel(deltaY: number): void {
|
|
const zoomDir = deltaY > 0 ? -1 : 1;
|
|
const newZoom = Phaser.Math.Clamp(
|
|
this.camera.zoom + zoomDir * GAME_CONFIG.rendering.zoomStep,
|
|
GAME_CONFIG.rendering.minZoom,
|
|
GAME_CONFIG.rendering.maxZoom
|
|
);
|
|
this.camera.setZoom(newZoom);
|
|
}
|
|
|
|
/**
|
|
* Handle camera panning via drag
|
|
* @param dx - Change in x position
|
|
* @param dy - Change in y position
|
|
*/
|
|
handlePan(dx: number, dy: number): void {
|
|
this.camera.scrollX -= dx;
|
|
this.camera.scrollY -= dy;
|
|
this.disableFollowMode();
|
|
}
|
|
|
|
/**
|
|
* Set camera bounds (usually to match world size)
|
|
*/
|
|
setBounds(x: number, y: number, width: number, height: number): void {
|
|
this.camera.setBounds(x, y, width, height);
|
|
}
|
|
}
|