diff --git a/prox_ops.html b/prox_ops.html
index 759b0a4..2ec410b 100644
--- a/prox_ops.html
+++ b/prox_ops.html
@@ -30,7 +30,8 @@
Proximity Operations
const pyEl = document.getElementById('playerY');
const pvxEl = document.getElementById('playerVX');
const pvyEl = document.getElementById('playerVY');
- const positions = []
+ const positions = [];
+ const trajectory = [];
// Game parameters
@@ -41,11 +42,11 @@ Proximity Operations
let playerVY = 0;
let playerHeading = 40; // Degrees, 0 = north, 90 = east, etc.
let turnRate = 5; // Degrees per frame when turning
- let thrust = 0.01; // Units per frame
+ let thrust = 0.0001; // Units per frame
let fuel = 100;
- let fuelRate = 0.1; // % per frame while firing
+ let fuelRate = 0.01; // % per frame while firing
let difficulty = 0;
- let pause = 100;
+ let pause = 0;
let timer = 0;
@@ -58,8 +59,10 @@ Proximity Operations
difficulty = diff;
if(difficulty == 0) {
// standard start position
- playerX = 50; // Player position relative to beacon (beacon at 0,0)
- playerY = -20; // Start south of beacon
+ playerX = 500; // Player position relative to beacon (beacon at 0,0)
+ playerY = -50; // Start south of beacon
+ playerVX = 1.5*n_param*playerY;
+ playerVY = 0;
playerHeading = 40; // Degrees, 0 = north, 90 = east, etc.
} else {
// random start position
@@ -73,13 +76,35 @@ Proximity Operations
}
}
fuel = 100;
- pause = 100;
+ pause = 0;
+ positions.length = 0;
+ positions.push([ playerX, playerY ]);
+ }
+
+ function recalculate_traj() {
+ trajectory.length = 0;
+ let simX = playerX;
+ let simY = playerY;
+ let simVX = playerVX;
+ let simVY = playerVY;
+
+ for(let i=0; i<10000; i++) {
+ trajectory.push([ simX, simY, simVX, simVY ]);
+
+ // Movement Note that X & Y are swapped from CW equations
+ simVX += 2*n_param*simVY
+ simVY += 3*n_param*n_param * simY - 2*n_param*simVX
+
+ simX += simVX
+ simY += simVY
+ }
}
// Controls
const keys = {};
window.addEventListener('keydown', e => { keys[e.key] = true; });
window.addEventListener('keyup', e => { keys[e.key] = false; });
+ resetState(difficulty);
function gameLoop(timestamp) {
if (!lastUpdate) lastUpdate = timestamp;
@@ -93,6 +118,7 @@ Proximity Operations
if (keys['ArrowLeft'] || keys['a'] || keys['A']) playerHeading += turnRate;
if (keys['ArrowRight'] || keys['d'] || keys['D']) playerHeading -= turnRate;
if (keys['ArrowUp'] || keys['w'] || keys['W']) accel = thrust;
+ if (keys['Escape']) {resetState(difficulty); keys['Escape'] = false;}
// x key switches to practice mode
@@ -144,13 +170,15 @@ Proximity Operations
return;
}
// update trail
- if(phase > 2000) {
- phase -= 2000;
+ if(phase > 200) {
+ phase -= 200;
positions.push([ playerX, playerY ]);
- if(positions.length > 50) {
+ if(positions.length > 2000) {
positions.shift()
}
}
+ // update trajectory
+ recalculate_traj();
// Rendering
ctx.clearRect(0, 0, canvas.width, canvas.height);
@@ -192,17 +220,26 @@ Proximity Operations
ctx.lineTo(cx + 100 * Math.cos(3*Math.PI/2), cy + 100 * Math.sin(3*Math.PI/2));
ctx.stroke();
+ // Draw positions
+ ctx.strokeStyle = '#dd2222';
+ ctx.lineWidth = 3;
+ ctx.beginPath();
+ ctx.moveTo(cx - positions[0][0], cy - positions[0][1]);
for (let i = 0; i < positions.length; i++) {
- const pos = positions[i];
-
- // Calculate a radius that fades out (optional, creates a tapered end)
- const radius = (i / positions.length) * 5;
+ ctx.lineTo(cx - positions[i][0], cy - positions[i][1]);
+ }
+ ctx.lineTo(cx - playerX, cy - playerY);
+ ctx.stroke();
- ctx.beginPath();
- ctx.arc(cx - pos[0], cy - pos[1], radius, 0, Math.PI * 2, false);
- ctx.fillStyle = '#dd2222'; // Black dots
- ctx.fill();
+ // Draw trajectory
+ ctx.strokeStyle = '#d6edff';
+ ctx.lineWidth = 3;
+ ctx.beginPath();
+ ctx.moveTo(cx - trajectory[0][0], cy - trajectory[0][1]);
+ for (let i = 0; i < trajectory.length; i += 10) {
+ ctx.lineTo(cx - trajectory[i][0], cy - trajectory[i][1]);
}
+ ctx.stroke();
// Player spacecraft (simple triangle)
ctx.save();