मुझे अपने एंड्रॉइड गेम को कुशलता से कैसे विकसित करना चाहिए? [बन्द है]


11

मैंने एक फ्लो चार्ट की एक छवि संलग्न की है जिसे मैंने पेंट में बनाया है। खेल अवधारणा का फ्लो चार्ट

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

मेरे प्रश्न हैं:

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

जवाबों:


12

एंड्रॉइड गेम्स के बहुत सारे स्कोप / लोड या विकल्प / वरीयताओं को सही ठहराने के लिए बहुत बड़े दायरे में नहीं हैं, कभी भी कस्टम वर्णों और जैसे कि बस ट्रेन के घर पर 10 मिनट के लिए ऑफहैंड खेले जाते हैं।

गलती मत करो मैंने पहले एंड्रॉइड गेम के लिए एक बड़े दायरे के साथ किसी चीज को गले लगाने की गलती की थी। छोटे खेलों का एक गुच्छा बनाएं फिर कुछ बड़ा करें

Android की बारीकियां:

संरचना:

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

जब आप शीर्ष से एक पॉप करते हैं, तो यह आम तौर पर नष्ट हो जाता है और अगली बार फिर से बनाया जाएगा जब उपयोगकर्ता एक नई गतिविधि शुरू करता है (startActivity आशय)। यह गतिविधियों के बीच राज्यों को बनाए रखना कठिन बनाता है और एकल गतिविधि वास्तुकला की ओर जाता है

आप उस पर "नया गेम / लोड गेम / विकल्प" मेनू के साथ होम स्क्रीन प्रकार गतिविधि करना चाहते हैं, और लॉन्च गतिविधि कर सकते हैं। हालाँकि, आपको अंत में एक खेल मेनू के साथ-साथ आपकी खेल गतिविधि में भी शामिल होना होगा, जिसमें इसके अधिकांश कार्य होंगे

मेरा अपना ऐप, मैंने एक "MenuActivity" बनाया जिसमें ऐसे कार्य हैं जो एक नया गेम लॉन्च करते हैं, सहेजते हैं, लोड करते हैं, विकल्प बदलते हैं। फिर मेरी होमएक्टिविटी का विस्तार है, जैसा कि मेरी गेमएक्टिविटी है।

चूंकि सब कुछ एक गतिविधि वर्ग में है, इसलिए मैं गतिविधि कक्षाओं की एक उत्तराधिकार बनाने और निजी, संरक्षित और डिफ़ॉल्ट स्कोप लॉट का उपयोग करने की सलाह दूंगा। इस तरह से करना, आप कम से कम चीजों को अलग-अलग फ़ाइल में विभाजित कर सकते हैं ताकि एक असहनीय गतिविधि फ़ाइल होने से रोक सके। मेरे अपने ऐप के लिए:

GraphicsEngine extends MenuActivity

PhysicsEngine extends GraphicsEngine

GameLogicActivity extends PhysicsEngine

UIActivity extends GameLogicActivity

चूंकि मेरा ऐप 3D ओपेंगल-एस है, बहुत सारा सामान मैं क्रॉस-एक्टिविटीज में काम नहीं करता, इसलिए सब कुछ एक ही एक्टिविटी में है, इसलिए हो सकता है कि मैं एक एक्टिविटी आर्किटेक्चर का इस्तेमाल करने का पक्षपाती हूं

-

थ्रेडिंग

खेल गतिविधि के लिए, आपके पास दो धागे हैं (या यदि आप 3 डी ओपेंगल सामान कर रहे हैं)। एक धागा UI / मुख्य धागा है। यह वह गतिविधि है जो गतिविधि प्रारंभ होती है और आपको Android द्वारा दी जाती है।

यह UI थ्रेड एकमात्र ऐसा है जिसमें आप UI तत्वों (दृश्य, लेआउट आदि) को अपडेट कर सकते हैं। यह वह भी है जहां उपयोगकर्ता इनपुट के लिए कोई भी श्रोता चलेगा। आपको UI थ्रेड के किसी भी यांत्रिकी में नहीं दिखता है, बस यह कहीं पृष्ठभूमि में एक लूप में चलता है।

दूसरा धागा, आप खुद बनाते हैं (मैं इसकी सभी कमियों के बावजूद AsyncTask का उपयोग करने की सलाह दूंगा )। यह उन सभी गैर-यूआई चीजों को करता है जो आप एक सामान्य गेम लूप में करते हैं, जैसे कि आंदोलन को अपडेट करना, टकराव की गणना करना, मुकाबला गणना और इसी तरह।

आप अपनी गतिविधि के आंतरिक वर्ग के रूप में इस AsyncTask थ्रेड / वर्ग को बनाते हैं। इस तरह, आपके पास कुछ गतिविधि-व्यापक-गुंजाइश ऑब्जेक्ट ( Vector<Spaceship>) हो सकते हैं जो UI थ्रेड और गेम लूप थ्रेड दोनों द्वारा एक्सेस किए जा सकते हैं।

