यहां आपकी शर्तें हैं:
अन्य ऑब्जेक्ट अभी भी आपके निकाले गए निकाय पर निर्भर हो सकते हैं, इसे निकालने के बाद।
आप केवल इकाई को यह निर्दिष्ट करने के लिए चाहते हैं कि यह स्वयं को हटाने के लिए है।
आपके पास दोनों नहीं हो सकते। क्यों? क्योंकि आपकी इकाई की तुलना में उच्च स्तर पर कोड स्वयं (नीचे के उदाहरण देखें) यह तय करता है कि उस इकाई का उपयोग कब किया जाना है। नतीजतन, केवल उसी स्तर पर कोड यह निर्धारित कर सकता है कि आपकी इकाई हटाने के लिए फिट है या नहीं।
हालाँकि , ऐसा क्या हो सकता है कि कोई घटना जो उच्च स्तर के कोड के लिए सुन रहा है, उसे बंद करके इकाई स्वयं हटाने का अनुरोध कर सकती है । यह उच्च स्तर तब एक सूची में हटाने के लिए इस अनुरोध को संग्रहीत करता है।
उदाहरण 1: घटनाओं के बिना
आप अपनी दुनिया में संस्थाओं के बीच टकराव की जाँच कर रहे हैं। यह आपके मुख्य गेम लूप में उच्च स्तर पर संभाला जाता है, जो प्रत्येक इकाई को हर दूसरे के खिलाफ जांचता है। इस उदाहरण में, विशेष रूप से, जब कोई इकाई दूसरे से टकराती है, तो केवल उस इकाई का आंतरिक तर्क यह निर्धारित कर सकता है कि उसे कितना नुकसान हुआ है, और यह "समाप्त" हुआ है या नहीं। तो चलो टकरावों के लिए तर्क प्रवाह का पालन करें जहां आपके पास अपनी दुनिया में चार इकाइयां हैं, ए, बी, सी और डी। ए हमारी इकाई है जिसके साथ हम चिंतित हैं।
हम बी के साथ टकराव के लिए ए की जांच करते हैं। एक टक्कर है। A को 50% क्षति होती है।
हम सी के साथ टकराव के लिए ए की जांच करते हैं। एक टक्कर है। A को 50% क्षति होती है। क्योंकि क्षति 0 तक पहुंचती है, ए निर्धारित करता है कि यह "मर गया" है। यह सूची से खुद को हटा देता है।
हम डी के साथ टकराव के लिए ए की जांच करते हैं। कोई टक्कर नहीं हुई होगी, लेकिन आप कभी भी उस तक नहीं पहुंचेंगे: आपको एक रनटाइम अपवाद मिलता है क्योंकि आपकी संस्थाओं की सूची एक ट्रावेल ऑपरेशन के बीच में संशोधित की गई है।
उदाहरण 2: घटनाओं के साथ
पहले की तरह ही सेटअप।
हम बी के साथ टकराव के लिए ए की जांच करते हैं। एक टक्कर है। A को 50% क्षति होती है।
हम सी के साथ टकराव के लिए ए की जांच करते हैं। एक टक्कर है। A को 50% क्षति होती है। क्योंकि क्षति 0 तक पहुंचती है, ए निर्धारित करता है कि यह "मर गया" है। यह इकाई प्रबंधन कोड के लिए एक घटना कहता है, "मुझे ASAP निकालें"। इकाई प्रबंधन कोड घटना के हिस्से के रूप में भेजे गए इकाई संदर्भ को देखता है, और निकाले जाने वाली संस्थाओं की सूची में उस संदर्भ को संग्रहीत करता है।
हम डी के साथ टकराव के लिए ए की जांच करते हैं। कोई टक्कर नहीं है, और चेक ठीक काम करता है।
अब, वर्तमान गेम लूप पुनरावृत्ति के बहुत अंत में , निकाले जाने वाली संस्थाओं की सूची के माध्यम से चलाएं, और इनमें से प्रत्येक को अपनी मुख्य संस्थाओं की सूची से हटा दें।
आप देख सकते हैं कि यह समस्या से पूरी तरह कैसे बचा जाता है। आपको घटनाओं का उपयोग करने की आवश्यकता नहीं है, आप संकेतों या कुछ और का उपयोग कर सकते हैं, लेकिन सिद्धांत एक ही है - जब तक आप सुरक्षित रूप से ऐसा नहीं कर सकते, तब तक संस्थाओं को न हटाएं। इस दृष्टिकोण से फ़्लिपसाइड, चीजों को साफ और व्यवस्थित रखने के लिए, संस्थाओं को जोड़ने के लिए वही कर रहा है - सुनिश्चित करें कि आप उनके लिए संदर्भ रखते हैं, और केवल उन्हें अगले गेम लूप पुनरावृत्ति की शुरुआत में जोड़ते हैं।
अंत में, अपनी मुख्य-सूची में परिवर्धन / निष्कासन करने के लिए हर बार जब आप उनका उपयोग करते हैं, तो आप अपनी इन-रिमूव और अपनी ऐड-टू लिस्ट दोनों को फ्लश करना नहीं भूलते।
पुनश्च। व्यक्तिगत निष्कासन करने के लिए अपनी मुख्य सूची के माध्यम से तलाश करने से डरो मत। यह इकाई प्रबंधन का हिस्सा और पार्सल है, और यहां तक कि बड़े पैमाने पर सूचियों को बहुत तेजी से पार करने की प्रवृत्ति है - आखिरकार, यही वे इसके लिए इंजीनियर हैं।