From 453a9391ccf1ab0c7a6869c44664bfcdd1b68fa1 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 9 Nov 2018 13:27:49 +0100 Subject: Allow interacting with entities --- src/view/input/directionhandler.ts | 37 ------------------ src/view/input/gameinput.ts | 78 ++++++++++++++++++++++++++++++++++++++ src/view/input/inputhandler.ts | 24 ++++++------ 3 files changed, 90 insertions(+), 49 deletions(-) delete mode 100644 src/view/input/directionhandler.ts create mode 100644 src/view/input/gameinput.ts (limited to 'src/view/input') diff --git a/src/view/input/directionhandler.ts b/src/view/input/directionhandler.ts deleted file mode 100644 index 0a3687e..0000000 --- a/src/view/input/directionhandler.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { InputHandler } from './inputhandler'; - -import { Listenable } from '../../util'; - -import { vec2 } from 'gl-matrix'; - -export const enum Keycode { - Left = 37, - Up = 38, - Right = 39, - Down = 40, -} - -export 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/gameinput.ts b/src/view/input/gameinput.ts new file mode 100644 index 0000000..f3066e3 --- /dev/null +++ b/src/view/input/gameinput.ts @@ -0,0 +1,78 @@ +import { InputHandler } from './inputhandler'; + +import { Listenable } from '../../util'; + +import { vec2 } from 'gl-matrix'; + +export enum ButtonCode { + Action, + Back, + Menu, +} + +const buttonMapping: {[key: string]: ButtonCode} = { + KeyZ: ButtonCode.Action, + KeyX: ButtonCode.Back, + KeyC: ButtonCode.Menu, +}; + +export interface DirectionInput { + type: 'direction'; + direction: vec2; +} + +export interface ButtonInput { + type: 'button'; + button: ButtonCode; +} + +export type GameInput = DirectionInput | ButtonInput; + +export class GameInputHandler extends Listenable<[GameInput]> { + private readonly input: InputHandler; + + constructor() { + super(); + + this.input = new InputHandler( + new Set([ + 'ArrowLeft', + 'ArrowUp', + 'ArrowRight', + 'ArrowDown', + ...Object.keys(buttonMapping), + ])); + + this.input.addListener((key: string, pressed: boolean) => { + const button = buttonMapping[key]; + if (button !== undefined) { + if (pressed) + this.runListeners({ + type: 'button', + button, + }); + + return; + } + + const dir = vec2.create(); + + if (this.input.has('ArrowLeft')) + vec2.add(dir, dir, [-1, 0]); + if (this.input.has('ArrowUp')) + vec2.add(dir, dir, [0, -1]); + if (this.input.has('ArrowRight')) + vec2.add(dir, dir, [1, 0]); + if (this.input.has('ArrowDown')) + vec2.add(dir, dir, [0, 1]); + + if (vec2.sqrLen(dir) > 0) + vec2.normalize(dir, dir); + + this.runListeners({ + type: 'direction', + direction: dir, + }); + }); + } +} diff --git a/src/view/input/inputhandler.ts b/src/view/input/inputhandler.ts index 96f15dd..22fdc28 100644 --- a/src/view/input/inputhandler.ts +++ b/src/view/input/inputhandler.ts @@ -1,39 +1,39 @@ import { Listenable } from '../../util'; -export class InputHandler extends Listenable<[]> { - private readonly keys: Set = new Set(); +export class InputHandler extends Listenable<[string, boolean]> { + private readonly keys: Set = new Set(); - constructor(relevantKeys: Set) { + constructor(relevantKeys: Set) { super(); window.addEventListener('keydown', (ev) => { - if (!relevantKeys.has(ev.keyCode)) + if (!relevantKeys.has(ev.code)) return; ev.preventDefault(); - if (this.keys.has(ev.keyCode)) + if (ev.repeat) return; - this.keys.add(ev.keyCode); - this.runListeners(); + this.keys.add(ev.code); + this.runListeners(ev.code, true); }); window.addEventListener('keyup', (ev) => { - if (!relevantKeys.has(ev.keyCode)) + if (!relevantKeys.has(ev.code)) return; ev.preventDefault(); - if (!this.keys.has(ev.keyCode)) + if (!this.keys.has(ev.code)) return; - this.keys.delete(ev.keyCode); - this.runListeners(); + this.keys.delete(ev.code); + this.runListeners(ev.code, false); }); } - public has(key: number): boolean { + public has(key: string): boolean { return this.keys.has(key); } } -- cgit v1.2.3