मेरी गेंद (वस्तुएं) सिकुड़ती / गायब क्यों नहीं हो रही हैं?


208

http://jsfiddle.net/goldrunt/jGL84/42/ यह जेएस फिडल में लाइन 84 से है। 3 अलग-अलग प्रभाव हैं जो 141-146 लाइनों को जोड़कर गेंदों पर लागू किए जा सकते हैं। 'उछाल' प्रभाव उसी रूप में काम करता है, जैसा कि होना चाहिए, लेकिन 'asplode' प्रभाव कुछ नहीं करता है। क्या मुझे एस्प्लोडे फ़ंक्शन के अंदर 'हटना' फ़ंक्शन शामिल करना चाहिए?

// balls shrink and disappear if they touch
var shrink = function(p) {
    for (var i = 0; i < 100; i++) {
        p.radius -= 1;
    }
    function asplode(p) {
        setInterval(shrink(p),100);
        balls.splice(p, 1);
    }
}

12
asplodeवैश्विक दायरे में घोषित नहीं किया गया है (या विशेष रूप से, सुलभ में परिभाषित नहीं है update); हमारे कंसोल की जाँच करें।
अप्सिलर्स

39
सौभाग्य से, यह balls.splice()एक के साथ है p
m59

1
आपकी त्रुटि है Uncaught ReferenceError: asplode is not defined। कार्य asplode()दिखाई नहीं दे रहा है।
Anto Jurković

2
asplodeसही दायरे में नहीं है, setIntervalएक फ़ंक्शन संदर्भ प्राप्त करना चाहिए, spliceएक इंडेक्स की आवश्यकता है - या शायद दुनिया बस आपके साथ सिकुड़ रही है jsfiddle.net/5f85b
bendytree

3
यह बिलकुल अलग सवाल है। केवल एक चीज जो उनके पास है वह है गेंदें। और जावास्क्रिप्ट। और ध्यान। ओह, और, कृपया, यदि आप चुटकुले बनाना चाहते हैं, तो कम से कम स्वादिष्ट बनें। (लेकिन वे परवाह किए बिना हटाए जा सकते हैं जा रहे हैं।)
BoltClock

जवाबों:


65

आपके कोड में कुछ समस्याएं हैं।

सबसे पहले, अपनी परिभाषा में:

var shrink = function(p) {
    for (var i = 0; i < 100; i++) {
        p.radius -= 1;
    }

    function asplode(p) {
         setInterval(shrink(p),100);
        balls.splice(p, 1);
    }
}

asplodeअंदर के दायरे के लिए स्थानीय है shrinkऔर इसलिए उस कोड के लिए सुलभ नहीं है updateजहां आप इसे कॉल करने का प्रयास कर रहे हैं। जावास्क्रिप्ट स्कोप फ़ंक्शन-आधारित है, इसलिए updateयह नहीं देख सकता asplodeक्योंकि यह अंदर नहीं है shrink। ( अपने कंसोल में , आप की तरह एक त्रुटि दिखाई देगी: Uncaught ReferenceError: asplode is not defined।)

आप पहले इसके बजाय asplodeबाहर जाने की कोशिश कर सकते हैं shrink:

var shrink = function(p) {
    for (var i = 0; i < 100; i++) {
        p.radius -= 1;
    }
}

function asplode(p) {
     setInterval(shrink(p),100);
     balls.splice(p, 1);
}

हालाँकि, आपके कोड में कई और समस्याएं हैं जो इस प्रश्न के दायरे से बाहर हैं:

  • setIntervalएक समारोह की उम्मीद है। तत्काल-आह्वान का वापसी मूल्य प्राप्त करने का setInterval(shrink(p), 100)कारण बनता setIntervalहै । आप शायद चाहते हैं shrink(p)

    setInterval(function() { shrink(p) }, 100)
  • आपका कोड for (var i = 0; i < 100; i++) { p.radius -= 1; }शायद वह नहीं करता है जो आप सोचते हैं कि यह करता है। यह तुरंत 100 बार क्षरण ऑपरेशन चलाएगा, और फिर नेत्रहीन परिणाम दिखाएगा। यदि आप प्रत्येक नए आकार में गेंद को फिर से प्रस्तुत करना चाहते हैं, तो आपको अलग-अलग टाइमिंग कॉलबैक (एक setIntervalऑपरेशन की तरह ) के अंदर प्रत्येक व्यक्तिगत डिक्रीमेंट करना होगा ।

  • .spliceएक संख्यात्मक सूचकांक की उम्मीद है, एक वस्तु नहीं। आप किसी वस्तु का संख्यात्मक सूचकांक प्राप्त कर सकते हैं indexOf:

    balls.splice(balls.indexOf(p), 1);
  • जब तक आपका अंतराल पहली बार चलता है, तब तक balls.spliceबयान पहले ही हो चुका है (यह लगभग 100ms पहले हुआ था, सटीक होने के लिए)। मुझे लगता है कि आप क्या चाहते हैं नहीं है। इसके बजाय, आप एक decrementing समारोह है कि बार-बार से बुलाया जाता है होना चाहिए setIntervalऔर अंत में प्रदर्शन balls.splice(p,1)के बाद p.radius == 0


21
setInterval(shrink(p),100);

यह वह नहीं करता है जो आपको लगता है कि यह करता है। यह कॉल shrink, इसे पास करता है p, और फिर परिणाम को पास करता है setIntervalshrink(p)रिटर्न undefined, इसलिए यह लाइन वास्तव में कुछ भी अंतराल पर नहीं डालती है।

आप शायद चाहते हैं:

setInterval(function(){
    shrink(p)
}, 100);

1
@ tereško: मैं उस के साथ रह सकता हूं :)
रॉकेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.