40 lines
833 B
TypeScript
40 lines
833 B
TypeScript
import { Listenable } from '../../util';
|
|
|
|
export class InputHandler extends Listenable<[string, boolean]> {
|
|
private readonly keys: Set<string> = new Set();
|
|
|
|
constructor(relevantKeys: Set<string>) {
|
|
super();
|
|
|
|
window.addEventListener('keydown', (ev) => {
|
|
if (!relevantKeys.has(ev.code)) return;
|
|
|
|
ev.preventDefault();
|
|
|
|
if (ev.repeat) return;
|
|
|
|
this.keys.add(ev.code);
|
|
this.runListeners(ev.code, true);
|
|
});
|
|
|
|
window.addEventListener('keyup', (ev) => {
|
|
if (!relevantKeys.has(ev.code)) return;
|
|
|
|
ev.preventDefault();
|
|
|
|
if (!this.keys.has(ev.code)) return;
|
|
|
|
this.keys.delete(ev.code);
|
|
this.runListeners(ev.code, false);
|
|
});
|
|
|
|
window.addEventListener('blur', () => {
|
|
this.keys.clear();
|
|
this.runListeners('', false);
|
|
});
|
|
}
|
|
|
|
public has(key: string): boolean {
|
|
return this.keys.has(key);
|
|
}
|
|
}
|