Spaces:
Runtime error
Runtime error
| const canvas = document.querySelector("#canvas"); | |
| function handleResize() { | |
| requestAnimationFrame(() => { | |
| canvas.width = window.innerWidth; | |
| canvas.height = window.innerHeight; | |
| }); | |
| } | |
| handleResize(); | |
| window.addEventListener("resize", handleResize, { passive: true }); | |
| function createGameLoop(callback) { | |
| let lastTimestamp; | |
| function gameLoop(timestamp) { | |
| if (lastTimestamp) { | |
| const delta = timestamp - lastTimestamp; | |
| if (delta >= 1000 / 60) { | |
| lastTimestamp = timestamp; | |
| callback(delta); | |
| } | |
| } else { | |
| lastTimestamp = timestamp; | |
| } | |
| requestAnimationFrame(gameLoop); | |
| } | |
| return gameLoop; | |
| } | |
| window.createGameLoop = createGameLoop; | |
| function downloadCanvasImage() { | |
| // Get the canvas element | |
| const canvas = document.getElementById('canvas'); | |
| // Create a new 'a' element | |
| let link = document.createElement('a'); | |
| // Set the download attribute with a file name | |
| link.download = 'canvas_image.png'; | |
| // Get the data URL for the canvas | |
| link.href = canvas.toDataURL(); | |
| // Trigger the click event on the link | |
| link.click(); | |
| } | |
| const clients = { | |
| host: "__ESDEKA::host__", | |
| guest: "__ESDEKA::guest__", | |
| }; | |
| // Shared communicators | |
| function subscribe(channel, callback) { | |
| function handleMessage(event) { | |
| if ( | |
| event.data.client && | |
| Object.values(clients).includes(event.data.client) && | |
| event.data.channel === channel | |
| ) { | |
| callback(event); | |
| } | |
| } | |
| window.addEventListener("message", handleMessage); | |
| return () => { | |
| window.removeEventListener("message", handleMessage); | |
| }; | |
| } | |
| const host = {}; | |
| // Guest communicators | |
| function answer(window_, channel, targetOrigin = "*") { | |
| window_.postMessage( | |
| { | |
| client: clients.guest, | |
| channel, | |
| action: { | |
| type: "answer", | |
| }, | |
| }, | |
| targetOrigin | |
| ); | |
| } | |
| function handleTemplate(template) { | |
| Function("Template", `${template}`)(); | |
| } | |
| subscribe("2DGameCreator", event => { | |
| const { action } = event.data; | |
| switch (action.type) { | |
| case "call": | |
| host.current = event.source; | |
| answer(event.source, "2DGameCreator"); | |
| handleTemplate(action.payload.template); | |
| break; | |
| case "broadcast": | |
| handleTemplate(action.payload.template); | |
| break; | |
| default: | |
| break; | |
| } | |
| }); | |