मैंने कोडरंगर के समान इंजन पर काम किया। मेरा एक अलग दृष्टिकोण है। :)
पहले, हमारे पास FSM का ढेर नहीं था - हमारे पास राज्यों का ढेर था। राज्यों का एक स्टैक एकल FSM बनाता है। मुझे नहीं पता कि FSM का स्टैक कैसा दिखेगा। शायद बहुत जटिल के साथ कुछ भी करने के लिए व्यावहारिक।
हमारे ग्लोबल स्टेट मशीन के साथ मेरी सबसे बड़ी समस्या यह थी कि यह राज्यों का एक समूह था, न कि राज्यों का एक समूह। इसका मतलब है, उदाहरण के लिए, ... / MainMenu / Loading अलग था ... / Loading / MainMenu, इस पर निर्भर करता है कि आपको लोडिंग स्क्रीन से पहले या बाद में मुख्य मेनू मिला है (खेल अतुल्यकालिक है और लोडिंग ज्यादातर सर्वर-चालित है )।
चीजों के दो उदाहरण के रूप में यह बदसूरत बना:
- इसके कारण LoadingGameplay स्थिति उदा।, इसलिए आपके पास आधार / लोड हो रहा था, और Gameplay राज्य के भीतर लोड करने के लिए आधार / गेमप्ले / LoadingGameplay, जिसे सामान्य लोडिंग स्थिति में बहुत कोड को दोहराना था (लेकिन सभी नहीं, और अधिक जोड़ें )।
- हमारे पास कई कार्य थे जैसे "यदि चरित्र निर्माता गेमप्ले में जाते हैं, यदि गेमप्ले में चरित्र का चयन करते हैं, यदि चरित्र का चयन करें तो लॉगिन पर वापस जाएं", क्योंकि हम अलग-अलग राज्यों में एक ही इंटरफ़ेस विंडो दिखाना चाहते थे, लेकिन बैक / फॉरवर्ड बटन अभी भी काम करते हैं।
नाम के बावजूद, यह बहुत "वैश्विक" नहीं था। अधिकांश आंतरिक गेम सिस्टम ने अपने आंतरिक राज्यों को ट्रैक करने के लिए इसका उपयोग नहीं किया, क्योंकि वे नहीं चाहते थे कि उनके राज्य अन्य प्रणालियों के साथ मिल कर काम करें। अन्य, जैसे यूआई प्रणाली, इसका उपयोग केवल राज्य को अपने स्थानीय राज्य प्रणालियों में कॉपी करने के लिए कर सकते हैं। (मैं विशेष रूप से यूआई राज्यों के लिए सिस्टम के खिलाफ चेतावनी दूंगा। यूआई राज्य एक स्टैक नहीं है, यह वास्तव में एक डीएजी है, और इस पर किसी अन्य संरचना को बाध्य करने की कोशिश केवल यूआई बनाने के लिए जा रही है जो उपयोग करने के लिए निराश हैं।)
यह अच्छा था कि इन्फ्रास्ट्रक्चर प्रोग्रामर से कोड को एकीकृत करने के लिए कार्यों को अलग-अलग किया गया था, जो नहीं जानते थे कि खेल का प्रवाह वास्तव में कैसे संरचित है, इसलिए आप पैच लिखने वाले व्यक्ति को "क्लाइंट_पॉट_अपडेट में अपना कोड डालें" और ग्राफिक्स लिखने वाले व्यक्ति को बता सकते हैं। लोड करने में "अपना कोड Client_MapTransfer_OnEnter में डालें", और हम बिना किसी परेशानी के कुछ निश्चित तर्क प्रवाह को स्वैप कर सकते थे।
एक साइड प्रोजेक्ट पर, मुझे एक स्टैक के बजाय एक राज्य सेट के साथ बेहतर भाग्य मिला है , असंबंधित प्रणालियों के लिए कई मशीनें बनाने से डर नहीं रहा है, और खुद को "वैश्विक राज्य" होने के जाल में गिरने से इनकार कर रहा है, जो वास्तव में है वैश्विक चर के माध्यम से चीजों को सिंक्रनाइज़ करने का सिर्फ एक जटिल तरीका - ज़रूर, आप इसे कुछ समय सीमा के पास समाप्त करने जा रहे हैं, लेकिन इसे अपने लक्ष्य के रूप में डिजाइन न करें । मूल रूप से, एक खेल में राज्य एक स्टैक नहीं है, और एक गेम में राज्य सभी संबंधित नहीं हैं।
समारोह बिंदु और गैर-स्थानीय व्यवहार के रूप में जीएसएम भी करते हैं, डीबगिंग चीजों को और अधिक कठिन बना देता है, हालांकि इस तरह के बड़े राज्य संक्रमणों को डीबग करना बहुत मजेदार नहीं था, इससे पहले कि हम या तो थे। राज्य-ढेर के बजाय राज्य-सेट वास्तव में इसकी मदद नहीं करते हैं, लेकिन आपको इसके बारे में पता होना चाहिए। फ़ंक्शन पॉइंटर्स के बजाय वर्चुअल फ़ंक्शन कुछ हद तक कम हो सकते हैं।