Starting on keyboard stuff

This commit is contained in:
dylan 2023-05-02 18:17:31 -07:00
parent fdc8f97aee
commit 253b8e9567
4 changed files with 125 additions and 3 deletions

View File

@ -3,6 +3,7 @@ import {
clearScreen,
} from "./window.ts";
import { font } from "./font.ts";
import { keyDown, keyPressed, keyReleased } from "./keyboard.ts";
// import { codeSheet } from "./sheet.ts";
// deno-fmt-ignore
@ -57,6 +58,9 @@ const faux = {
clear_screen: clearScreen,
draw_sprite: drawSprite,
draw_text: drawText,
key_down: keyDown,
key_pressed: keyPressed,
key_released: keyReleased,
// code_sheet: codeSheet,
};

View File

@ -3,14 +3,25 @@ import {
frame,
} from "./window.ts";
import { codeSheet } from "./sheet.ts";
import { refreshKeyboard } from "./keyboard.ts";
import { repl } from "./repl.ts";
const game = codeSheet(0);
game.init();
let mode: "play" | "edit" = "edit";
await mainloop((_t) => {
// TODO: use t
if (mode === "play") {
game.update();
game.draw();
frame();
} else if (mode === "edit") {
repl.update();
repl.draw();
frame();
}
refreshKeyboard();
});

84
keyboard.ts Normal file
View File

@ -0,0 +1,84 @@
const keyboard = new Map<string, {first: boolean, repeat: boolean, held: boolean}>();
export const K = {
ESCAPE: 256,
ENTER: 257,
TAB: 258,
BACKSPACE: 259,
DELETE: 261,
ARROW_RIGHT: 262,
ARROW_LEFT: 263,
ARROW_DOWN: 264,
ARROW_UP: 265,
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,
}
addEventListener("keydown", (evt) => {
console.log("keydown", evt.key, evt.key.charCodeAt(0));
const isRepeat = keyboard.has(evt.key) && keyboard.get(evt.key)?.held!;
keyboard.set(evt.key, {
first: !isRepeat,
repeat: isRepeat,
held: true,
});
});
addEventListener("keyup", (evt) => {
console.log("keyup", evt.key, evt.key.charCodeAt(0));
keyboard.set(evt.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) => {
return keyboard.has(key) && keyboard.get(key)?.repeat!;
}
export const keyDown = (key: string) => {
return keyboard.has(key) && keyboard.get(key)?.held!;
}
export const keyReleased = (key: string) => {
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;
}

23
repl.ts Normal file
View File

@ -0,0 +1,23 @@
import faux from "./builtins.ts";
import { getKeysPressed } from "./keyboard.ts";
import { font } from "./font.ts";
let line = "";
const update = () => {
for (const key of getKeysPressed()) {
const char = key.toLowerCase();
if (char in font) {
line += char;
}
}
}
const draw = () => {
faux.clear_screen();
faux.draw_text(0, 0, "> "+line);
}
export const repl = {
update, draw
}