diff options
Diffstat (limited to 'src/view/input')
-rw-r--r-- | src/view/input/DirectionHandler.ts | 36 | ||||
-rw-r--r-- | src/view/input/InputHandler.ts | 39 |
2 files changed, 75 insertions, 0 deletions
diff --git a/src/view/input/DirectionHandler.ts b/src/view/input/DirectionHandler.ts new file mode 100644 index 0000000..691ba01 --- /dev/null +++ b/src/view/input/DirectionHandler.ts @@ -0,0 +1,36 @@ +import {Listenable} from '../../util'; +import InputHandler from './InputHandler'; + +import {vec2} from 'gl-matrix'; + +export const enum Keycode { + Left = 37, + Up = 38, + Right = 39, + Down = 40, +} + +export default class DirectionHandler extends Listenable<[vec2]> { + private readonly input: InputHandler; + + constructor() { + super(); + + this.input = new InputHandler(new Set([Keycode.Left, Keycode.Up, Keycode.Right, Keycode.Down])); + + this.input.addListener(() => { + const dir = vec2.create(); + + if (this.input.has(Keycode.Left)) + vec2.add(dir, dir, [-1, 0]); + if (this.input.has(Keycode.Up)) + vec2.add(dir, dir, [0, -1]); + if (this.input.has(Keycode.Right)) + vec2.add(dir, dir, [1, 0]); + if (this.input.has(Keycode.Down)) + vec2.add(dir, dir, [0, 1]); + + this.runListeners(dir); + }); + } +} diff --git a/src/view/input/InputHandler.ts b/src/view/input/InputHandler.ts new file mode 100644 index 0000000..a6f1293 --- /dev/null +++ b/src/view/input/InputHandler.ts @@ -0,0 +1,39 @@ +import {Listenable} from '../../util'; + +export default class InputHandler extends Listenable<[]> { + private readonly keys: Set<number> = new Set(); + + constructor(relevantKeys: Set<number>) { + super(); + + window.addEventListener('keydown', (ev) => { + if (!relevantKeys.has(ev.keyCode)) + return; + + ev.preventDefault(); + + if (this.keys.has(ev.keyCode)) + return; + + this.keys.add(ev.keyCode); + this.runListeners(); + }); + + window.addEventListener('keyup', (ev) => { + if (!relevantKeys.has(ev.keyCode)) + return; + + ev.preventDefault(); + + if (!this.keys.has(ev.keyCode)) + return; + + this.keys.delete(ev.keyCode); + this.runListeners(); + }); + } + + public has(key: number): boolean { + return this.keys.has(key); + } +} |