Here's the repo: https://github.com/ZorvyY/projectiles
I've implement a Vector class and a projectile class(which is functionally just a pair of vectors). When I try to store a projectile object I've created in an array, the values of the projectile change. Here is the relevant code.
In src/Vec.js:
export default class Vec {
constructor(x, y) {
this.x = x;
this.y = y;
}
// More methods...
}
In src/Projectile.js:
import Vec from './Vec.js';
class Projectile {
constructor(position, velocity) {
this.position = position;
this.velocity = velocity;
}
// More methods...
}
In src/app.js:
import Projectile from './Projectile.js';
import Vec from './Vec.js';
let projectiles = [];
let canvas = document.getElementById('canvas');
function handleMouseDown(event) {
let startX = event.offsetX;
let startY = event.offsetY;
function handleMouseUp(event) {
let endX = event.offsetX;
let endY = event.offsetY;
let newProj = computeProjectile(startX, startY, endX, endY);
console.log('newProj', newProj);
canvas.removeEventListener('mouseup', handleMouseUp);
//projectiles.push(newProj);
//console.log(projectiles);
}
canvas.addEventListener('mouseup', handleMouseUp);
}
canvas.addEventListener('mousedown', handleMouseDown);
function computeProjectile (x1, y1, x2, y2) {
console.log('In computeProjectile:');
console.log(arguments);
let startVec = new Vec(x1, y1);
let endVec = new Vec(x2, y2);
let deltaVec = Vec.minus(endVec, startVec);
let proj = new Projectile(startVec, deltaVec);
console.log('startVec', startVec);
console.log('endVec', endVec);
console.log('proj', proj);
return proj;
}
In the current state, each console.log statement produces the expected values. However, when I uncomment the line projectiles.push(newProj);
, the projectile object stores nonsensical values instead of properly computed values. Keep in mind that the console.log statements are executed before projectiles.push(newProj)
.
In other words:
function handleMouseDown(event) {
let startX = event.offsetX;
let startY = event.offsetY;
function handleMouseUp(event) {
let endX = event.offsetX;
let endY = event.offsetY;
let newProj = computeProjectile(startX, startY, endX, endY);
console.log('newProj', newProj); //Nonsensical value if projectiles.push(newProj) is uncommented
canvas.removeEventListener('mouseup', handleMouseUp);
//projectiles.push(newProj);
//console.log(projectiles);
}
canvas.addEventListener('mouseup', handleMouseUp);
}
canvas.addEventListener('mousedown', handleMouseDown);
function computeProjectile (x1, y1, x2, y2) {
console.log('In computeProjectile:');
console.log(arguments);
let startVec = new Vec(x1, y1);
let endVec = new Vec(x2, y2);
let deltaVec = Vec.minus(endVec, startVec);
let proj = new Projectile(startVec, deltaVec);
console.log('startVec', startVec); //Always produces expected value
console.log('endVec', endVec); //Always produces expected value
console.log('proj', proj); //Will produce a different nonsensical value than newProj if projectiles.push(newProj) is uncommented
return proj;
}
even if I replace the line let newProj = computeProjectile(startX, startY, endX, endY);
with other constants (ie computeProjectile(12,10,50,50)
, the output of the console.log statements is different each time.
Why would storing an object in an array AFTER outputting its values change what values were outputted?