Files
rogue/src/scenes/systems/CameraController.ts
2026-01-07 09:19:38 +11:00

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);
}
}