XNA के साथ खेल वास्तुकला के बारे में प्रश्न


12

इसलिए मैं आखिरकार XNA के साथ खेलने के लिए इधर-उधर हो गया और 2 डी गेम बनाने के साथ आस-पास रहा (मेरे पास एक दोस्त से कला संपत्ति का एक समूह है, जिसने इसे iOS पर विकसित किया है)

बहुत सारी चीजें करना आसान लगता है और बॉक्स से बाहर आना हालांकि मुझे बहुत सारे सामानों के ढेर के लिए छोड़ दिया गया है क्योंकि अधिकांश साहित्य (उदाहरण के लिए मैंने जो किताबें खरीदी हैं) 2 डी पर बहुत अधिक ध्यान नहीं देते हैं।

मैं वास्तव में किसी भी स्पष्टीकरण की सराहना करता हूँ या निम्नलिखित खोज पर अधिक जानकारी के लिए कहा जा रहा है:

  1. गेम सर्विस का क्या मतलब है? मैं एक वस्तु को एक सेवा के रूप में पंजीकृत करने के पूरे मुहावरे को समझता हूं ताकि कोई भी अन्य GameComponent इसे हड़प सके, हालांकि यह कैसे हरा देता है यह शायद सार्वजनिक या स्थिर बना देता है? उदाहरण के लिए, मेरी पुस्तक ने Game.cs वर्ग में स्प्राइटबैच ऑब्जेक्ट को पंजीकृत करने की सिफारिश की। मुझे यकीन नहीं है कि यह कैसे इसे केवल सार्वजनिक / स्थिर बनाने के लिए बेहतर है क्योंकि गेम एनीवेज (सिंगलटन) का केवल एक उदाहरण होना चाहिए?

  2. मुझे इस बात पर भ्रम है कि मुझे GameComponent या RenderableGameComponent से विरासत में कब मिलना चाहिए। मैं एक प्रबंधक / नियंत्रक डिजाइन का पालन करने की कोशिश कर रहा हूं, जैसे कि सभी इकाइयां एक एकल प्रबंधक और अन्य चीजों के लिए समान हैं। वर्तमान में मेरे पास GameComponent से प्रत्येक प्रबंधक / नियंत्रक का उत्तराधिकार है, हालांकि यह कैसे गेम ऑब्जेक्ट को सभी प्रबंधकों के पास रखता है और मैन्युअल रूप से उन पर अपडेट कॉल करता है और आकर्षित करता है?

  3. मैंने देखा कि प्रारंभ में ContentLoad () से पहले कॉल किया जाता है , मुझे यह कष्टप्रद लगा क्योंकि मेरे प्रारंभ में वह स्थान है जहाँ मैं अपनी कुछ इकाइयाँ बनाना चाहता हूँ (अर्थात स्प्राइट, प्लेयर आदि ..), हालाँकि मैं उन्हें अपना लोड नहीं दे सकता स्प्राइटशीट या बनावट के बाद से उन्हें लोड करने के लिए कॉल अभी तक नहीं हुआ है। क्या मैं शायद गलत तरीके से इनिशियलाइज़ कर रहा हूं या क्या लोग अभी कंटेंटलॉड में नीचे की बनावट को असाइन करते हैं?

वे वास्तव में नहीं समझ के मेरे सबसे बड़े " डब्ल्यूटीएफ " प्रतीत होते हैं

जवाबों:


11

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

प्रश्न का उत्तर देने के लिए, मैं आपको इस प्रश्न के उत्तर के बारे में बताऊंगा कि "सेवाओं का उपयोग क्यों करें?" । संक्षिप्त उत्तर यह है कि सेवाएं युग्मन (संस्करणकरण, निर्भरता, व्यापकता) के मुद्दों से बचने का एक अच्छा तरीका है, जो कि आप एक आत्म-निहित गेम में कभी नहीं सामना करेंगे । अधिकांश समय यह सिर्फ एक सदस्य बनाने के लिए सरल है public(और शायद भी static, अगर आप जल्दी में हैं) और अधिक दिलचस्प समस्याओं के बारे में चिंता करें।

आपके दूसरे प्रश्न का उत्तर देने के लिए, मैं आपको इस प्रश्न के उत्तर के बारे में बताऊंगा कि "गेम ऑब्जेक्ट के प्रत्येक उदाहरण के लिए ड्राएबलगैमकंपोनेंट का उपयोग करने की सहमति क्या है?" साथ ही खेल वास्तुकला पर मेरे विचार । संक्षिप्त उत्तर है: GameComponentकेवल अपनी कक्षाएं बनाने Drawऔर Updateअपने और अपने जैसे कॉलिंग तरीकों का उपयोग करने का कोई लाभ नहीं है । अगर GameComponentआपके वांछित आर्किटेक्चर से बिल्कुल मेल खाता है, तो इसका उपयोग करें - लेकिन लगभग हमेशा ऐसा नहीं होता है।

यदि आप तृतीय-पक्ष उपभोग के लिए लाइब्रेरी का निर्माण कर रहे हैं, तो केवल सेवाओं और घटकों का उपयोग करना वास्तव में दिलचस्प हो जाता है। XNA खुद ऐसा करता है - यह है IGraphicsDeviceServiceऔर GamerServicesComponent, उदाहरण के लिए। ये विशिष्ट decoupling आवश्यकताओं को पूरा करते हैं जो आप आमतौर पर एक गेम विकसित करते समय मुठभेड़ नहीं करते हैं।

