1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-20 05:12:05 +03:00
juvix/examples/milestone/TicTacToe/Web/tictactoe.js
Paul Cadman 512211da8e
Setup Clang before building docs in CI (#1433)
* Setup Clang before building docs in CI

* Debug CI

* Debug CI

* Debug CI

* Debug CI

* Fix JS name

* Fix copying of webapp resources to output folder
2022-08-04 09:19:03 +01:00

59 lines
1.5 KiB
JavaScript

let app = document.getElementById("app");
let ctx = app.getContext("2d");
let wasmModule = null;
function cstrlen(mem, ptr) {
let len = 0;
while (mem[ptr] != 0) {
len++;
ptr++;
}
return len;
}
const ALIGN_NAMES = ["left", "right", "center"];
const CANVAS_PADDING = 8;
function ptrToCstr(ptr) {
const wasmMemory = wasmModule.instance.exports.memory.buffer;
const mem = new Uint8Array(wasmMemory);
const len = cstrlen(mem, ptr);
const bytes = new Uint8Array(wasmMemory, ptr, len);
return new TextDecoder().decode(bytes);
}
function hostFillRect(x, y, w, h, colorHexPtr) {
const colorHex = ptrToCstr(colorHexPtr);
ctx.fillStyle = colorHex;
ctx.fillRect(x, y, w, h);
}
function hostFillText(x, y, textPtr, size, colorHexPtr, align) {
const text = ptrToCstr(textPtr);
const colorHex = ptrToCstr(colorHexPtr);
ctx.fillStyle = colorHex;
ctx.font = size+"px sans";
ctx.textAlign = ALIGN_NAMES[align];
ctx.fillText(text, x, y);
}
function hostLog(messagePtr) {
const message = ptrToCstr(messagePtr);
console.log(message);
}
WebAssembly.instantiateStreaming(fetch('TicTacToe.wasm'), {
env: {
hostFillRect,
hostFillText,
hostLog
}
}).then((w) => {
wasmModule = w;
let state = wasmModule.instance.exports.initGame();
document.addEventListener('mouseup', (e) => {
ctx.clearRect(0, 0, app.width, app.height);
state = wasmModule.instance.exports.move(state, e.x - CANVAS_PADDING, e.y - CANVAS_PADDING);
});
});