const keyboard = new Map(); export const K = { ESCAPE: 256, ENTER: 257, TAB: 258, BACKSPACE: 259, INSERT: 260, DELETE: 261, ARROW_RIGHT: 262, ARROW_LEFT: 263, ARROW_DOWN: 264, ARROW_UP: 265, PAGE_UP: 266, PAGE_DOWN: 267, HOME: 268, END: 269, CAPS_LOCK: 280, F1: 290, F2: 291, F3: 292, F4: 293, F5: 294, F6: 295, F7: 296, F8: 297, F9: 298, F10: 299, F11: 300, F12: 301, SHIFT_LEFT: 340, CTRL_LEFT: 341, ALT_LEFT: 342, SHIFT_RIGHT: 344, CTRL_RIGHT: 345, ALT_RIGHT: 346, } export const shiftMap = { "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", "8": "*", "9": "(", "0": ")", "`": "~", "-": "_", "=": "+", "[": "{", "]": "}", "\\": "|", ";": ":", "'": '"', ",": "<", ".": ">", "/": "?", } addEventListener("keydown", (evt) => { // console.log("keydown", evt.key, evt.key.charCodeAt(0)); const key = evt.key.charCodeAt(0); const isRepeat = keyboard.has(key) && keyboard.get(key)?.held!; keyboard.set(key, { first: !isRepeat, repeat: isRepeat, held: true, }); }); addEventListener("keyup", (evt) => { // console.log("keyup", evt.key, evt.key.charCodeAt(0)); const key = evt.key.charCodeAt(0); keyboard.set(key, { first: false, repeat: false, held: false, }); }); export const refreshKeyboard = () => { keyboard.forEach(({held}, key) => { if (!held) { keyboard.delete(key); } else { keyboard.set(key, { first: false, repeat: false, held: true, }); } }) } export const keyPressed = (key: string | number) => { if (typeof key === "string") { key = key.toUpperCase().charCodeAt(0); } return keyboard.has(key) && (keyboard.get(key)?.first! || keyboard.get(key)?.repeat!); } export const keyDown = (key: string | number) => { if (typeof key === "string") { key = key.toUpperCase().charCodeAt(0); } return keyboard.has(key) && keyboard.get(key)?.held!; } export const shiftKeyDown = () => { return keyDown(K.SHIFT_LEFT) || keyDown(K.SHIFT_RIGHT); } export const keyReleased = (key: string | number) => { if (typeof key === "string") { key = key.toUpperCase().charCodeAt(0); } return keyboard.has(key) && !keyboard.get(key)?.held!; } export const getKeysPressed = () => { const result = [...keyboard.entries()].filter(([_key, value]) => { return value.first || value.repeat; }).map(([key]) => key); return result; }