Refactor shooting and drawing
This commit is contained in:
@@ -265,27 +265,59 @@ const GravityEffect = {}
|
|||||||
// };
|
// };
|
||||||
|
|
||||||
// systems
|
// systems
|
||||||
const Shoot = (() => {
|
const Combat = (() => {
|
||||||
const cannonLength = 8;
|
const cannonLength = 8;
|
||||||
const scalar = 50;
|
const scalar = 50;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
update: ({ entity_id }) => {
|
shoot: ({ entity_id }) => {
|
||||||
const radians = Degrees[entity_id] * Math.PI / 180; // toFixed(15)?
|
const radians = Degrees[entity_id] * Math.PI / 180; // toFixed(15)?
|
||||||
const { x, y } = Position[entity_id];
|
const { x, y } = Position[entity_id];
|
||||||
const rise = Math.sin(radians) * cannonLength;
|
const rise = Math.sin(radians) * cannonLength;
|
||||||
const run = Math.cos(radians) * cannonLength;
|
const run = Math.cos(radians) * cannonLength;
|
||||||
const origin = { x: x + run, y: y + rise };
|
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];
|
const { x: vx, y: vy } = Velocity[entity_id];
|
||||||
Velocity[entity_id] = { x: vx - run, y: vy - rise };
|
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 {
|
return {
|
||||||
origin,
|
origin,
|
||||||
target: {
|
target
|
||||||
x: origin.x + run * scalar,
|
|
||||||
y: origin.y + rise * scalar
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -293,12 +325,29 @@ const Shoot = (() => {
|
|||||||
|
|
||||||
const Draw = (() => {
|
const Draw = (() => {
|
||||||
return {
|
return {
|
||||||
update: ({ entity_id }) => {
|
ship: ({ entity_id }) => {
|
||||||
const node = Nodes[entity_id];
|
const node = Nodes[entity_id];
|
||||||
const gun = CannonNodes[entity_id];
|
const gun = CannonNodes[entity_id];
|
||||||
newPos = Position[entity_id];
|
newPos = Position[entity_id];
|
||||||
node.style.transform = `translate(${newPos.x}px, ${newPos.y}px)`;
|
node.style.transform = `translate(${newPos.x}px, ${newPos.y}px)`;
|
||||||
gun.style.transform = `rotate(${Degrees[entity_id]}deg)`;
|
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 {
|
return {
|
||||||
update: ({ entity_id }, elapsed) => {
|
ship: ({ entity_id }, elapsed) => {
|
||||||
const gravity = 0.1;
|
const gravity = 1;
|
||||||
// affectedByWalls & affectedByGravity toggles?
|
// affectedByWalls & affectedByGravity toggles?
|
||||||
const isAffectedByGravity = GravityEffect[entity_id];
|
const isAffectedByGravity = GravityEffect[entity_id];
|
||||||
const { x: px, y: py } = Position[entity_id];
|
const { x: px, y: py } = Position[entity_id];
|
||||||
@@ -1060,7 +1109,7 @@ function init() {
|
|||||||
Degrees[entity_id] = s.degrees;
|
Degrees[entity_id] = s.degrees;
|
||||||
Nodes[entity_id] = document.querySelector(`#${entity_id}`);
|
Nodes[entity_id] = document.querySelector(`#${entity_id}`);
|
||||||
CannonNodes[entity_id] = document.querySelector(`#${entity_id} .cannon`);
|
CannonNodes[entity_id] = document.querySelector(`#${entity_id} .cannon`);
|
||||||
GravityEffect[entity_id] = true;
|
GravityEffect[entity_id] = false;
|
||||||
// let node = document.querySelector(`#${entity_id}`);
|
// let node = document.querySelector(`#${entity_id}`);
|
||||||
// node.style.transform = `translate(${s.position.x}px, ${s.position.y}px)`;
|
// node.style.transform = `translate(${s.position.x}px, ${s.position.y}px)`;
|
||||||
}
|
}
|
||||||
@@ -1086,7 +1135,7 @@ function init() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Ships.forEach(({ entity_id }) => {
|
Ships.forEach(({ entity_id }) => {
|
||||||
Draw.update({ entity_id });
|
Draw.ship({ entity_id });
|
||||||
});
|
});
|
||||||
|
|
||||||
[...edgeContainer.children].forEach(c => c.remove());;
|
[...edgeContainer.children].forEach(c => c.remove());;
|
||||||
@@ -1357,9 +1406,9 @@ function animate(timestamp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ships.forEach(({ entity_id }) => {
|
Ships.forEach(({ entity_id }) => {
|
||||||
Move.update({ entity_id }, elapsed);
|
Move.ship({ entity_id }, elapsed);
|
||||||
Rotate.update({ entity_id }, elapsed);
|
Rotate.update({ entity_id }, elapsed);
|
||||||
Draw.update({ entity_id });
|
Draw.ship({ entity_id });
|
||||||
});
|
});
|
||||||
|
|
||||||
// updateEdges(position);
|
// updateEdges(position);
|
||||||
@@ -1442,7 +1491,8 @@ document.addEventListener("keydown", function(e) {
|
|||||||
case "Space":
|
case "Space":
|
||||||
if (!spacePressed) {
|
if (!spacePressed) {
|
||||||
spacePressed = true;
|
spacePressed = true;
|
||||||
drawShot(Shoot.update(Ships[0]));
|
const coords = Combat.shoot(Ships[0]);
|
||||||
|
Draw.shot(Ships[0], coords);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "KeyW":
|
case "KeyW":
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 53 KiB |
Reference in New Issue
Block a user