2014-07-05 5 views
14

में स्प्राइट्स को नष्ट करना मुझे फ़ेज़र में स्प्राइट्स को नष्ट करने में समस्या हो रही है।फ़ेसर

मेरे पास जावास्क्रिप्ट ऑब्जेक्ट है, चलिए इसे ब्लॉक करें। ब्लॉक स्प्राइट संपत्ति है, इसलिए की तरह सेट किया जाता है कि है:,

square[0] = Block; 
destroy[0] = Block; 

एक निश्चित अद्यतन() चक्र पर:

this.sprite = this.game.add.sprite(this.x, this.y, 'blocks', this.color); 

मेरी कोड में एक निश्चित बिंदु पर, ब्लॉक दो अलग सरणियों द्वारा संदर्भित है

square[0].sprite.destroy(true); //Destroy the sprite. 
square[0] = null; //Remove the reference. 

अगले अद्यतन() चक्र पर, जब मैं नष्ट [0], मैं देखने की अपेक्षा करेंगे देखो:: मैं, तो मैं निम्नलिखित कोड का उपयोग कर रहा स्प्राइट को नष्ट करने की जरूरत है

destroy[0].sprite: null 

हालांकि मैं क्या दिखाई दे रही है है:

destroy[0].sprite: b.Sprite 
गुण सिर्फ चूक और गलत पर सेट के साथ

। मेरी चिंता यह है कि, अगर मैं अब [0] को नष्ट करने के लिए नष्ट कर दूंगा, तो उस स्प्राइट ऑब्जेक्ट का क्या होगा?

क्या यह सिर्फ चारों ओर तैर जाएगा या यह स्वचालित रूप से साफ हो जाएगा? क्या मुझे ब्लॉक ऑब्जेक्ट को किसी तरह से नष्ट करना चाहिए? इसके अलावा, अगर नष्ट() संदर्भ को रद्द नहीं कर रहा है, तो यह मार() से अलग कैसे है?

इस मामले पर किसी भी विचार की सराहना की जाएगी। मार डालो के बीच

+2

कचरा कलेक्टर यह साफ होगा अगर वहाँ यह करने के लिए कोई संदर्भ है। – Oriol

+0

यदि आप जो खोज रहे हैं उसे मिला है, तो कृपया एक उत्तर स्वीकार करें। –

उत्तर

19

अंतर और

Kill नष्ट प्रतिपादन को रोकने के लिए माना जाता है, लेकिन वस्तु अभी भी मौजूद है। यदि आप पुन: प्रयोज्य वस्तु बनाना चाहते हैं तो यह अच्छा है। आप वास्तव में ऑब्जेक्ट को फिर से बनाने की लागत के बिना ऑब्जेक्ट को फिर से बना सकते हैं।

Destroy वस्तु और उससे संबंधित सब कुछ को हटा देना चाहिए। जब आप वस्तु को कचरा कलेक्टर को भेजना चाहते हैं तो आप इसका उपयोग करते हैं।

कृपया ध्यान दें कि पाठ की तरह कुछ वस्तुओं के लिए, आप kill उपयोग नहीं कर सकते, आप केवल उपयोग कर सकते हैं destroy

संदर्भ: http://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347

+0

मैं कचरा कलेक्टर के साथ वस्तु का उपयोग कैसे कर सकता हूं? –

0

@ibnu सही है। Destroy वस्तु को nukes, जबकि kill halts प्रतिपादन। हालांकि, आपका प्रश्न स्मृति रिसाव और जीसी से संबंधित है। मैं कोई जीसी समर्थक नहीं हूं, लेकिन मुझे लगता है कि यह हो रहा है।

//create an object 
this.sprite = this.game.add.sprite(this.x, this.y, 'blocks', this.color); 
//create additional references to the object 
square[0] = Block; 
destroy[0] = Block; 
//destroy the object via Phaser's call. Remove 1/2 reference 
square[0].sprite.destroy(true); //Destroy the sprite. 
square[0] = null; //Remove the reference. 

लेकिन destroy[0].sprite अभी भी आपके "नष्ट" स्प्राइट का संदर्भ रखता है। this.sprite शायद भी करता है। ऐसा इसलिए है क्योंकि फ़ेज़र नष्ट करने की विधि केवल ऑब्जेक्ट से फ़ेज़र विशिष्ट गुणों को हटा देती है। JS is in charge of generic object Garbage Collection। ऑब्जेक्ट उस से बच रहा है क्योंकि आपके पास अभी भी दायरे में वैध संदर्भ हैं।

दायरे destroy[0].sprite = null से संदर्भ को हटाकर या अगले राज्य को दायरे को बदलने के लिए प्रतीक्षा करके इस समस्या को ठीक करें (माना जाता है कि विनाश एक स्थिर var नहीं है)।आपको स्वयं मेमोरी संसाधनों को प्रबंधित करने की ज़रूरत नहीं है, जेएस! = सी। बस सुनिश्चित करें कि आप leak अंतर स्कॉप्स में चर नहीं हैं।

What is JavaScript garbage collection? (हालांकि मुझे नहीं लगता कि delete आदेश अब और जीसी के लिए सिफारिश की है है, यह निश्चित रूप से नहीं Phaser में आवश्यक है)