silphius/app/ecs-systems/follow-camera.js

60 lines
1.5 KiB
JavaScript

// import {RESOLUTION} from '@/constants.js'
import {System} from '@/ecs/index.js';
// const [hx, hy] = [RESOLUTION.x / 2, RESOLUTION.y / 2];
export default class FollowCamera extends System {
static queries() {
return {
default: ['Camera', 'Position'],
};
}
reindex(entities) {
super.reindex(entities);
for (const id of entities) {
this.updateCamera(1, this.ecs.get(id));
}
}
tick(elapsed) {
for (const {id} of this.select('default')) {
this.updateCamera(elapsed * 3, this.ecs.get(id));
}
}
updateCamera(portion, entity) {
const {Camera, Position} = entity;
if (Camera && Position) {
// const {AreaSize: {x, y}} = this.ecs.get(1);
// const [px, py] = [
// Math.max(hx, Math.min(Math.round(Position.x), x - hx)),
// Math.max(hy, Math.min(Math.round(Position.y), y - hy)),
// ];
const [px, py] = [
Math.round(Position.x),
Math.round(Position.y),
];
if (Camera.x === px && Camera.y === py) {
return;
}
if (Math.abs(Camera.x - px) < 0.01) {
Camera.x = px;
}
if (Math.abs(Camera.y - py) < 0.01) {
Camera.y = py;
}
const [dx, dy] = [
(px - Camera.x) * portion,
(py - Camera.y) * portion,
];
[Camera.x, Camera.y] = [
Camera.x + (Math.sign(dx) * Math.max(0.01, Math.abs(dx))),
Camera.y + (Math.sign(dy) * Math.max(0.01, Math.abs(dy))),
];
}
}
}