एंड्रॉइड गेम्स के बहुत सारे स्कोप / लोड या विकल्प / वरीयताओं को सही ठहराने के लिए बहुत बड़े दायरे में नहीं हैं, कभी भी कस्टम वर्णों और जैसे कि बस ट्रेन के घर पर 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 को यूआई थ्रेड में संभाला जाता है, इन्वेंट्री को उसमें दिखाई देता है, और अपडेट इंवेंट्री पद्धति को फिर से यूआई थ्रेड से बुलाया जाता है, जिसमें सभी गेमों पर केवल गेटर्स मिलते हैं।
यहाँ मैं एक गतिविधि / फ्रेम लेआउट विचार के बारे में पहले के प्रश्न के लिए बनाया गया चित्र है: