export class InputManager { private keyStates: Map = new Map(); private mouseStates: Map = new Map(); private mouseLocation: { x: number; y: number } = { x: 0, y: 0 }; private mouseDelta: { x: number; y: number } = { x: 0, y: 0 }; private keyEvents: Map void> = new Map(); private mouseEvents: Map void> = new Map(); constructor() { document.addEventListener("keydown", (e) => { this.keyStates.set(e.key, true); this.keyEvents.get(e.key)?.call(e); }); document.addEventListener("keyup", (e) => { this.keyStates.set(e.key, false); }); document.addEventListener("mousedown", (e) => { this.mouseStates.set(e.button, true); this.mouseEvents.get(e.button)?.call(e); }); document.addEventListener("mouseup", (e) => { this.mouseStates.set(e.button, false); }); self.addEventListener("mousemove", (e) => { this.mouseLocation = { x: e.clientX, y: e.clientY }; this.mouseDelta = { x: e.movementX, y: e.movementY, }; }); } getKeyState(key: string | number) { return this.keyStates.get(key); } getMouseState(key: string | number) { return this.mouseStates.get(key); } getMouseLocation() { return this.mouseLocation; } getMouseDelta() { return this.mouseDelta; } onKey(key: string | number, cb: () => void) { this.keyEvents.set(key, cb); } onMouse(key: string | number, cb: () => void) { this.mouseEvents.set(key, cb); } offKey(key: string | number) { const events = this.keyEvents.get(key); this.keyEvents.delete(key); return events; } offMouse(key: string | number) { this.mouseEvents.delete(key); } }