अंत में, आपके तीसरे प्रश्न का उत्तर काफी सरल है: बस अपनी गेम इकाइयां बनाएं LoadContent। कोई खास बात नहीं है Initialize

यह इंगित करने के लायक है कि पूरी Microsoft.Xna.Framework.Gameविधानसभा वैकल्पिक है । यह एक अत्यंत उपयोगी शुरुआती बिंदु प्रदान करता है - लेकिन इसे किसी भी तरह से चीजों को करने के लिए "एक सही तरीका" नहीं माना जाना चाहिए।


इसे देखने का बहुत ही रोचक तरीका। मेरे उत्तर से बहुत अधिक यथार्थवादी और पृथ्वी के नीचे। अच्छी तरह से योग्य +1, सर।
जेसी इमोंड

मेरे पास कोई और सवाल नहीं है! जब आप एक Texture2D के लिए आकर्षित करते हैं तो मूल के बारे में क्या। क्या मूल को बनावट के निचले मध्य में रखना आम है? मैं एनिमेशन करने की कोशिश कर रहा हूं, और मुझे पता चल रहा है कि मूल (0,0) में बनावट थोड़ी शिफ्ट हो रही है, अगर चौड़ाई और ऊंचाई समान नहीं है
सेरटन

@ सेरटन: आपको वास्तव में एक नया प्रश्न बनाना चाहिए - क्योंकि यह मूल प्रश्न से काफी असंबंधित है। मैं आपके द्वारा इस प्रश्न पर किए गए संपादन को वापस करने जा रहा हूं। के लिए मूल SpriteBatch.Drawबनावट-पिक्सेल में निर्दिष्ट है बनावट के शीर्ष-बाईं ओर सापेक्ष निर्देशांक (या स्रोत आयत, यदि आप एक का उपयोग करते हैं)।
एंड्रयू रसेल

1
@Andrew: मैंने हाल ही में अपने खेल को फिर से बनाया है ताकि यह पूरी तरह से public/ staticगुणों के बजाय सेवाओं पर आधारित हो । क्यों? Testability। प्रॉपर्टी एप्रोच के साथ चीजों को स्विच करना असंभव है, जबकि यह तुच्छ है यदि सब कुछ एक के साथ शुरू होता है IServiceProviderजो आपके परीक्षण विधि द्वारा वर्ग की जरूरतों के साथ कुछ भी भरा जा सकता है। यह Gameआपके परीक्षण में स्वयं वस्तु को तुरंत हटाने की आवश्यकता से भी बचता है , जो बहुत जल्दी गड़बड़ हो जाता है।
मैथ्यू शेर्ले

एक तरफ के रूप में, मेरे पास अभी भी Gameवस्तु पर बहुत सारे सार्वजनिक गुण हैं । वे केवल उन इंटरफेस के माध्यम से एक्सेस करने के लिए होते हैं, जिन्हें धक्का दिया जाता है Game.Services, फिर सब कुछ पास हो जाता है ताकि वे फिर से बाहर निकल सकें।
मैथ्यू शेर्ले

3

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

पहले जो हमने सोचा था (और सेवाओं को शुरू करने के पीछे के कारणों में से एक) एक गेम के दौरान एक ग्राफिक्सडेविइस संदर्भ उपलब्ध करा रहा था। आमतौर पर हमारे पास गेमड्राइववाइस का गेम था और इसे गेम.ग्राफीविलेज की तरह एक संपत्ति के माध्यम से उजागर किया। इसके साथ समस्या यह थी कि यह गेम के लिए ग्राफिक्सडेविस को कसकर बाध्य करता था, किसी और को "स्वयं" डिवाइस (जैसे रेंडरर) की अनुमति नहीं देता था और किसी को गेम के नए संस्करण को शिपिंग किए बिना भविष्य के अपडेट किए गए ग्राफिक्सडाइसिस का उपयोग करने से रोकता था। t पीछे संगत हो।

आपके दूसरे प्रश्न के लिए, मैं मानूंगा कि इस तरह के घटक का उपयोग करना अधिक उपयोगी होगा यदि आप इसके बजाय एक घटक-आधारित दृष्टिकोण का पालन करेंगे, जैसे कि आपके पास Spriteघटकों की एक सूची होगी जो यह जानती होगी कि इसके बजाय खुद को कैसे आकर्षित और अपडेट करना है; प्रबंधक जो जानता है कि हर स्प्राइट को कैसे अपडेट और ड्रा करना है। मैं सहमत हूं, यह एक जैसा लगता है, लेकिन मैं एक घटक-आधारित डिज़ाइन पसंद करता हूं क्योंकि मुझे वास्तव में ऑब्जेक्ट-उन्मुख दृष्टिकोण पसंद है।

अपने तीसरे प्रश्न के लिए, हाँ आपको लोडकॉन्टेंट पद्धति में किसी भी प्रकार की सामग्री (संपत्ति, फ़ॉन्ट, आदि) को लोड करना चाहिए। इनिशियलाइज़ेशन के लिए, आप आमतौर पर इनिशियलाइज़ फंक्शन के भीतर प्लेयर ऑब्जेक्ट बनाएंगे और फिर इसकी सामग्री को लोडकॉन्टेंट के भीतर लोड करेंगे .. या आप चाहें तो लोडकॉन्टेंट के भीतर यह सब कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.