platjs
Version:
Simple engine for platformer physics and rendering
80 lines (71 loc) • 2.18 kB
text/typescript
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;
}
}