| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import { Button } from '../shared/input';
- // KeyboardEvent.code is layout-independent: KeyA/KeyW are Q/Z on AZERTY.
- const KEYMAP: Record<string, number> = {
- KeyA: Button.Left,
- ArrowLeft: Button.Left,
- KeyD: Button.Right,
- ArrowRight: Button.Right,
- KeyW: Button.Jump,
- ArrowUp: Button.Jump,
- Space: Button.Jump,
- KeyS: Button.Down,
- ArrowDown: Button.Down,
- KeyE: Button.Special,
- KeyF: Button.Use,
- };
- /** Tracks keyboard/mouse state as a button bitmask plus the mouse position in screen pixels. */
- export class InputTracker {
- buttons = 0;
- mouseX = 0;
- mouseY = 0;
- constructor(target: HTMLElement) {
- window.addEventListener('keydown', (e) => {
- const b = KEYMAP[e.code];
- if (b) {
- this.buttons |= b;
- e.preventDefault();
- }
- });
- window.addEventListener('keyup', (e) => {
- const b = KEYMAP[e.code];
- if (b) this.buttons &= ~b;
- });
- window.addEventListener('blur', () => (this.buttons = 0));
- target.addEventListener('pointermove', (e) => {
- this.mouseX = e.clientX;
- this.mouseY = e.clientY;
- });
- target.addEventListener('pointerdown', (e) => {
- if (e.button === 0) this.buttons |= Button.Attack;
- if (e.button === 2) this.buttons |= Button.Special;
- });
- window.addEventListener('pointerup', (e) => {
- if (e.button === 0) this.buttons &= ~Button.Attack;
- if (e.button === 2) this.buttons &= ~Button.Special;
- });
- target.addEventListener('contextmenu', (e) => e.preventDefault());
- }
- }
|