import GameObject from "./object"; import Renderer from "./renderer"; export default class Camera { renderer: Renderer; lockedObject: GameObject | null; defaultPos: { x: number; y: number }; pos: { x: number; y: number }; minimums: { x: number; y: number }; constructor(renderer: Renderer, defaultPos?: { x: number; y: number }) { this.renderer = renderer; this.lockedObject = null; this.defaultPos = defaultPos || { x: renderer.width / 2, y: renderer.height / 2, }; this.pos = this.defaultPos; this.minimums = { x: Infinity, y: Infinity }; } lock( object: GameObject, { minXSpace = Infinity, minYSpace = Infinity, }: { minXSpace?: number; minYSpace?: number } = {} ) { this.lockedObject = object; this.minimums = { x: minXSpace, y: minYSpace, }; } unlock() { this.lockedObject = null; this.pos = this.defaultPos; } update() { if (this.lockedObject) { if (this.minimums.x >= this.renderer.width / 2) { this.pos.x = this.lockedObject.x; } else if ( this.lockedObject.x - this.pos.x + this.renderer.width / 2 < this.minimums.x ) { this.pos.x = this.lockedObject.x - this.minimums.x + this.renderer.width / 2; } else if ( this.lockedObject.x - this.pos.x > this.renderer.width / 2 - this.minimums.x ) { this.pos.x = this.lockedObject.x + this.minimums.x - this.renderer.width / 2; } if (this.minimums.y >= this.renderer.height / 2) { this.pos.y = this.lockedObject.y; } else if ( this.lockedObject.y - this.pos.y + this.renderer.height / 2 < this.minimums.y ) { this.pos.y = this.lockedObject.y - this.minimums.y + this.renderer.height / 2; } else if ( this.lockedObject.y - this.pos.y > this.renderer.height / 2 - this.minimums.y ) { this.pos.y = this.lockedObject.y + this.minimums.y - this.renderer.height / 2; } } return this.pos; } }