2009-11-05 30 views
15

में गेम ऑब्जेक्ट्स के बीच संचार हाल ही में मैं सी # में एक गेम कोडिंग करने पर अपना हाथ आजमा रहा हूं। मैं इसके लिए एक्सएनए का उपयोग नहीं कर रहा हूं, जैसा कि मैंने सोचा था कि अगर मैं स्क्रैच से गेम को कोड करता हूं तो मैं और जानूंगा (हालांकि मैं मल्टीमीडिया इंजन का उपयोग कर रहा हूं)।गेम प्रोग्रामिंग - 2 डी

मैं एक 2 डी आरपीजी गेम तैयार करने की कोशिश कर रहा हूं - मुझे थोड़ा महत्वाकांक्षी पता है, हालांकि मुझे खेल के कम से कम बुनियादी हिस्सों (यानी 'बॉयलर प्लेट' कोड) की उचित समझ है, और मैं ' मैं एक ऐसे भाग पर पहुंचा जहां मुझे नहीं पता कि यहां से कहाँ जाना है।

2 डी गेम में, आप विभिन्न 'क्षेत्रों' के चारों ओर घूमकर खेल के माध्यम से प्रगति करते हैं। एक बार जब आप 'पोर्टल टाइल' दबाते हैं, तो आपको अगले क्षेत्र आदि में ले जाया जाता है।

मुझे यह समझने में समस्या हो रही है कि इन क्षेत्र वस्तु को कैसे स्थापित किया जाना चाहिए। यह मेरा पहला विचार था: प्रत्येक क्षेत्र में कुछ अलग संग्रह संरचनाएं होती हैं (उदाहरण के लिए, एक दृश्यता क्वाड्री, एक टकराव क्वाड्री, एआई इकाई सूची आदि)। तो अगर मैं खेल में दुश्मन इकाई को जोड़ना चाहता था, तो इसे दृश्यता क्वाड्री, टकराव क्वाड्री (क्योंकि आप संस्थाओं के साथ टकरा सकते हैं) और एआई इकाई सूची में डाल दिया जाएगा। जब क्षेत्र को अद्यतन अनुरोध प्राप्त होता है, तो यह इन संरचनाओं में से प्रत्येक को स्वयं को अपडेट करने के लिए कहता है, जो बदले में संस्थाओं को स्वयं को अपडेट करने के लिए कहता है। सब अच्छा, अब तक।

मेरा प्रश्न यह है: क्या होगा अगर इस दुश्मन को अन्य वस्तुओं के साथ संवाद करने की आवश्यकता हो? उदाहरण के लिए, यह जानना आवश्यक हो सकता है कि खिलाड़ी इसकी एक निश्चित सीमा में था या नहीं। या क्या यह खिलाड़ी द्वारा मारा गया था। या जहां सभी टकराव योग्य वस्तुएं क्षेत्र में हैं (इसलिए यह पथदर्शी हो सकती है)।

इस समस्या का पहला (और बुरा) समाधान प्रत्येक इकाई को प्रत्येक संग्रह के संदर्भ में पारित करने के लिए होगा। लेकिन यह स्पष्ट रूप से कसकर युग्मित वस्तुओं को प्रोत्साहित करता है, जो अच्छा नहीं है।

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

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

पढ़ने के लिए धन्यवाद।

+4

पाठ की दीवार डरावना है – Chad

उत्तर

4

आप Mediator pattern पर देख सकते हैं। यह आपको कम युग्मन करने की अनुमति देगा, लेकिन हाँ, आप अन्य ऑब्जेक्ट्स के बीच संचार की सुविधा के लिए मध्यस्थ वस्तु (ओं) में बहुत सारे कोड हैं। लेकिन मुझे लगता है कि यह या तो एक या दूसरे है। और फिर यह बेहतर है।यह आपको कुछ अद्यतन अनुरोधों को क्यूइंग करने और अधिक उपयुक्त समय पर अनुरोधों को संभालने, या कई अनुरोधों के बैच प्रोसेसिंग करने के बजाय ट्रकों को करने की अधिक स्वतंत्रता की अनुमति देगा, जो कि उन्हें एक-एक करके (hypothetically) कुछ प्रकार लगाएगा भूमि के ऊपर।

4

मुझे लगता है कि इस तरह की चीजों के लिए सबसे अच्छा विकल्प ऑब्जर्वर पैटर्न का उपयोग करना है ... घटनाएं बनाएं (निर्णय लें कि जेनेरिक या कंक्रीट एक और डिज़ाइन निर्णय कैसे है) और अपनी ऑब्जेक्ट्स को उनकी आवश्यकता के अनुसार सब्सक्राइब करने के लिए बनाएं।

उदाहरण के लिए, 2 इंजन निकट होने पर आपका इंजन टक्कर या निकटता घटनाओं को आग लगा सकता है, लेकिन उन लोगों को केवल रुचि रखने वाली संस्थाओं द्वारा ही प्राप्त किया जाएगा। आप पर्यवेक्षकों के साथ केवल उन स्थितियों की जांच करने के लिए कुछ अनुकूलन कर सकते हैं।

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

+1

कि हालांकि साथ समस्या यह है कि इंजन जिम्मेदार है सभी चीजों की निगरानी करने और आवश्यकता होने पर घटनाओं को फायर करने के लिए, स्वयं को बनाए रखने वाली संस्थाओं के विरोध में। –

3

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

आपके द्वारा वर्णित "संदेश प्रणाली" को एप्लिकेशन प्रोटोकॉल कहा जाता है और यह एक जटिल गूढ़ बाइनरी प्रणाली, या साधारण मानव पठनीय तार हो सकता है जो मैं अनुशंसा करता हूं। जैसे ही खिलाड़ी चलता है, सर्वर इसे उन इकाइयों की एक सूची भेज देगा जो ग्राहक की दृष्टि में हैं। गैर खिलाड़ी इकाइयां एक ही तरह से काम करती हैं। यह सर्वर से चीजों को करने की अनुमति के लिए, या किसी अन्य इकाई के बारे में जानकारी के लिए है जिसे सर्वर ने पहले भेजा था क्योंकि यह स्थानांतरित हो गया था और इकाई के दृश्य में आया था, और सर्वर उपयुक्त उत्तर या जानकारी का जवाब दे रहा था।

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

+1

विचार के लिए निश्चित रूप से भोजन। :) –

2

यदि आपके पास प्रबंधन करने वाली इकाई के ऊपर कोई वस्तु है तो यह आमतौर पर बहुत आसान होता है। (उदाहरण के लिए 'दुनिया' या 'खेल'।) यह आसानी से देख सकता है कि कौन सी संस्थाएं निकटता में हैं और दूसरों के अनुसार घटनाओं और अधिसूचनाओं को भेजती हैं।

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

(इसके अलावा, क्यों एक quadtree? के लिए एक 2D आरपीजी एक मोटे ग्रिड शायद लागू करने और समान रूप से उपयोगी करने के लिए बहुत सरल हो जाएगा।)

संबंधित मुद्दे