घटक आधारित इकाई प्रणालियों में गेम स्टेट और इनपुट हैंडलिंग


16

मेरा सवाल यह है कि:

मैं अपनी राज्य प्रणाली में गेम स्टेट्स को कैसे संभाल सकता हूं, खेल राज्य की वस्तुओं के ढेर के आसपास का सहारा लिए बिना?

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

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

मेरे पास एक और विचार है क्योंकि एक इकाई होगी जो खेल राज्य का प्रतिनिधित्व करती है, जो कि अक्षम होने के रूप में चिह्नित करती है, फिर जब इनपुट ईवेंट की जांच करते हैं कि इकाई अक्षम खेल राज्य इकाई की वंशज नहीं है। हर कॉलबैक के लिए माता-पिता को काम करना महंगा लगता है।

एक अन्य विचार यह है कि सभी प्रणालियां अपने डेटा को वर्तमान स्थिति के विरुद्ध संग्रहीत करती हैं, इस तरह से इनपुट बनाते समय, लक्ष्य इकाई भी उम्मीदवार नहीं होगी। हालांकि यह वास्तव में विभिन्न राज्यों में संस्थाओं के बीच संचार की अनुमति देने की क्षमता को नुकसान पहुंचाता है (ठहराव स्क्रीन के लिए इतनी समस्या नहीं है, लेकिन Oblivion / Skyrim में लॉक पिकिंग पर विचार करें)।

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

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

किसी और को यह कैसे करना है पर कोई अन्य विचार है?

संपादित करें जबकि मैं इस प्रश्न में विशेष रूप से इनपुट के बारे में बात करता हूं, इसका मतलब किसी भी सिस्टम को संदेश / घटनाओं को संस्थाओं, जैसे कि टकराव, टाइमर घटनाओं, आदि को भेजने में सक्षम हो सकता है ...


6
मैं इसे इस तरह से करता हूं: मेरे पास स्क्रीन, मेनूस्क्रीन पॉज़स्क्रीनस्क्रीनस्क्रीन है, प्रत्येक स्क्रीन अपनी खुद की दुनिया (एंटिटीज के लिए कंटेनर) और सिस्टम (जैसे रेंडरिंगसिस्टम) बना सकती है और फिर गेमस्क्रीन में मैं दुनिया बना सकता हूं, कैमराकंपनी के लिए एंटिटी, और CameraComponent.RenderTarget को सेट कर सकता हूं। स्क्रीन पृष्ठभूमि। इस तरह मैं इन्वेंटरीस्क्रीन जोड़ सकता हूं जिसमें स्वयं की इकाइयां और सिस्टम होंगे (जैसे सरलीकृत रेंडरर)। इनपुट को स्क्रीन से दुनिया में पारित किया जा सकता है, इसलिए आपका उपयोगकर्ता-सूचक यह तय करेगा कि क्या यह स्क्रीन पर इनपुट पास करेगा (यदि इसका ध्यान केंद्रित, दृश्य आदि) और वह दुनिया और संस्थाओं को इनपुट पास कर देगा
किकिमारु


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

1
ठीक है, उनसे संबंधित पर विचार करें। अच्छा प्रश्न।
MichaelHouse

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

जवाबों:


14

अक्सर इस्तेमाल किया जाने वाला एक मध्यवर्ती है Intent Systemजो इनपुट को सार करता है और संदर्भ और प्रासंगिक गेमस्टेट्स का ट्रैक रखता है।

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

इस तरह आपके अन्य विजेता विशिष्ट गेमपैड / इनपुट (BUTTON_A, BUTTON_B बनाम BUTTON_X, BUTTON_O ...) पर निर्भर नहीं हैं, लेकिन वे सभी एक ही इरादे (IntentRun, IntentReload ...) पर प्रतिक्रिया करते हैं।

एक अन्य लाभ यह है कि आशय प्रणाली उपलब्ध नियंत्रकों के बारे में पता किया जा सकता है / जोड़ा जा सकता है, क्योंकि यह किसी भी सब्सक्राइबर को सिमुलेशन के बाहर भी भेज सकता है, जैसे आप इंटेंट को संभाल सकते हैं AddPlayer(controllerID)

खेल राज्य के बारे में आप घटनाओं या संदेश के माध्यम से या तो सीधे सिस्टम को कितनी जानकारी देते हैं या सीधे आप पर निर्भर है। लेकिन आशय प्रणाली में लगाया गया समय आमतौर पर इसके लायक होता है।

आप इंटेंट कॉन्टेक्ट्स को प्रबंधित कर सकते हैं जो सिस्टम से जुड़े होने पर इंटेंट उत्पन्न करेगा।

