-
Notifications
You must be signed in to change notification settings - Fork 0
/
isometric-grid.html
62 lines (61 loc) · 1.82 KB
/
isometric-grid.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<!DOCTYPE html>
<html>
<head>
<title>Isometric grid selector - Lame City</title>
<meta charset="UTF-8">
<meta name="description" content="Selects a tile on a 30° isometric grid."/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<link rel="stylesheet" type="text/css" href="css/canvas.css">
<script src="js/canvas.js" charset="utf-8"></script>
<style>
body {
background-color: white;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script>
const canvas = document.querySelector("#canvas"),
c = canvas.getContext("2d"),
mouse = {x: 0, y: 0},
scroll = {x: 0, y: 0},
tileSize = 20,
tileWidth = tileSize * Math.sqrt(3) / 2,
tileHeight = tileSize / 2;
document.addEventListener("mousemove", e => {
mouse.x = e.clientX;
mouse.y = e.clientY;
}, false);
document.addEventListener("touchmove", e => {
mouse.x = e.touches[0].clientX;
mouse.y = e.touches[0].clientY;
}, false);
function isoToMouse(isoX, isoY) {
return [(isoX - isoY) * tileWidth - scroll.x, (isoX + isoY) * tileHeight + scroll.y];
}
function mouseToIso(mouseX, mouseY) {
let x = (mouseX + scroll.x) / tileWidth, y = (mouseY + scroll.y) / tileHeight;
return [(y + x) / 2, (y - x) / 2];
}
function draw() {
c.fillStyle = "rgba(255,255,255,0.1)";
c.fillRect(0, 0, innerWidth, innerHeight);
let [isoX, isoY] = mouseToIso(mouse.x, mouse.y).map(Math.floor);
c.fillStyle = "#03A9F4";
c.beginPath();
c.moveTo(...isoToMouse(isoX, isoY));
c.lineTo(...isoToMouse(isoX + 1, isoY));
c.lineTo(...isoToMouse(isoX + 1, isoY + 1));
c.lineTo(...isoToMouse(isoX, isoY + 1));
c.fill();
c.fillStyle = "black";
c.font = "12px sans-serif";
c.fillText(`${isoX}, ${isoY}`, mouse.x, mouse.y);
window.requestAnimationFrame(draw);
}
draw();
</script>
</body>
<!-- MADE BY SEAN -->
</html>