एक 2 डी गेम के लिए मैं (एंड्रॉइड के लिए) बना रहा हूं, मैं एक घटक-आधारित सिस्टम का उपयोग कर रहा हूं जहां गेमऑब्जेक्ट में कई गेमकंपोनेंट ऑब्जेक्ट्स हैं। गेमकंपोनेंट्स इनपुट घटकों, प्रतिपादन घटकों, बुलेट उत्सर्जक घटकों, आदि जैसे चीजें हो सकती हैं। वर्तमान में, गेमकंपोनेंट्स के पास उस ऑब्जेक्ट का संदर्भ है जो उनका मालिक है और इसे संशोधित कर सकता है, लेकिन GameObject के पास केवल घटकों की एक सूची है और यह तब तक परवाह नहीं करता है जब तक ऑब्जेक्ट अपडेट होने पर उन्हें अपडेट किया जा सके।घटक-आधारित गेम इंजन में संचार
कभी-कभी किसी घटक में कुछ जानकारी होती है जिसे GameObject को जानना आवश्यक है। उदाहरण के लिए, टकराव का पता लगाने के लिए गेमऑब्जेक्ट टकराव पहचान उपप्रणाली के साथ खुद को पंजीकृत करता है जब यह किसी अन्य ऑब्जेक्ट के साथ टकराता है। टकराव का पता लगाने उपप्रणाली को वस्तु के बाध्यकारी बॉक्स को जानने की आवश्यकता है। मैं ऑब्जेक्ट में एक्स और वाई को सीधे स्टोर करता हूं (क्योंकि यह कई घटकों द्वारा उपयोग किया जाता है), लेकिन चौड़ाई और ऊंचाई केवल प्रतिपादन घटक के लिए जाना जाता है जिसमें ऑब्जेक्ट का बिटमैप होता है। मैं गेमऑब्जेक्ट में बाउंडिंगबॉक्स या GetWidth प्राप्त करने के लिए एक विधि प्राप्त करना चाहता हूं जो उस जानकारी को प्राप्त करे। या सामान्य रूप से, मैं किसी घटक से ऑब्जेक्ट में कुछ जानकारी भेजना चाहता हूं। हालांकि, मेरे वर्तमान डिज़ाइन में GameObject यह नहीं जानता कि सूची में उसके पास कौन से विशिष्ट घटक हैं।
मैं इस समस्या को हल करने के कई तरीके के बारे में सोच सकते हैं:
इसके बजाय घटकों की एक पूरी तरह से सामान्य सूची होने के, मैं GameObject महत्वपूर्ण घटकों में से कुछ के लिए विशिष्ट क्षेत्र है दे सकते हैं। उदाहरण के लिए, इसमें एक सदस्य चर हो सकता है जिसे renderingComponent कहा जाता है; जब भी मुझे ऑब्जेक्ट की चौड़ाई प्राप्त करने की आवश्यकता होती है तो मैं बस
renderingComponent.getWidth()
का उपयोग करता हूं। यह समाधान अभी भी घटकों की सामान्य सूची के लिए अनुमति देता है लेकिन यह उनमें से कुछ को अलग-अलग व्यवहार करता है, और मुझे डर है कि मैं कई असाधारण क्षेत्रों को समाप्त कर दूंगा क्योंकि अधिक घटकों को पूछताछ की आवश्यकता है। कुछ वस्तुओं में प्रतिपादन घटक भी नहीं होते हैं।गेमऑब्जेक्ट के सदस्यों के रूप में आवश्यक जानकारी है लेकिन घटकों को इसे अपडेट करने की अनुमति दें। इसलिए किसी ऑब्जेक्ट की चौड़ाई और ऊंचाई होती है जो डिफ़ॉल्ट रूप से 0 या -1 होती है, लेकिन एक प्रतिपादन घटक उन्हें अपने अद्यतन लूप में सही मानों पर सेट कर सकता है। यह एक हैक की तरह लगता है और मैं कई चीजों को गेम ऑब्जेक्ट क्लास में सुविधा के लिए धक्का दे सकता हूं, भले ही सभी वस्तुओं को उनकी आवश्यकता न हो।
क्या घटक एक इंटरफेस को कार्यान्वित करते हैं जो इंगित करता है कि किस प्रकार की जानकारी के लिए पूछताछ की जा सकती है। उदाहरण के लिए, एक प्रतिपादन घटक हैस्साइज इंटरफ़ेस को कार्यान्वित करेगा जिसमें GetWidth और getHeight जैसी विधियां शामिल होंगी। जब GameObject को चौड़ाई की आवश्यकता होती है, तो यह अपने घटकों की जांच करता है कि क्या वे हैस्साइज इंटरफेस को कार्यान्वित करते हैं (जावा में
instanceof
कीवर्ड का उपयोग करके, याis
सी # में)। यह एक अधिक सामान्य समाधान की तरह लगता है, एक नुकसान यह है कि घटक की खोज में कुछ समय लग सकता है (लेकिन फिर, अधिकांश वस्तुओं में केवल 3 या 4 घटक होते हैं)।
यह प्रश्न एक विशिष्ट समस्या के बारे में नहीं है। यह अक्सर मेरे डिजाइन में आता है और मैं सोच रहा था कि इसे संभालने का सबसे अच्छा तरीका क्या है। प्रदर्शन कुछ हद तक महत्वपूर्ण है क्योंकि यह एक गेम है, लेकिन प्रति वस्तु घटकों की संख्या आम तौर पर छोटी है (अधिकतम 8 है)।
एक खेल के लिए लघु संस्करण
एक घटक आधारित प्रणाली में, जबकि डिजाइन सामान्य रखने वस्तु के लिए घटकों से जानकारी पारित करने के लिए सबसे अच्छा तरीका क्या है?
मुझे उम्मीद है कि यह जवाब होगा; कि कई दृष्टिकोण हैं और वे सभी अलग-अलग संदर्भों में काम करने योग्य हैं। आप पूरी तरह जेनेरिक सिस्टम के बारे में सही हैं, मैं अधिक इंजीनियरिंग था और उन समस्याओं के बारे में चिंता कर रहा हूं जो अस्तित्व में नहीं हैं। –