javascript - createJS hit test works in tick event, but not function -


यह आउटपुट देता है:

ली जियान शेंग लेबल हिट

  फ़ंक्शन टिक (घटना) {for (var i = 0; i & lt; allMyLabels.length; i ++) {var pt = allMyLabels [i]। GlobalToLocal (stage.mouseX, stage.mouseY); अगर (सभी माइलैबल्स [आई]। हिट टेस्ट (पीटी.एक्स, पीटी.आई)) {लॉग (सभी माइल लेबल [आई] .टेक्स्ट + "लेबल हिट"); }} Stage.update (घटना); }  

जब मैं इसे टिकटिक फ़ंक्शन से निकालता हूं, तो मुझे मिल जाता है:

अनक्यूट टाइप एरर: विधि 'globalToLocal' कॉल नहीं कर सकता

लेकिन, जैसा कि आप टिप्पणी से देख सकते हैं, allMyLabels [] खाली नहीं है, और इसमें एक createJS लेबल है ...

  cn_label = नया createjs.Text (itemObj.cn_name, "14px एरियल", "सफेद"); Cn_label.y = -45; // सभी लेबलों के माध्यम से लूप, प्रत्येक सभी MyLabels.push (cn_label) के लिए सबसे अच्छा चेक करें;  

HitTest फ़ंक्शन:

  फ़ंक्शन hitTest () {for (var i = 0; i & lt; allMyLabels.length; i ++) {लॉग ("लेबल : "+ सभी मील लेबल [आई] .text); // NOT अपरिभाषित, देता है: लेबल: ली जियान शेंग, जैसा कि अपेक्षित सभी माय लाबेल [i] .addEventListener ("माउसओवर", फ़ंक्शन () {var pt = allMyLabels [i]। GlobalToLocal (stage.mouseX, stage.mouseY); अगर (सभी माय-लेबल्स [आई]। हिट टेस्ट (पीटी.एक्स, पीटी.आई)) {लॉग (सभी माइल लेबल [आई] .टेक्स्ट + "लेबल हिट");} चरण। अपडेट ();}); }}  

जब मैं गेम शुरू करता हूँ, तो मैं अपना कैनवास, स्टेज, ऑब्जेक्ट्स और लेबल्स बना देता हूं, फिर फ़ंक्शन hitTest () को कॉल करें, फिर सक्षममहाउस ओवर (20) चरण में।

  फ़ंक्शन इनिट () {canvas = document.getElementById ("demoCanvas"); प्रारंभ(); } समारोह शुरू () {मंच = नया createj.Stage ("demoCanvas"); Stage.mouseMoveOutside = सच; // ऑब्जेक्ट बनाएँ DrawMap (); createInitialNPC (); stage.enableMouseOver (20); // एनीमेशन टिकर createjs.Ticker.addEventListener ("टिक", टिक); createjs.Ticker.setFPS (60); मुख्य घटनाएं(); stage.update (); }  

मुझे यह आउटपुट क्यों मिलता है?

समस्या का कारण

आप में hitTest () फ़ंक्शन i के पास मूल्य है जब ईवेंट ट्रिगर होने पर पाश के द्वारा बाहर निकलता है। इस प्रकार यह allMyLabels की लंबाई है जो मौजूद नहीं है (अंतिम ++ इसे अधिक जाता है।) इसके परिणामस्वरूप हमें सभी माय-लेबल [allMyLabels की संख्या] मिलता है, और जैसा कि 0 , यह एक गैर विद्यमान तत्व है।

संक्षिप्त में

यदि हमारे पास है:

  allMyLabels === [लेबल [0], // सभी मायलैबल्स [0] लेबल [1], // सभी माय लाबेल [1] लेबल [2] // सभी माय लाबेल [2]]; AllMyLabels.length === 3 सभी MyLabels [3] === अपरिभाषित  

समाधान

आपको इसे एक गुमनाम समारोह में लपेटने की आवश्यकता होगी, या (जैसा कि मैं पसंद करें), उपयोग करें (नोट पॉलीफिल अनुभाग)।

«

  divs = document.getElementsByTagName ('DIV'); फ़ंक्शन change_div (i, ई) {divs [i] .innerHTML = "हैलो" + i + "," + e.timeStamp; } फ़ंक्शन ok_one () {dl = divs.length; के लिए (i = 0; i & lt; dl; ++ i) {divs [i] .addEventListener ("माउसओवर", change_div.bind (यह, मैं)); // | | // | + - वर्तमान i // + ------- या नल}}  

का उपयोग (अनाम) फ़ंक्शन लपेटें, आईई)।

<पूर्व> के लिए (i = 0; i & lt; dl; ++ i) {divs [i] .addEventListener ("माउसओवर", (फ़ंक्शन (k) {// | | // | + ---- पास किया गया वर्तमान i। // + -------------- लपेटें और निष्पादित करें। // // यदि आप चाहें तो "I" को नाम दें + - - चालू फ़ंक्शन वाले वर्तमान फ़ंक्शन की वापसी, इस प्रकार क === i। | रिटर्न फ़ंक्शन (ई) {divs [k]। WinnerHTML = "नमस्कार" + k + "," + e.timeStamp;}}) (i )); // | | // | + ----- वर्तमान पाश को मैं फ़ंक्शन और अभी इसे निष्पादित करने के लिए पास करें। // + ------- लपेटें अंत //}

Comments

Popular posts from this blog

eclipse plugin - Run java code error: Workspace is closed -

ios - How do I use CFArrayRef in Swift? -

scala - Play Framework - how to bind form to a session field -