diff --git a/builtins.ts b/builtins.ts index 1384160..890da72 100644 --- a/builtins.ts +++ b/builtins.ts @@ -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, }; diff --git a/index.ts b/index.ts index 1b107fc..69496f0 100644 --- a/index.ts +++ b/index.ts @@ -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 - game.update(); - game.draw(); - frame(); + if (mode === "play") { + game.update(); + game.draw(); + frame(); + } else if (mode === "edit") { + repl.update(); + repl.draw(); + frame(); + } + refreshKeyboard(); }); diff --git a/keyboard.ts b/keyboard.ts new file mode 100644 index 0000000..106e283 --- /dev/null +++ b/keyboard.ts @@ -0,0 +1,84 @@ +const keyboard = new Map(); + +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; +} \ No newline at end of file diff --git a/repl.ts b/repl.ts new file mode 100644 index 0000000..8543588 --- /dev/null +++ b/repl.ts @@ -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 +} \ No newline at end of file