Простите за смешное название. Я создал небольшую графическую демонстрацию, в которой 200 шариков подпрыгивают и сталкиваются, как на стенах, так и друг на друга. Вы можете увидеть, что у меня есть в настоящее время здесь: http://www.exeneva.com/html5/multipleBallsBouncingAndColliding/
Проблема в том, что всякий раз, когда они сталкиваются друг с другом, они исчезают. Я не уверен почему. Может кто-нибудь взглянуть и помочь мне?
ОБНОВЛЕНИЕ: Очевидно, что массив шаров имеет шары с координатами NaN. Ниже приведен код, где я помещаю шары в массив. Я не совсем уверен, как координаты получают NaN.
// Variables
var numBalls = 200; // number of balls
var maxSize = 15;
var minSize = 5;
var maxSpeed = maxSize + 5;
var balls = new Array();
var tempBall;
var tempX;
var tempY;
var tempSpeed;
var tempAngle;
var tempRadius;
var tempRadians;
var tempVelocityX;
var tempVelocityY;
// Find spots to place each ball so none start on top of each other
for (var i = 0; i < numBalls; i += 1) {
tempRadius = 5;
var placeOK = false;
while (!placeOK) {
tempX = tempRadius * 3 + (Math.floor(Math.random() * theCanvas.width) - tempRadius * 3);
tempY = tempRadius * 3 + (Math.floor(Math.random() * theCanvas.height) - tempRadius * 3);
tempSpeed = 4;
tempAngle = Math.floor(Math.random() * 360);
tempRadians = tempAngle * Math.PI/180;
tempVelocityX = Math.cos(tempRadians) * tempSpeed;
tempVelocityY = Math.sin(tempRadians) * tempSpeed;
tempBall = {
x: tempX,
y: tempY,
nextX: tempX,
nextY: tempY,
radius: tempRadius,
speed: tempSpeed,
angle: tempAngle,
velocityX: tempVelocityX,
velocityY: tempVelocityY,
mass: tempRadius
};
placeOK = canStartHere(tempBall);
}
balls.push(tempBall);
}
Ответы:
Ваша ошибка изначально исходит из этой строки:
У вас есть
ball1.velocitY
(что естьundefined
) вместоball1.velocityY
. Так чтоMath.atan2
дает вамNaN
, и этоNaN
значение распространяется через все ваши расчеты.Это не источник вашей ошибки, но есть еще кое-что, что вы можете изменить в этих четырех строках:
Вам не нужны дополнительные назначения, и вы можете просто использовать
+=
один оператор:источник
В функции есть ошибка
collideBalls
:Так должно быть:
источник