diff --git a/html/images/space.svg b/html/images/space.svg index d2ca691..b8dcdfe 100644 --- a/html/images/space.svg +++ b/html/images/space.svg @@ -265,27 +265,59 @@ const GravityEffect = {} // }; // systems -const Shoot = (() => { +const Combat = (() => { const cannonLength = 8; const scalar = 50; return { - update: ({ entity_id }) => { + shoot: ({ entity_id }) => { const radians = Degrees[entity_id] * Math.PI / 180; // toFixed(15)? const { x, y } = Position[entity_id]; const rise = Math.sin(radians) * cannonLength; const run = Math.cos(radians) * cannonLength; const origin = { x: x + run, y: y + rise }; + const mag = Math.sqrt(rise**2 + run**2) + const normalized = { + rise: rise / mag, + run: run / mag + } + + // console.log("RISE", rise); + // console.log("RUN", run); + // console.log("NORMALIZED", normalized); + const { x: vx, y: vy } = Velocity[entity_id]; Velocity[entity_id] = { x: vx - run, y: vy - rise }; + const target = {}; + let i = 0; + while (true) { + const x = origin.x + normalized.run * i; + const y = origin.y + normalized.rise * i; + const pt = { x, y }; + target.x = pt.x; + target.y = pt.y; + + const hitShips = Ships.find(({ entity_id: id }) => { + const node = Nodes[id]; + const p = Position[id]; + const body = node.querySelector(".body"); + const hit = body.isPointInFill({ x: pt.x - p.x, y: pt.y - p.y }); + // console.log("checking ship", id, "position", pt, hit); + return hit; + }); + + const offBg = !bg.isPointInFill(pt); + const wallHits = [...wallElements].find(el => el.isPointInFill(pt)); + + i += 1; + if (hitShips || offBg || wallHits) break; + } + return { origin, - target: { - x: origin.x + run * scalar, - y: origin.y + rise * scalar - } + target }; } }; @@ -293,12 +325,29 @@ const Shoot = (() => { const Draw = (() => { return { - update: ({ entity_id }) => { + ship: ({ entity_id }) => { const node = Nodes[entity_id]; const gun = CannonNodes[entity_id]; newPos = Position[entity_id]; node.style.transform = `translate(${newPos.x}px, ${newPos.y}px)`; gun.style.transform = `rotate(${Degrees[entity_id]}deg)`; + }, + + shot: ({ entity_id }, shot) => { + const gun = CannonNodes[entity_id]; + const lineEl = document.createElementNS(namespaceURIsvg, 'line'); + lineEl.classList.add('bullet'); + lineEl.setAttribute('x1', shot.origin.x); + lineEl.setAttribute('y1', shot.origin.y); + lineEl.setAttribute('x2', shot.target.x); + lineEl.setAttribute('y2', shot.target.y); + lineEl.addEventListener('transitionend', e => e.target.remove()); + setTimeout(() => lineEl.classList.add('fade'), 1000); + const tipEl = gun.querySelector(".tip") + tipEl.classList.remove("recoil"); + setTimeout(() => tipEl.classList.add('recoil'), 0); + + return bulletsContainer.appendChild(lineEl); } }; })(); @@ -792,8 +841,8 @@ const Move = (() => { } return { - update: ({ entity_id }, elapsed) => { - const gravity = 0.1; + ship: ({ entity_id }, elapsed) => { + const gravity = 1; // affectedByWalls & affectedByGravity toggles? const isAffectedByGravity = GravityEffect[entity_id]; const { x: px, y: py } = Position[entity_id]; @@ -1060,7 +1109,7 @@ function init() { Degrees[entity_id] = s.degrees; Nodes[entity_id] = document.querySelector(`#${entity_id}`); CannonNodes[entity_id] = document.querySelector(`#${entity_id} .cannon`); - GravityEffect[entity_id] = true; + GravityEffect[entity_id] = false; // let node = document.querySelector(`#${entity_id}`); // node.style.transform = `translate(${s.position.x}px, ${s.position.y}px)`; } @@ -1086,7 +1135,7 @@ function init() { }); Ships.forEach(({ entity_id }) => { - Draw.update({ entity_id }); + Draw.ship({ entity_id }); }); [...edgeContainer.children].forEach(c => c.remove());; @@ -1357,9 +1406,9 @@ function animate(timestamp) { } Ships.forEach(({ entity_id }) => { - Move.update({ entity_id }, elapsed); + Move.ship({ entity_id }, elapsed); Rotate.update({ entity_id }, elapsed); - Draw.update({ entity_id }); + Draw.ship({ entity_id }); }); // updateEdges(position); @@ -1442,7 +1491,8 @@ document.addEventListener("keydown", function(e) { case "Space": if (!spacePressed) { spacePressed = true; - drawShot(Shoot.update(Ships[0])); + const coords = Combat.shoot(Ships[0]); + Draw.shot(Ships[0], coords); } break; case "KeyW":