चूंकि गेम लॉजिक थ्रेड में गेम लॉजिक चल रहा है, यह एकमात्र ऐसा धागा है जिसे वास्तव में वेरिएबल (अपडेट टैंक स्पीड, प्लेयर एचपी कम करें) के मूल्यों को बदलने की आवश्यकता होगी। UI थ्रेड केवल मान पढ़ता है, इसलिए न्यूनतम समसामयिक मुद्दे होने चाहिए।

ट्रिकी बिट गेम लूप थ्रेड के अनुरोध पर अपडेट करने के लिए UI थ्रेड प्राप्त कर रहा है। ऐसा करने के कुछ तरीके हैं। यदि आप AsyncTask प्रलेखन को पढ़ते हैं, तो उसके पास publishProgress () / onProgressUpdate () विधि है। यह वास्तव में अगले लूप करने के लिए यूआई थ्रेड की कतार में सामान जोड़ रहा है।

हैंडलर ठीक वही काम करता है, जहां आप हैंडलमेसेज () पद्धति को लागू करते हैं और उस विधि को वास्तव में UI लूप नेक्स्ट लूप द्वारा निष्पादित किया जाता है।

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

Android थ्रेडिंग गाइड

-

यूआई

एकल गतिविधि के भीतर वास्तविक यूआई संरचना के लिए, मैं आपके आधार लेआउट के रूप में एक फ्रेम लेआउट होने की सलाह देता हूं। फ़्रेम लेआउट में बाल तत्व एक कतार की तरह काम करते हैं। पहला तत्व पहले खींचा जाता है, दूसरा पहले के ऊपर खींचा जाता है, दूसरा शीर्ष पर तीसरा।

इस तरह, आपके पास कई XML लेआउट फाइलें हो सकती हैं और फ्रेम लेआउट के बच्चों को प्रबंधित करके, आसानी से अंदर और बाहर के दृश्यों की अदला-बदली कर सकते हैं।

यदि आपके पास हमेशा सबसे नीचे सतह दृश्य (फ्रेम लेआउट में पहला बच्चा) है, तो आप सतह दृश्य के शीर्ष पर सभी सामान्य Android दृश्य / विजेट (बटन, पाठ विचार, स्क्रॉल दृश्य) आदि का उपयोग कर सकते हैं, जो बस करता है खेल का ग्राफिक्स हिस्सा।

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

मैं View.setVisibility लॉट का उपयोग करने की भी सिफारिश करूंगा। उदाहरण के लिए, आप अपने बेस फ्रेम लेआउट में एक पूरी 'इन्वेंट्री' लेआउट जोड़ सकते हैं और फिर उपयोगकर्ता द्वारा उनकी इन्वेंट्री देखने के लिए क्लिक करने पर उस पर बस सेट विजिबिलिटी (देखें। अदृश्य), और सेटविज़बिलिटी (View.Gone) जब वे इसे फिर से बंद करते हैं। इस प्रकार, आप फ़्रेम लेआउट के बच्चों को भी प्रबंधित नहीं कर रहे हैं, बस इतना सब कुछ जोड़ने और चीजों को दृश्यमान बनाने और अदृश्य होने के रूप में जब उपयोगकर्ता अलग-अलग चीजें हैं।

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

यहाँ मैं एक गतिविधि / फ्रेम लेआउट विचार के बारे में पहले के प्रश्न के लिए बनाया गया चित्र है:

यहाँ छवि विवरण दर्ज करें


तो आपकी राय में मुझे गेम लूप के सभी घटकों को रखने के लिए एक फ्रेम लेआउट होना चाहिए, है ना? अगर मैंने यह किया कि मुझे सरयू के दृश्य के साथ सहभागिता करने के लिए HUD वर्ग में विचार कैसे मिलेंगे, उदाहरण के लिए एक आभासी d- पैड / वर्चुअल एनालॉग कहते हैं? मैंने पहले जैसी चीजें करने की कोशिश की है और त्रुटियों में भाग गया है।
kdavis8

मैं इसे थोड़ा स्पष्ट करने के लिए अपने उत्तर को फिर से लिखूँगा
स्पून थम्ब

मेरा जवाब फिर से लिखा। आशा है कि यह स्पष्ट कर देता है
चम्मच अंगूठे

ब्रेकडाउन के लिए बहुत बहुत धन्यवाद जो वास्तव में चीजों को बाहर निकालता है, एंड्रॉइड गेम के विकास के लिए वास्तव में अच्छे ट्यूटोरियल के लिए बहुत कुछ नहीं है
kdavis8

11

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

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


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

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