Dlaczego moje kule znikają? [Zamknięte]


202

Wybacz zabawny tytuł. Stworzyłem małe graficzne demo 200 kulek podskakujących i zderzających się, zarówno o ściany, jak io siebie nawzajem. Możesz zobaczyć, co aktualnie mam tutaj: http://www.exeneva.com/html5/multipleBallsBouncingAndColliding/

Problem polega na tym, że za każdym razem, gdy się zderzają, znikają. Nie jestem pewien dlaczego. Czy ktoś może rzucić okiem i pomóc mi?

AKTUALIZACJA: Najwyraźniej tablica kulek ma piłki o współrzędnych NaN. Poniżej znajduje się kod, w którym pcham piłki do tablicy. Nie jestem całkowicie pewien, w jaki sposób współrzędne uzyskują 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);
}

119
To dostaje mój głos, nawet jeśli tylko na najlepszy tytuł pytania roku !!
Alex

Odpowiedzi:


97

Twój błąd pochodzi początkowo z tego wiersza:

var direction1 = Math.atan2(ball1.velocitY, ball1.velocityX);

Masz ball1.velocitY(który jest undefined) zamiast ball1.velocityY. To Math.atan2daje wam NaNi ta NaNwartość propaguje się we wszystkich waszych obliczeniach.

To nie jest przyczyna twojego błędu, ale jest coś jeszcze, co możesz chcieć zmienić w tych czterech liniach:

ball1.nextX = (ball1.nextX += ball1.velocityX);
ball1.nextY = (ball1.nextY += ball1.velocityY);
ball2.nextX = (ball2.nextX += ball2.velocityX);
ball2.nextY = (ball2.nextY += ball2.velocityY);

Nie potrzebujesz dodatkowych zadań i możesz po prostu użyć samego +=operatora:

ball1.nextX += ball1.velocityX;
ball1.nextY += ball1.velocityY;
ball2.nextX += ball2.velocityX;
ball2.nextY += ball2.velocityY;

20

Wystąpił błąd w collideBallsfunkcji:

var direction1 = Math.atan2(ball1.velocitY, ball1.velocityX);

Powinno być:

var direction1 = Math.atan2(ball1.velocityY, ball1.velocityX);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.