আমার বল (বস্তুগুলি) সঙ্কুচিত / অদৃশ্য হয়ে যাচ্ছে না কেন?


208

http://jsfiddle.net/goldrunt/jGL84/42/ এটি এই জেএস ফিডেলের 84 লাইন থেকে। 3 টি পৃথক প্রভাব রয়েছে যা 141-146 লাইনে অস্বাস্থ্যকর লাইনগুলিতে প্রয়োগ করা যেতে পারে। 'বাউন্স' প্রভাবটি যেমনটি করা উচিত তেমনি কাজ করে তবে 'এসপ্লোড' প্রভাবটি কিছুই করে না। এসপলড ফাংশনের অভ্যন্তরে আমাকে 'সঙ্কুচিত' ফাংশনটি অন্তর্ভুক্ত করা উচিত?

// 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
এম59

1
আপনি ত্রুটি আছে Uncaught ReferenceError: asplode is not defined। ফাংশন asplode()দৃশ্যমান নয়।
এন্ট জুরকোভিć

2
asplodeসঠিক সুযোগে নেই, setIntervalএকটি ফাংশন রেফারেন্স গ্রহণ করা উচিত, spliceএকটি সূচকের প্রয়োজন - বা সম্ভবত বিশ্ব কেবল আপনার সাথে সঙ্কুচিত হচ্ছে jsfiddle.net/5f85b
bendytree

3
এটি সম্পূর্ণ ভিন্ন প্রশ্ন। বলগুলির মধ্যে তাদের মধ্যে সাধারণ জিনিস রয়েছে। এবং জাভাস্ক্রিপ্ট। এবং মনোযোগ। ওহ এবং, দয়া করে, আপনি যদি রসিকতা করতে চান তবে কমপক্ষে স্বাদযুক্ত হন। (তবে তারা নির্বিশেষে মোছা যাচ্ছে))
বোলটক্লক

উত্তর:


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চলার সাথে সাথে বিবৃতিটি ইতিমধ্যে ঘটেছে (এটি প্রায় 100 মাইল আগে ঘটেছিল, সঠিক হওয়ার জন্য)। আমি ধরে নিই যে আপনি যা চান তা তা নয়। পরিবর্তে, আপনি একটি 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
@ তেরেখো: আমি তার সাথে বেঁচে থাকতে পারি :)
রকেট হাজমাত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.