मेरी गेंदें क्यों गायब हो रही हैं? [बन्द है]


202

अजीब शीर्षक क्षमा करें। मैंने दीवारों और एक दूसरे के खिलाफ, उछलकर और टकराकर, 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);
}

119
यह मेरा वोट हो जाता है, भले ही वर्ष के सर्वश्रेष्ठ प्रश्न शीर्षक के लिए ही क्यों न हो !!
एलेक्स

जवाबों:


97

इस पंक्ति से आपकी त्रुटि शुरू में आती है:

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

आपके पास ball1.velocitY(जिसके undefinedबजाय) है ball1.velocityY। तो Math.atan2आपको दे रहा है NaN, और वह NaNमूल्य आपके सभी गणनाओं के माध्यम से प्रचारित कर रहा है।

यह आपकी त्रुटि का स्रोत नहीं है, लेकिन कुछ और है जो आप इन चार लाइनों पर बदलना चाहते हैं:

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

आपको अतिरिक्त असाइनमेंट की आवश्यकता नहीं है, और बस +=ऑपरेटर को अकेले उपयोग कर सकते हैं:

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

20

collideBallsफ़ंक्शन में कोई त्रुटि है :

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

यह होना चाहिए:

var direction1 = Math.atan2(ball1.velocityY, ball1.velocityX);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.