विभिन्न प्रकार की संस्थाओं की सूची प्रबंधित करना - क्या बेहतर तरीका है?


9

मैं मोबाइल उपकरणों के लिए 2 डी स्पेस गेम विकसित कर रहा हूं, लेकिन यह वास्तव में जटिल हो गया है और मेरा समाधान फिर से भ्रमित है और बहुत सारे कोड सेगमेंट का उत्पादन करता है।

मेरे पास एक विश्व स्तर है, जिसमें मेरे पास विभिन्न वस्तुओं की बहु-सूचियाँ हैं जैसे:

List<Enemy> enemys;
List<Projectile> projectiles;
List<Collectable> collectables;
List<Asteroid> asteroids;
List<Effect> effects;
..

प्रत्येक सूची विश्व वर्ग द्वारा अद्यतन की जाती है। लेकिन सभी नहीं .. प्रत्येक दुश्मन इंजन की एक सूची है, और दुश्मन द्वारा अद्यतन किया जाता है, जो हथियारों की सूची है। अब प्रत्येक इंजन विश्व सूची 'प्रभावों' के लिए कुछ अग्नि प्रभाव जोड़ता है, और प्रत्येक शस्त्रागार दुनिया की सूची में 'प्रोजेक्टाइल' के लिए प्रोजेक्टाइल जोड़ता है। इन सभी वर्गों में अलग-अलग पैरामीटर हैं, इसलिए मुझे प्रत्येक वर्ग के लिए एक अतिरिक्त अपडेट और अतिरिक्त रेंडर फ़ंक्शन की आवश्यकता है।

कम से कम वे 'गेमऑब्जेक्ट' के सभी चिल्ड हैं जो उन्हें स्थिति, वेग और त्वरण वैक्टर जैसी बुनियादी चीजें प्रदान करते हैं, पॉलीगनों को बाध्य करते हैं और जैसे आवेदन और एक परिमित राज्य मशीन

क्या ऐसा करने का एक बेहतर या अधिक सामान्य तरीका है? एक कैच-ऑल क्लास की तरह जिसमें सभी अलग-अलग ऑब्जेक्ट्स के लिए सभी संभव पैरामीटर और विधियां शामिल हैं। (मुझे लगता है कि यह और भी भ्रामक कोड उत्पन्न करेगा)


यह मेरे प्रश्न के समान है: gamedev.stackexchange.com/questions/22559/… मैं सुझाव देता हूं कि यह दिए गए उत्तरों को देख रहा है।
डेरेक

जवाबों:


5

क्या ऐसा करने का एक बेहतर या अधिक सामान्य तरीका है? एक कैच-ऑल क्लास की तरह जिसमें सभी अलग-अलग ऑब्जेक्ट्स के लिए सभी संभव पैरामीटर और विधियां शामिल हैं।

हाँ, यह एक कहा जाता है आर्किटेक्चर। विवरण के लिए यहां एक नज़र डालें ।

यह आपके विश्व स्तर पर संस्थाओं की सिर्फ एक सूची देगा:

List<Entity>

यह उत्तराधिकार पर संरचना का एक उदाहरण है ।


3

आपके मूल प्रश्न की सीमा के भीतर एक विकल्प यह होगा कि आपके पास जो है उसके प्रकारों के बजाय क्रियाओं में सूचियों को तोड़ दें। उदाहरण के लिए, आपके पास एक List<HasAI>और एक के लिए होगा List<Collidable>और जब आप एक नई वस्तु बनाते हैं तो यह खुद को जोड़ता है जो भी कार्रवाई सूची में इसकी आवश्यकता होती है, जब वस्तु नष्ट हो जाती है तो यह उन सूचियों से खुद को हटा देता है। एक वस्तु कई सूचियों पर हो सकती है।

उस विकल्प के चरण दो में अपनी कक्षाओं को एक पदानुक्रम से एक में फिर से जोड़ना है जो इंटरफेसेस का उपयोग करता है, इसलिए आपका HasAI प्रकार एक वर्ग है जो एक उदाहरण के रूप में IBrains इंटरफ़ेस को लागू करता है। यह मिलान करते हुए कि List<HasAI>केवल ऑब्जेक्ट्स में IBrains इंटरफ़ेस होना आवश्यक है।

यह जटिलता में से कुछ को साफ करने में मदद करना चाहिए।


2

मुझे लगता है कि आपको जो करने की ज़रूरत है वह अपने स्वयं के वर्गों के लिए प्रदान करने के लिए सार है, मुझे लगता है कि एक खिलाड़ी के लिए और एक दुश्मन के लिए (या शायद खिलाड़ी के लिए सिर्फ एक है, और फिर खिलाड़ी और दुश्मन के लिए इसका एक उदाहरण बनाएं - 100% निश्चित नहीं अपने खेल डिजाइन की।)

आप रेंडरर लूप को विभिन्न ऑब्जेक्ट्स के चारों ओर जाने के लिए एक विज़िटर पैटर्न का उपयोग कर सकते हैं और यह तय कर सकते हैं कि क्या कम है, जो कम जटिल हो सकता है।


2

बेस क्लास का उपयोग करना और बहुरूपता पर भरोसा करना एक बहुत अच्छा विचार है। लेकिन कुछ वैकल्पिक दृष्टिकोण हैं। नोएल लोपिस के दो लेख हैं जो पढ़ने लायक हैं। मैं हाल ही में डेटा ओरिएंटेड डिज़ाइन को देख रहा हूं और सोचता हूं कि इसमें कुछ योग्यता है।

लेख यहाँ और यहाँ हैं । यह आपके कोड को थोड़ा और फिर बहुरूपता को सरल बना सकता है। लेकिन कुछ भी YMMV की तरह, एक नज़र डालें और देखें कि क्या आप इसे हासिल करने की कोशिश कर रहे हैं। बहुरूपता वंशानुक्रम का उपयोग करता है और DOD एकत्रीकरण का उपयोग करता है दोनों के पक्ष और विपक्ष हैं इसलिए अपना जहर चुनें।


1

आप ओओपी और विशेष रूप से बहुरूपता का उपयोग करके कर सकते हैं।

मूल रूप से, आपको एक बेस क्लास बनाना होगा, जिसे सभी गेम इकाइयां विरासत में मिली हैं। यह आधार वर्ग, जितना संभव हो उतना सार है, इसमें एक निर्माण, अद्यतन और शायद एक नष्ट कार्य जैसी चीजें शामिल होंगी।

फिर आप इस वर्ग से अपने अन्य सभी खेल वस्तुओं को प्राप्त करते हैं। आपको संभवतः अपने कोड में कुछ प्रकार के प्रतिबिंब जोड़ने की आवश्यकता होगी यदि आपकी भाषा इसका समर्थन नहीं करती है, कुछ और उन्नत चीजें करने के लिए, लेकिन यह बेहतर है कि यदि आप जानते हैं कि कैसे अपनी विरासत को सही ढंग से संरचना करना है।


1
उन्होंने पहले से ही ऐसा किया है - उनकी सभी कक्षाएं गेम ऑबजेक्ट के बच्चे हैं। उसे गेमऑब्जेक्ट की एक सूची में अपनी सूचियों की श्रृंखला को मोड़ने की जरूरत है।
SomeGuy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.