fantasy-console/keyboard.ts

128 lines
2.4 KiB
TypeScript
Raw Normal View History

2023-05-02 18:44:27 -07:00
const keyboard = new Map<number, {first: boolean, repeat: boolean, held: boolean}>();
2023-05-02 18:17:31 -07:00
export const K = {
ESCAPE: 256,
ENTER: 257,
TAB: 258,
BACKSPACE: 259,
INSERT: 260,
2023-05-02 18:17:31 -07:00
DELETE: 261,
ARROW_RIGHT: 262,
ARROW_LEFT: 263,
ARROW_DOWN: 264,
ARROW_UP: 265,
PAGE_UP: 266,
PAGE_DOWN: 267,
HOME: 268,
END: 269,
2023-05-02 18:17:31 -07:00
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,
}
2023-05-02 18:44:27 -07:00
export const shiftMap = {
"1": "!",
"2": "@",
"3": "#",
"4": "$",
"5": "%",
"6": "^",
"7": "&",
"8": "*",
"9": "(",
"0": ")",
"`": "~",
"-": "_",
"=": "+",
"[": "{",
"]": "}",
"\\": "|",
";": ":",
"'": '"',
",": "<",
".": ">",
"/": "?",
}
2023-05-02 18:17:31 -07:00
addEventListener("keydown", (evt) => {
console.log("keydown", evt.key, evt.key.charCodeAt(0));
2023-05-02 18:44:27 -07:00
const key = evt.key.charCodeAt(0);
const isRepeat = keyboard.has(key) && keyboard.get(key)?.held!;
keyboard.set(key, {
2023-05-02 18:17:31 -07:00
first: !isRepeat,
repeat: isRepeat,
held: true,
});
});
addEventListener("keyup", (evt) => {
console.log("keyup", evt.key, evt.key.charCodeAt(0));
2023-05-02 18:44:27 -07:00
const key = evt.key.charCodeAt(0);
keyboard.set(key, {
2023-05-02 18:17:31 -07:00
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,
});
}
})
}
2023-05-02 18:44:27 -07:00
export const keyPressed = (key: string | number) => {
if (typeof key === "string") {
2023-05-03 16:47:09 -07:00
key = key.toUpperCase().charCodeAt(0);
2023-05-02 18:44:27 -07:00
}
2023-05-03 16:47:09 -07:00
return keyboard.has(key) && (keyboard.get(key)?.first! || keyboard.get(key)?.repeat!);
2023-05-02 18:17:31 -07:00
}
2023-05-02 18:44:27 -07:00
export const keyDown = (key: string | number) => {
if (typeof key === "string") {
2023-05-03 16:47:09 -07:00
key = key.toUpperCase().charCodeAt(0);
2023-05-02 18:44:27 -07:00
}
2023-05-02 18:17:31 -07:00
return keyboard.has(key) && keyboard.get(key)?.held!;
}
2023-05-02 18:44:27 -07:00
export const shiftKeyDown = () => {
return keyDown(K.SHIFT_LEFT) || keyDown(K.SHIFT_RIGHT);
}
export const keyReleased = (key: string | number) => {
if (typeof key === "string") {
2023-05-03 16:47:09 -07:00
key = key.toUpperCase().charCodeAt(0);
2023-05-02 18:44:27 -07:00
}
2023-05-02 18:17:31 -07:00
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;
}