import { TILE_SIZE } from "../constants.js"; import { GameObject } from "./game-object.js"; export class Camera extends GameObject { constructor({ gameObjects = [], x = 0, y = 0, width = 160, height = 120 }) { super({ x, y }); this.gameObjects = gameObjects; this.x = x; this.y = y; this.width = width; this.height = height; this.keys = [ { key: "ArrowUp", pressed: false, value: [0, -1] }, { key: "ArrowDown", pressed: false, value: [0, 1] }, { key: "ArrowLeft", pressed: false, value: [-1, 0] }, { key: "ArrowRight", pressed: false, value: [1, 0] }, ]; this.availableKeys = this.keys.reduce( (acc, item) => ({ ...acc, [item.key]: item }), {} ); } update(delta) { this.keys.forEach((item) => { if (item.pressed) { this.moveCamera(...item.value, delta); } }); } onKeyPressed(key) { if (!this.availableKeys[key]) return; this.availableKeys[key].pressed = true; } onKeyReleased(key) { if (!this.availableKeys[key]) return; this.availableKeys[key].pressed = false; } render(ctx) { this.gameObjects.forEach((item) => item.render(ctx, this.x, this.y, this.width, this.height) ); } moveCamera(dx, dy, delta) { const [item] = this.gameObjects; const { height, width } = item.selected ?? item; this.x = Math.min( Math.max(this.x + dx * Math.floor(delta * 100), 0), width * TILE_SIZE - this.width ); this.y = Math.min( Math.max(this.y + dy * Math.floor(delta * 100), 0), height * TILE_SIZE - this.height ); } }