<!DOCTYPE html> <html> <head> <title>Map creator for Penger Party</title> <style> #canva { width: 800px; height: 600px; } @media screen and (min-width: calc(800px + calc(64px * 4))) { #css-bullshit { content: ""; display: table; clear: both; } #left { float: left; width: 50%; } #right { float: right; width: calc(100% - 800px - 25px); position: absolute; right: 0px; } } </style> </head> <body id="css-bullshit"> <h1>Map creator for Penger Party</h1> <div id="left"> <canvas id="canva"></canvas> </div> <div id="right"> <textarea id="import-json" placeholder="map.json"></textarea> <button id="import-butt">Import</button> <form> <input type="radio" name="type" id="is_coll" checked><label for="is_coll">collisions</label></input> <input type="radio" name="type" id="is_coin"><label for="is_coin">coin</label></input> </form> name: <input id="map-name"></input> <p>copie paste to maps.json:</p> <pre id="mapjson"></pre> <p>mouse = <span id="mousepos"></span></p> <h3>Delete collisions:</h3> <ul id="delete-coll"></ul> <h3>Delete coins:</h3> <ul id="delete-coin"></ul> </div> <script> var WIDTH = 800; var HEIGHT = 600; var canva = document.getElementById("canva"); var mapjson = document.getElementById("mapjson"); var mapname = document.getElementById("map-name"); var mousepos = document.getElementById("mousepos"); var ctx = canva.getContext("2d"); ctx.canvas.width = WIDTH; ctx.canvas.height = HEIGHT; ctx.fillStyle = "blue"; ctx.fillRect(0, 0, WIDTH, HEIGHT); var map = {} map.name = "test"; map.collisions = []; map.coins = []; mapname.onchange = (e) => { map.name = mapname.value mapjson.innerText = JSON.stringify(map); }; var importbutt = document.getElementById("import-butt"); importbutt.onclick = () => { var importjson = document.getElementById("import-json"); map = JSON.parse(importjson.value); } var clickidiclick = false; document.addEventListener("mousemove", (e) => { var rect = canva.getBoundingClientRect(); var x = Math.floor(e.clientX - rect.left); var y = Math.floor(e.clientY - rect.top); if (x < 0 || x >= WIDTH || y >= HEIGHT || y < 0) return; mousepos.innerText = "x: "+x+", y: "+y; if (clickidiclick) { map.collisions[map.collisions.length-1].width = x - map.collisions[map.collisions.length-1].x; map.collisions[map.collisions.length-1].height = y - map.collisions[map.collisions.length-1].y; } }); document.addEventListener("click", (e) => { var rect = canva.getBoundingClientRect(); var x = Math.floor(e.clientX - rect.left); var y = Math.floor(e.clientY - rect.top); if (x < 0 || x >= WIDTH || y >= HEIGHT || y < 0) return; if (document.getElementById("is_coll").checked) { if (!clickidiclick) { map.collisions[map.collisions.length] = {x: x, y: y}; document.getElementById("delete-coll").innerHTML += "<li><button onclick='del_coll("+JSON.stringify(map.collisions[map.collisions.length-1])+", this)'>x: "+x+", y: "+y+"</button></li>"; } else { var coll = map.collisions[map.collisions.length-1]; if (coll.width < 0) { coll.x = coll.x + coll.width; coll.width = -coll.width; } if (coll.height < 0) { coll.y = coll.y + coll.height; coll.height = -coll.height; } } clickidiclick = !clickidiclick; } else if (document.getElementById("is_coin").checked) { map.coins[map.coins.length] = {x: x-60/2, y: y-60/2}; document.getElementById("delete-coin").innerHTML += "<li><button onclick='del_coin("+JSON.stringify(map.coins[map.coins.length-1])+", this)'>x: "+x+", y: "+y+"</button></li>"; clickidiclick = false; } mapjson.innerText = JSON.stringify(map); }); function del_coll(val, butt) { var i = 0; for (i = 0; i < map.collisions.length; i++) { if (map.collisions[i].x == val.x && map.collisions[i].y == val.y) break; } map.collisions.splice(i, 1); mapjson.innerText = JSON.stringify(map); butt.parentElement.remove(); } function del_coin(val, butt) { var i = 0; for (i = 0; i < map.coins.length; i++) { if (map.coins[i].x == val.x && map.coins[i].y == val.y) break; } map.coins.splice(i, 1); mapjson.innerText = JSON.stringify(map); butt.parentElement.remove(); } function draw() { ctx.fillStyle = "green"; ctx.fillRect(0, 0, WIDTH, HEIGHT); for (var i = 0; i < map.collisions.length; i++) { ctx.fillStyle = "red"; ctx.fillRect( map.collisions[i].x, map.collisions[i].y, map.collisions[i].width, map.collisions[i].height ); } for (var i = 0; i < map.coins.length; i++) { ctx.beginPath(); ctx.arc(map.coins[i].x+60/2, map.coins[i].y+60/2, 60/2, 0, 2 * Math.PI); ctx.fillStyle = "yellow"; ctx.fill(); ctx.stroke(); } window.requestAnimationFrame(draw); } window.requestAnimationFrame(draw); </script> </body> </html>