diff options
author | Charlie Stanton <charlie@shtanton.xyz> | 2025-04-05 08:10:21 +0100 |
---|---|---|
committer | Charlie Stanton <charlie@shtanton.xyz> | 2025-04-05 08:10:21 +0100 |
commit | 935f69ca25bca24fd36166e7192ebb69af2d35e9 (patch) | |
tree | 182cd864dc0d486ca64868f037da306b60ec51e2 /src/index.html.in | |
parent | f0bf72a54477fb18b1666293a652b52f53320a1d (diff) | |
download | ldjam57-935f69ca25bca24fd36166e7192ebb69af2d35e9.tar |
Get web assembly working
Diffstat (limited to 'src/index.html.in')
-rw-r--r-- | src/index.html.in | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/index.html.in b/src/index.html.in new file mode 100644 index 0000000..fcfb8ef --- /dev/null +++ b/src/index.html.in @@ -0,0 +1,105 @@ +<!doctype html> +<title>LDJam 57</title> +<meta charset="utf-8"/> +<meta name="viewport" content="width=device-width"> +<style> +html, body { + background: #222222; + font-family: sans-serif; + height: 100%; + margin: 0; + overflow: hidden; + text-align: center; + width: 100%; +} +h1 { + color: white; + margin: 0; +} +button { + font-size: 150%; + height: 8%; + margin: 0.3em; + width: 25%; +} +</style> + +<canvas></canvas> + +<script> +// Mirror these in src/all.c +const INPUT_NONE = 0; +const INPUT_UP = 1; +const INPUT_DOWN = 2; +const INPUT_LEFT = 3; +const INPUT_RIGHT = 4; + +const WASM = +#include "../build/main.wasm.b64" + +async function main() { + let bytes = Uint8Array.from(atob(WASM), function(c) { + return c.charCodeAt(0); + }); + let module = await WebAssembly.compile(bytes); + let wasm = await WebAssembly.instantiate(module); + let exports = wasm.exports; + let html = document.querySelector("html"); + let canvas = document.querySelector("canvas"); + let ctx = canvas.getContext("2d"); + let memory = exports.memory; + + function min(a, b) { + return b<a ? b : a; + } + + function max_width() { + return html.clientHeight * 0.7 | 0; + } + + function render() { + let width = canvas.width = min(html.clientWidth, max_width()); + let height = canvas.height = width; + let ptr = exports.game_render(width, height); + let dl = new Int32Array(memory.buffer, ptr); + let len = dl[0]; + let ops = dl.subarray(1); + + for (let i = 0; i < len; i++) { + let op = ops.subarray(5*i, 5*i+5); + const color = new Uint8Array(new Uint32Array(ops.subarray(4, 5)).buffer); + let style = `#${color[0].toString(16).padStart(2, "0")}${color[1].toString(16).padStart(2, "0")}${color[2].toString(16).padStart(2, "0")}`; + ctx.fillStyle = style; + ctx.fillRect(op[0], op[1], op[2], op[3]); + } + } + + function onresize() { html.style.maxWidth = `${max_width()}px`; } + window.addEventListener("resize", onresize); + onresize(); + + document.addEventListener("keydown", function(e) { + if (e.key == "w") { + exports.game_update(INPUT_UP); + } else if (e.key == "a") { + exports.game_update(INPUT_LEFT); + } else if (e.key == "s") { + exports.game_update(INPUT_DOWN); + } else if (e.key == "d") { + exports.game_update(INPUT_RIGHT); + } + }) + + function animate() { + // TODO: stop requesting frames when state is static + requestAnimationFrame(animate); + exports.game_update(INPUT_NONE); + render(); + } + requestAnimationFrame(animate); + + exports.game_init(); +} + +main() +</script> |