संदर्भ को प्राथमिकता दी जा सकती है, अर्थात:

  • सिमुलेशनAvailableContext उपलब्ध होने के दौरान सिमुलेशन को इंटेंस भेजता है (उदाहरण के लिए नहीं चल रहा है) कैमरा ले जाने के लिए, ज़ूम आउट में ज़ूम करें, प्लेयर जोड़ें / निकालें ...
  • सिमुलेशनरनिंगकॉन्टेक्ट सिमुलेशन के लिए इंटेंस भेजता है जबकि यह मूव्ड प्लेयर नहीं होता है, यूनिट को पोजीशन पर भेज देता है, शूट करता है ...

इस तरह आप उन संदर्भों को जोड़ और हटा सकते हैं जो वर्तमान में प्रासंगिक हैं।

और पूरे इरादे सिस्टम के बारे में एक बात यह है कि सिमुलेशन चलाने के दौरान इसे चलाना चाहिए।

एक तरीका जो अक्सर गैर सिमुलेशन से संबंधित अपडेट को तोड़ने के बिना गेम सिमुलेशन को खेलने / रोकने के लिए उपयोग किया जाता है वह है समय के विभिन्न सेटों का उपयोग करना। यानी GenericSystem::onTime(Long time, Long deltaTime, Long simTime, Long simDeltaTime)

इस दृष्टिकोण के साथ आपका इंजन बस गेम के सिमटाइम पर वृद्धि को रोक सकता है जो बदले में संबंधित एनीमेशन और भौतिकी इंजन पर अपडेट को अवरुद्ध करेगा जो simTime and simDeltaTimeकि आपके कैमरा स्प्रिंग प्रभाव के निरंतर अपडेट की अनुमति देते समय उपयोग करता है यदि इसे रोकना है, तो एनीमेशन एक वर्चुअल इन-गेम बिलबोर्ड पर लोडिंग प्रभाव, जबकि डेटा डाउनलोड किया जा रहा है ...


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

आपकी संस्थाएं जंप जैसे इरादों को अनदेखा कर सकती हैं, जबकि उनका राज्य उन्हें कूदने की अनुमति नहीं देता है (यानी जमीन को छूना नहीं)। लेकिन उन्हें इस तरह के इरादों को प्राप्त करने के बारे में चिंता करने की ज़रूरत नहीं है जबकि खेल को रोक दिया गया है।
कोयोट

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

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

अरे @Coyote, यह सिस्टम बहुत दिलचस्प लगता है। क्या आप शायद इस प्रश्न का उत्तर देकर कुछ और जानकारी प्रदान कर सकते हैं ? धन्यवाद!
pek

2

वैश्विक ईवेंट सिस्टम बनाने के बारे में और फिर आपकी प्रत्येक इकाई के लिए एक ईवेंट श्रोता घटक क्या है? एक घटना के बाद "गेम स्टेट चेंज" आप प्रत्येक विशेष इकाई के लिए व्यक्तिगत रूप से घटकों के साथ फिडेल कर सकते हैं।

मान लीजिए कि आपके पास एक इनपुट घटक है। ईवेंट श्रोता घटक के बाद गेम स्टेट चेंज ईवेंट प्राप्त होता है, यह उस विशेष इनपुट घटक के लिए बहुत विशिष्ट मानों को बदलता है, इसलिए यह किसी भी इनपुट कॉल को प्राप्त नहीं करेगा या सिस्टम के लिए कोई आंदोलन या प्रतिक्रिया कॉल नहीं करेगा या यह मालिक है।

यह मेरे लिए काम करता है क्योंकि मेरे अधिकांश घटक स्क्रिप्टेड हैं (लुआ के माध्यम से)। यानी मेरे पास एक इनपुट घटक है, जो एक बार दबाया जाता है जब एक कुंजी दबाया जाता है और यह एक आंदोलन + दिशा की आग लगाता है और फिर कुंजी जारी होने पर इसे ट्रिगर किया जाता है और यह एक स्टॉप + दिशा की आग लग जाती है। एक ईवेंट श्रोता घटक भी है जो इनपुट फंक्शन (यदि खेल को रोक दिया जाता है) से संपर्क करता है, तो किसी भी फ़ंक्शन फायरिंग को रोकने के लिए और यदि आवश्यक हो तो रोकें। मैं तब आसानी से एक ही घटना के लिए एक अलग प्रतिक्रिया और एक स्क्रिप्ट का उपयोग कर keypresses के साथ एक और इकाई जोड़ सकते हैं। इस तरह आप विभिन्न राज्यों में विभिन्न संस्थाओं के बीच की बातचीत को बचाएंगे और यहां तक ​​कि इसे और अधिक अनुकूलन योग्य बना सकते हैं। क्या अधिक है, हो सकता है कि कुछ संस्थाओं में इवेंट श्रोता घटक भी न हों।

जो मैंने अभी समझाया वह मूल रूप से आपके चौथे समाधान का एक व्यावहारिक उदाहरण है।

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