Tại sao những quả bóng của tôi biến mất? [đóng cửa]


202

Xin tha thứ cho tiêu đề hài hước. Tôi đã tạo ra một bản demo đồ họa nhỏ gồm 200 quả bóng nảy và va chạm, cả hai vào tường và nhau. Bạn có thể thấy những gì tôi hiện đang có ở đây: http://www.exeneva.com/html5/mult MônBallsBouncingAndColliding /

Vấn đề là bất cứ khi nào chúng va chạm với nhau, chúng sẽ biến mất. Tôi cung không chăc tại sao. Ai đó có thể xem và giúp tôi ra?

CẬP NHẬT: Rõ ràng mảng bóng có các quả bóng có tọa độ NaN. Dưới đây là mã nơi tôi đẩy bóng đến mảng. Tôi không hoàn toàn chắc chắn làm thế nào tọa độ nhận được 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
Điều này nhận được phiếu bầu của tôi, ngay cả khi chỉ cho tiêu đề câu hỏi hay nhất trong năm !!
Alex

Câu trả lời:


97

Lỗi của bạn xuất phát từ dòng này ban đầu:

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

Bạn có ball1.velocitY(đó là undefined) thay vì ball1.velocityY. Vì vậy, Math.atan2đang mang lại cho bạn NaN, và NaNgiá trị đó đang lan truyền qua tất cả các tính toán của bạn.

Đây không phải là nguồn gốc của lỗi của bạn, nhưng có một thứ khác mà bạn có thể muốn thay đổi trên bốn dòng này:

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

Bạn không cần các bài tập bổ sung và chỉ có thể sử dụng +=toán tử một mình:

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

20

Có lỗi trong collideBallschức năng:

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

Nó nên là:

var direction1 = Math.atan2(ball1.velocityY, ball1.velocityX);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.