diff --git a/html/images/space.svg b/html/images/space.svg
index 6e724ab..c0d9d9f 100644
--- a/html/images/space.svg
+++ b/html/images/space.svg
@@ -34,6 +34,16 @@
fill: yellow;
}
+ line.bullet {
+ stroke: black;
+ opacity: 0.5;
+ transition: opacity 2s ease-out;
+ }
+
+ line.bullet.fade {
+ opacity: 0;
+ }
+
#triangles polygon {
fill-opacity: 0.2;
stroke-width: 1px;
@@ -98,7 +108,7 @@
-
+
@@ -457,16 +467,67 @@ function fireBullet(position, velocity) {
el.setAttribute('cx', 0);
el.setAttribute('cy', 0);
- const bullet = {
- x: position.x + vx * cannonLength,
- y: position.y + vy * cannonLength,
- vx: vx * speed + velocity.x,
- vy: vy * speed + velocity.y,
- time: bulletTimeout,
- node: bulletsContainer.appendChild(el)
+ // Options for the observer (which mutations to observe)
+ const config = { attributes: false, childList: true, subtree: true };
+ // Callback function to execute when mutations are observed
+ const callback = (mutationList, observer) => {
+ for (const mutation of mutationList) {
+ if (mutation.type === "childList") {
+ // console.log("A child node has been added or removed.");
+ // console.log('added nodes', mutation.addedNodes);
+ // console.log('children', bulletsContainer.children.length);
+ // [...mutation.addedNodes].forEach(b => b.classList.add('fade'));
+ // mutation.addedNodes.forEach(bullet => bullet.classList.add('fade'));
+ } else if (mutation.type === "attributes") {
+ // console.log(`The ${mutation.attributeName} attribute was modified.`);
+ }
+ }
+ };
+
+ // Create an observer instance linked to the callback function
+ const observer = new MutationObserver(callback);
+
+ // Start observing the target node for configured mutations
+ observer.observe(bulletsContainer, config);
+
+ const lineEl = document.createElementNS(namespaceURIsvg, 'line');
+ lineEl.classList.add('bullet');
+ // lineEl.setAttribute('x1', position.x + vx * cannonLength);
+ // x: position.x + vx * cannonLength,
+ // y: position.y + vy * cannonLength,
+ const rad = s.degrees * Math.PI / 180; // toFixed(15)?
+
+ const rise = Math.sin(rad) * cannonLength;
+ const run = Math.cos(rad) * cannonLength;
+
+ const bulletOrigin = {
+ x: position.x + run,
+ y: position.y + rise
}
- bullets.push(bullet);
+ lineEl.setAttribute('x1', bulletOrigin.x);
+ lineEl.setAttribute('y1', bulletOrigin.y);
+ lineEl.setAttribute('x2', bulletOrigin.x + run * 50);
+ lineEl.setAttribute('y2', bulletOrigin.y + rise * 50);
+ // lineEl.addEventListener('transitionrun', e => console.log('transitionrun', e));
+ // lineEl.addEventListener('transitionstart', e => console.log('transitionstart', e));
+ // lineEl.addEventListener('transitionend', e => console.log('transitionend', e));
+ lineEl.addEventListener('transitionend', e => e.target.remove());
+ lineEl.addEventListener('transitioncancel', e => console.log(e));
+ const appended = bulletsContainer.appendChild(lineEl);
+ // I don't know why I have to delay it
+ setTimeout(() => appended.classList.add('fade'), 1000);
+
+ // const bullet = {
+ // x: position.x + vx * cannonLength,
+ // y: position.y + vy * cannonLength,
+ // vx: vx * speed + velocity.x,
+ // vy: vy * speed + velocity.y,
+ // time: bulletTimeout,
+ // node: bulletsContainer.appendChild(el)
+ // }
+
+ // bullets.push(bullet);
}
function getRotate(el) {
@@ -721,9 +782,13 @@ function lineIntxnPt({ x1, y1, x2, y2 }, { x1: x3, y1: y3, x2: x4, y2: y4 }) {
}
function updateShip(s, elapsed) {
- const degrees = getRotate(gun);
- if (rotate > 0) gun.style.transform = `rotate(${(+degrees + rotationSpeed * elapsed) % 360}deg)`;
- else if (rotate < 0) gun.style.transform = `rotate(${(+degrees - rotationSpeed * elapsed) % 360}deg)`;
+ if (rotate > 0) {
+ s.degrees = (s.degrees + rotationSpeed * elapsed) % 360;
+ } else if (rotate < 0) {
+ s.degrees = (s.degrees - rotationSpeed * elapsed) % 360;
+ }
+
+ gun.style.transform = `rotate(${s.degrees}deg)`;
const { x: px, y: py } = s.position;
const { x: vx, y: vy } = s.velocity;
@@ -864,6 +929,7 @@ function init() {
s.acceleration = { x: 0, y: 0 };
s.rotate = 0;
+ s.degrees = 0;
s.collision = null;
s.isLanded = false;
s.gearDown = false;
@@ -909,7 +975,17 @@ function animate(timestamp) {
}
updateShip(s, elapsed);
- updateBullets(elapsed);
+ // updateBullets(elapsed);
+ // console.log(bulletsContainer.children)
+ // console.log([...bulletsContainer.children].filter(b => !b.classList.contains('fade')));
+ // const a = [...bulletsContainer.children].filter(b => !b.classList.contains('fade')).forEach(b => b.classList.add('fade'));
+ // console.log(bulletsContainer.children);
+ // console.log('before', bulletsContainer.children);
+ // const a = [...bulletsContainer.children].filter(b => !b.classList.contains('fade'));
+ // const a = [...bulletsContainer.children].filter(b => !b.classList.contains('fade'));
+ // a.forEach(b => b.classList.add('fade'))
+ // console.log('after', bulletsContainer.children);
+
// updateEdges(position);
if (drawCollisionLines) updateTriangles(position);