diff --git a/builtins.ts b/builtins.ts new file mode 100644 index 0000000..495f08e --- /dev/null +++ b/builtins.ts @@ -0,0 +1,59 @@ +import { + setPixelsInRect, + clearScreen, +} from "./window.ts"; +import { font } from "./font.ts"; + +// deno-fmt-ignore +const sprites = [ + [ + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + ], + [ + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 1, 1, 3, 3, 2, + 2, 3, 3, 1, 1, 3, 3, 2, + 2, 1, 1, 1, 1, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, + 2, 3, 3, 1, 1, 3, 3, 2, + 2, 3, 3, 1, 1, 3, 3, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + ], + [ + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 4, 4, 4, 4, 5, 5, 2, + 2, 4, 4, 4, 5, 5, 5, 2, + 2, 4, 4, 5, 5, 5, 6, 2, + 2, 4, 5, 5, 5, 6, 6, 2, + 2, 5, 5, 5, 6, 6, 6, 2, + 2, 5, 5, 6, 6, 6, 6, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + ], +] + +const drawSprite = (x: number, y: number, spr: number) => { + setPixelsInRect(x, y, 8, sprites[spr]); +} + +const drawChar = (x: number, y: number, char: string) => { + setPixelsInRect(x, y, 4, font[char]); +} + +const drawText = (x: number, y: number, text: string) => { + [...text].forEach((char, i) => { + drawChar(x+4*i, y, char); + }); +} + +export default { + clearScreen, + drawSprite, + drawText, +} \ No newline at end of file diff --git a/font.ts b/font.ts new file mode 100644 index 0000000..32e426f --- /dev/null +++ b/font.ts @@ -0,0 +1,259 @@ +// deno-fmt-ignore +export const font: {[key: string]: Array} = { + "a": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 1, 0, 1, + 0, 1, 1, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + ], + "b": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 1, 0, 1, + 0, 1, 1, 0, + 0, 1, 0, 1, + 0, 1, 1, 1, + ], + "c": [ + 0, 0, 0, 0, + 0, 0, 1, 1, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 1, + ], + "d": [ + 0, 0, 0, 0, + 0, 1, 1, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 0, + ], + "e": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 1, 0, 0, + 0, 1, 1, 0, + 0, 1, 0, 0, + 0, 1, 1, 1, + ], + "f": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 1, 0, 0, + 0, 1, 1, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + ], + "g": [ + 0, 0, 0, 0, + 0, 0, 1, 1, + 0, 1, 0, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 0, 1, 1, + ], + "h": [ + 0, 0, 0, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + ], + "i": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 1, 1, 1, + ], + "j": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 1, 1, 0, + ], + "k": [ + 0, 0, 0, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + ], + "l": [ + 0, 0, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 1, 1, + ], + "m": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 1, 1, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + ], + "n": [ + 0, 0, 0, 0, + 0, 1, 1, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + ], + "o": [ + 0, 0, 0, 0, + 0, 0, 1, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 0, + ], + "p": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 1, 0, 1, + 0, 1, 1, 1, + 0, 1, 0, 0, + 0, 1, 0, 0, + ], + "q": [ + 0, 0, 0, 0, + 0, 0, 1, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 0, + 0, 0, 1, 1, + ], + "r": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 1, 0, 1, + 0, 1, 1, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + ], + "s": [ + 0, 0, 0, 0, + 0, 0, 1, 1, + 0, 1, 0, 0, + 0, 1, 1, 1, + 0, 0, 0, 1, + 0, 1, 1, 0, + ], + "t": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + ], + "u": [ + 0, 0, 0, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 0, + ], + "v": [ + 0, 0, 0, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 1, + 0, 0, 1, 0, + ], + "w": [ + 0, 0, 0, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 1, + 0, 1, 1, 1, + ], + "x": [ + 0, 0, 0, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 0, 1, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + ], + "y": [ + 0, 0, 0, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 1, + 0, 0, 1, 0, + 0, 1, 0, 0, + ], + "z": [ + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 0, 0, 1, + 0, 0, 1, 0, + 0, 1, 0, 0, + 0, 1, 1, 1, + ], + ",": [ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 0, + 0, 1, 0, 0, + ], + ".": [ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 0, + ], + " ": [ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + ], + "<": [ + 0, 0, 0, 0, + 0, 0, 0, 1, + 0, 0, 1, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + ], + ">": [ + 0, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1, + 0, 0, 1, 0, + 0, 1, 0, 0, + ], + "=": [ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 0, 0, 0, + 0, 1, 1, 1, + 0, 0, 0, 0, + ], +} \ No newline at end of file diff --git a/game.ts b/game.ts new file mode 100644 index 0000000..744c60c --- /dev/null +++ b/game.ts @@ -0,0 +1,19 @@ +import faux from "./builtins.ts"; + +let y = 0; + +export default { + init() { + + }, + update() { + y++; + if (y>127) { + y=-5; + } + }, + draw() { + faux.clearScreen(); + faux.drawText(0, y, "hello, world"); + }, +} \ No newline at end of file diff --git a/index.ts b/index.ts index c07f3a5..4346b71 100644 --- a/index.ts +++ b/index.ts @@ -1,340 +1,14 @@ import { mainloop, frame, - setPixelColor, - clearScreen, - setPixelsInRect, } from "./window.ts"; +import game from "./game.ts"; -// deno-fmt-ignore -const sprites = [ - [ - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 1, 1, 1, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - ], - [ - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 3, 1, 1, 3, 3, 2, - 2, 3, 3, 1, 1, 3, 3, 2, - 2, 1, 1, 1, 1, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 2, - 2, 3, 3, 1, 1, 3, 3, 2, - 2, 3, 3, 1, 1, 3, 3, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - ], - [ - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 4, 4, 4, 4, 5, 5, 2, - 2, 4, 4, 4, 5, 5, 5, 2, - 2, 4, 4, 5, 5, 5, 6, 2, - 2, 4, 5, 5, 5, 6, 6, 2, - 2, 5, 5, 5, 6, 6, 6, 2, - 2, 5, 5, 6, 6, 6, 6, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - ], -] - -// deno-fmt-ignore -const font: {[key: string]: Array} = { - "a": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 1, 0, 1, - 0, 1, 1, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - ], - "b": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 1, 0, 1, - 0, 1, 1, 0, - 0, 1, 0, 1, - 0, 1, 1, 1, - ], - "c": [ - 0, 0, 0, 0, - 0, 0, 1, 1, - 0, 1, 0, 0, - 0, 1, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 1, - ], - "d": [ - 0, 0, 0, 0, - 0, 1, 1, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 0, - ], - "e": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 1, 0, 0, - 0, 1, 1, 0, - 0, 1, 0, 0, - 0, 1, 1, 1, - ], - "f": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 1, 0, 0, - 0, 1, 1, 0, - 0, 1, 0, 0, - 0, 1, 0, 0, - ], - "g": [ - 0, 0, 0, 0, - 0, 0, 1, 1, - 0, 1, 0, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 0, 1, 1, - ], - "h": [ - 0, 0, 0, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - ], - "i": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 1, 1, 1, - ], - "j": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 1, 1, 0, - ], - "k": [ - 0, 0, 0, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - ], - "l": [ - 0, 0, 0, 0, - 0, 1, 0, 0, - 0, 1, 0, 0, - 0, 1, 0, 0, - 0, 1, 0, 0, - 0, 1, 1, 1, - ], - "m": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 1, 1, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - ], - "n": [ - 0, 0, 0, 0, - 0, 1, 1, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - ], - "o": [ - 0, 0, 0, 0, - 0, 0, 1, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 0, - ], - "p": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 1, 0, 1, - 0, 1, 1, 1, - 0, 1, 0, 0, - 0, 1, 0, 0, - ], - "q": [ - 0, 0, 0, 0, - 0, 0, 1, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 0, - 0, 0, 1, 1, - ], - "r": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 1, 0, 1, - 0, 1, 1, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - ], - "s": [ - 0, 0, 0, 0, - 0, 0, 1, 1, - 0, 1, 0, 0, - 0, 1, 1, 1, - 0, 0, 0, 1, - 0, 1, 1, 0, - ], - "t": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 0, 1, 0, - ], - "u": [ - 0, 0, 0, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 0, - ], - "v": [ - 0, 0, 0, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 1, - 0, 0, 1, 0, - ], - "w": [ - 0, 0, 0, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 1, - 0, 1, 1, 1, - ], - "x": [ - 0, 0, 0, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 0, 1, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - ], - "y": [ - 0, 0, 0, 0, - 0, 1, 0, 1, - 0, 1, 0, 1, - 0, 1, 1, 1, - 0, 0, 1, 0, - 0, 1, 0, 0, - ], - "z": [ - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 0, 0, 1, - 0, 0, 1, 0, - 0, 1, 0, 0, - 0, 1, 1, 1, - ], - ",": [ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 0, - 0, 1, 0, 0, - ], - ".": [ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 0, - ], - " ": [ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - ], - "<": [ - 0, 0, 0, 0, - 0, 0, 0, 1, - 0, 0, 1, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1, - ], - ">": [ - 0, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1, - 0, 0, 1, 0, - 0, 1, 0, 0, - ], - "=": [ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 0, 0, 0, - 0, 1, 1, 1, - 0, 0, 0, 0, - ], -} - -const drawSprite = (x: number, y: number, spr: number) => { - setPixelsInRect(x, y, 8, sprites[spr]); -} - -const drawChar = (x: number, y: number, char: string) => { - setPixelsInRect(x, y, 4, font[char]); -} - -const drawText = (x: number, y: number, text: string) => { - [...text].forEach((char, i) => { - drawChar(x+4*i, y, char); - }); -} - -const draw = () => { - clearScreen(); - drawText(5, 5, "=> hello, world <="); - drawText(5, 11, "the quick brown fox"); - drawText(5, 17, "jumps over the lazy"); - drawText(5, 23, "dog."); - // for (let i = 0; i < 256; i++) { - // drawSprite(Math.floor(Math.random()*120), Math.floor(Math.random()*120), 0); - // drawSprite(Math.floor(Math.random()*120), Math.floor(Math.random()*120), 1); - // drawSprite(Math.floor(Math.random()*120), Math.floor(Math.random()*120), 2); - // } - setPixelColor(0, 0, 3); - setPixelColor(0, 127, 4); - setPixelColor(127, 0, 5); - setPixelColor(127, 127, 6); -} - -draw(); +game.init(); await mainloop((t) => { - // console.log(t/1000); - draw(); + // TODO: use t + game.update(); + game.draw(); frame(); }); diff --git a/window.ts b/window.ts index c2c0635..be9e07f 100644 --- a/window.ts +++ b/window.ts @@ -138,6 +138,9 @@ const allPixelColors = new Float32Array( ) export const setPixelColor = (x: number, y: number, color: number) => { + if (x < 0 || y < 0 || x > 127 || y > 127) { + return; + } if (color !== 0) { const col = c(color); allPixelColors.set(col, 4*6*(128*y+x));