WIP: multiple walls

This commit is contained in:
2025-12-21 12:54:01 -08:00
parent 2c2226d09f
commit 5868ef2b24

View File

@@ -75,7 +75,9 @@
<!-- <polygon id="wall" points="20,20 40,20 40,40 20,40" /> --> <!-- <polygon id="wall" points="20,20 40,20 40,40 20,40" /> -->
<!-- <polygon id="wall" points="-10,-30 -10,-40 30,-50 60,-30 80,0 150,0 150,10 60,50 -10,40 -20,20 20,20 20,-20" /> --> <!-- <polygon id="wall" points="-10,-30 -10,-40 30,-50 60,-30 80,0 150,0 150,10 60,50 -10,40 -20,20 20,20 20,-20" /> -->
<polygon id="wall" points="-130,-80 -40,-70 -70,-10 -100,40 -120,100" /> <!-- <polygon id="wall" points="-130,-80 -40,-70 -70,-10 -100,40 -120,100" /> -->
<polygon id="wall" class="wall" points="-130,-80 -40,-70 -70,-10" />
<polygon class="wall" points="50,70 90,-10 130,70" />
<g id="triangles"></g> <g id="triangles"></g>
<g id="edges"></g> <g id="edges"></g>
@@ -94,6 +96,12 @@
<li xmlns="http://www.w3.org/1999/xhtml">make ship a helicopter</li> <li xmlns="http://www.w3.org/1999/xhtml">make ship a helicopter</li>
<li xmlns="http://www.w3.org/1999/xhtml">use paths for walls</li> <li xmlns="http://www.w3.org/1999/xhtml">use paths for walls</li>
<li xmlns="http://www.w3.org/1999/xhtml">multiple walls</li> <li xmlns="http://www.w3.org/1999/xhtml">multiple walls</li>
<li xmlns="http://www.w3.org/1999/xhtml">no walls</li>
<li xmlns="http://www.w3.org/1999/xhtml">stop reading data from elements</li>
<li xmlns="http://www.w3.org/1999/xhtml">ability to land</li>
<li xmlns="http://www.w3.org/1999/xhtml">gravity</li>
<li xmlns="http://www.w3.org/1999/xhtml">limited fuel</li>
<li xmlns="http://www.w3.org/1999/xhtml">additional cannon firing modes</li>
</ul> </ul>
<pre id="debug" xmlns="http://www.w3.org/1999/xhtml"></pre> <pre id="debug" xmlns="http://www.w3.org/1999/xhtml"></pre>
<div id="pointer" xmlns="http://www.w3.org/1999/xhtml"> <div id="pointer" xmlns="http://www.w3.org/1999/xhtml">
@@ -131,6 +139,7 @@
const gun = ship.querySelector('#cannon'); const gun = ship.querySelector('#cannon');
const shipBody = ship.querySelector("#body"); const shipBody = ship.querySelector("#body");
const wall = document.querySelector('#wall'); const wall = document.querySelector('#wall');
const walls = document.querySelectorAll('.wall');
const bulletsContainer = document.querySelector("#bullets"); const bulletsContainer = document.querySelector("#bullets");
const triangleContainer = document.querySelector('#triangles'); const triangleContainer = document.querySelector('#triangles');
const edgeContainer = document.querySelector('#edges'); const edgeContainer = document.querySelector('#edges');
@@ -143,13 +152,36 @@
return [+x, +y]; return [+x, +y];
}); });
const allWallCorners = [...walls].map(wall =>
wall.getAttribute('points').split(' ').map(coords => {
const [x, y] = coords.split(',');
return [+x, +y];
}
));
// console.log(wallCorners);
// console.log(allWallCorners);
const edgePts = wallCorners.map((pt, i, arr) => [pt, arr[(i + 1) % arr.length]]); const edgePts = wallCorners.map((pt, i, arr) => [pt, arr[(i + 1) % arr.length]]);
const allEdgePts = allWallCorners.map(w =>
w.map((pt, i, arr) => [pt, arr[(i + 1) % arr.length]])
);
// console.log(edgePts);
// console.log(allEdgePts);
const startingEdges = findEdges(edgePts, position); const startingEdges = findEdges(edgePts, position);
const allStartingEdges = findAllEdges(allEdgePts, position);
// console.log(startingEdges);
// console.log(allStartingEdges);
function distance(x1, y1, x2, y2) { function distance(x1, y1, x2, y2) {
return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
} }
function drawAllEdges(edges) {
edges.forEach(edge => drawEdges(edge));
}
function drawEdges(lpts) { function drawEdges(lpts) {
let edges = lpts.map(e => e.join(' ')); let edges = lpts.map(e => e.join(' '));
@@ -204,6 +236,17 @@
}, []); }, []);
} }
function findAllEdges(verts, [xc, yc]) {
return verts.reduce((acc, points) => {
points.forEach(([a, b]) => {
const isFound = [isClockwise, isAcute].every(c => c(a, b, [xc, yc]));
if (isFound) acc.push(`${a[0]},${a[1]} ${b[0]},${b[1]}`);
});
return acc;
}, []);
}
function updateTriangles([positionX, positionY]) { function updateTriangles([positionX, positionY]) {
const delim = ' '; const delim = ' ';
const className = 'clockwise-orientation'; const className = 'clockwise-orientation';
@@ -314,12 +357,14 @@
function detectCollision(corners, [xc, yc], edges) { function detectCollision(corners, [xc, yc], edges) {
const shipRadius = 5; const shipRadius = 5;
const cornerCollision = corners.some(([x, y]) => { // const cornerCollision = corners.some(([x, y]) => {
cornerPt.x = x - xc; // cornerPt.x = x - xc;
cornerPt.y = y - yc; // cornerPt.y = y - yc;
//
// return shipBody.isPointInFill(cornerPt);
// });
return shipBody.isPointInFill(cornerPt); const cornerCollision = false;
});
const sideCollision = edges.reduce((acc, e) => { const sideCollision = edges.reduce((acc, e) => {
const [[xa, ya], [xb, yb]] = e.split(' ').map(n => n.split(',').map(n => +n)); const [[xa, ya], [xb, yb]] = e.split(' ').map(n => n.split(',').map(n => +n));
@@ -340,6 +385,12 @@
return cornerCollision || sideCollision; return cornerCollision || sideCollision;
} }
function detectAllCollisions(corners, [xc, yc], edges) {
return edges.map(edge => {
return detectCollision(corners, [xc, yc], edge);
}).some(c => c);
}
function updateShip(elapsed) { function updateShip(elapsed) {
const degrees = getRotate(gun); const degrees = getRotate(gun);
if (rotate > 0) gun.style.transform = `rotate(${(+degrees + rotationSpeed * elapsed) % 360}deg)`; if (rotate > 0) gun.style.transform = `rotate(${(+degrees + rotationSpeed * elapsed) % 360}deg)`;
@@ -433,7 +484,8 @@
drawEdges(edgePts); drawEdges(edgePts);
} }
const collision = detectCollision(wallCorners, position, findEdges(edgePts, position)); // const collision = detectCollision(wallCorners, position, findEdges(edgePts, position));
const collision = detectAllCollisions(allWallCorners, position, findAllEdges(allEdgePts, position));
wall.setAttribute('fill', collision ? 'red' : 'black'); wall.setAttribute('fill', collision ? 'red' : 'black');
if (collision) { if (collision) {
@@ -451,6 +503,7 @@
} }
drawEdges(edgePts); drawEdges(edgePts);
drawAllEdges(allEdgePts);
let force = 1; let force = 1;
let spacePressed = false; let spacePressed = false;

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 20 KiB