मेरे पास गेम आर्किटेक्चर के बारे में एक सवाल था: विभिन्न घटकों के एक दूसरे के साथ संवाद करने का सबसे अच्छा तरीका क्या है?
अगर यह सवाल पहले ही एक लाख बार पूछा जा चुका है, तो मैं वास्तव में माफी मांगता हूं, लेकिन मैं उस तरह की जानकारी के साथ कुछ भी नहीं पा सकता हूं जिसकी मुझे तलाश है।
मैं स्क्रैच से एक गेम बनाने की कोशिश कर रहा हूं (C ++ अगर यह मायने रखता है) और प्रेरणा के लिए कुछ ओपन सोर्स गेम सॉफ्टवेयर का अवलोकन किया है (सुपर मैरीओ इतिहास, ओपनटीडीटी और अन्य)। मुझे लगता है कि इनमें से बहुत सारे गेम डिज़ाइन वैश्विक उदाहरणों और / या सिंगलटन का उपयोग पूरे स्थान पर करते हैं (रेंडर कतार, इकाई प्रबंधक, वीडियो प्रबंधक और इसके आगे की चीज़ों के लिए)। मैं वैश्विक उदाहरणों और एकलताओं से बचने की कोशिश कर रहा हूं और एक इंजन का निर्माण कर रहा हूं, जो संभवत: शिथिल रूप से युग्मित है, लेकिन मैं कुछ बाधाओं को मार रहा हूं जो प्रभावी डिजाइन में मेरी अनुभवहीनता के कारण हैं। (इस परियोजना के लिए प्रेरणा का एक हिस्सा यह पता करने के लिए है :))
मैंने एक डिज़ाइन बनाया है जहाँ मेरे पास एक मुख्य GameCore
वस्तु है जिसमें सदस्य हैं जो वैश्विक उदाहरणों के अनुरूप हैं जिन्हें मैं अन्य परियोजनाओं में देखता हूं (यानी, इसमें एक इनपुट प्रबंधक, एक वीडियो प्रबंधक, एक GameStage
ऑब्जेक्ट है जो सभी संस्थाओं और गेम प्ले को नियंत्रित करता है। वर्तमान में जो भी चरण लोड किया गया है, उसके लिए)। समस्या यह है कि चूंकि सब कुछ GameCore
ऑब्जेक्ट में केंद्रीकृत है , इसलिए मेरे पास विभिन्न घटकों के लिए एक दूसरे के साथ संवाद करने का आसान तरीका नहीं है।
उदाहरण के लिए, सुपर मैरीओ इतिहास को देखते हुए, जब भी खेल के एक घटक को दूसरे घटक के साथ संवाद करने की आवश्यकता होती है (यानी, एक दुश्मन वस्तु रेंडर चरण में खींची जाने वाली कतार में खुद को जोड़ना चाहती है), यह सिर्फ बातचीत करता है वैश्विक उदाहरण।
मेरे लिए, मुझे अपने खेल ऑब्जेक्ट्स को संबंधित जानकारी वापस GameCore
ऑब्जेक्ट पर भेजनी होगी, ताकि GameCore
ऑब्जेक्ट उस जानकारी को सिस्टम के अन्य घटक (ओं) तक पहुंचा सके, जिन्हें इसकी आवश्यकता है (यानी: ऊपर की स्थिति के लिए, प्रत्येक दुश्मन ऑब्जेक्ट अपनी रेंडर जानकारी को GameStage
ऑब्जेक्ट पर वापस भेज देंगे, जो इसे इकट्ठा करेगा और इसे वापस पास GameCore
करेगा, जो इसे रेंडर करने के लिए वीडियो मैनेजर को पास करेगा)। यह वास्तव में एक भयानक डिजाइन की तरह लगता है, और मैं इस के लिए एक संकल्प के बारे में सोचने की कोशिश कर रहा था। संभव डिजाइनों पर मेरे विचार:
- वैश्विक उदाहरण (सुपर मेरीयो क्रॉनिकल्स, ओपनटीडी आदि का डिजाइन)
- बीत रहा है
GameCore
एक बिचौलिया जिसके माध्यम से सभी वस्तुओं संवाद के रूप में वस्तु अधिनियम (वर्तमान डिजाइन ऊपर वर्णित है) - अन्य सभी घटकों को कंपोनेंट पॉइंटर्स दें, जिनसे उन्हें बात करने की आवश्यकता होगी (यानी, ऊपर मेरीरो उदाहरण में, दुश्मन वर्ग के पास उस वीडियो ऑब्जेक्ट के लिए एक पॉइंटर होगा जिसमें उसे बात करने की आवश्यकता है)
- गेम को सबसिस्टम में तोड़ें - उदाहरण के लिए, ऑब्जेक्ट में मैनेजर ऑब्जेक्ट्स हैं
GameCore
जो अपने सबसिस्टम में ऑब्जेक्ट्स के बीच संचार को संभालते हैं - (अन्य विकल्प? ....)
मैं सबसे अच्छा समाधान होने के लिए विकल्प 4 से ऊपर की कल्पना करता हूं, लेकिन मुझे इसे डिजाइन करने में थोड़ी परेशानी हो रही है ... शायद इसलिए कि मैं उन डिजाइनों के बारे में सोच रहा हूं जिन्हें मैंने देखा है कि ग्लोबल्स का उपयोग करें। ऐसा लगता है कि मैं उसी समस्या को ले रहा हूं जो मेरे वर्तमान डिजाइन में मौजूद है और प्रत्येक उपतंत्र में इसे छोटे स्तर पर दोहरा रहा है। उदाहरण के लिए, GameStage
ऊपर वर्णित वस्तु कुछ हद तक इस पर एक प्रयास है, लेकिन GameCore
वस्तु अभी भी प्रक्रिया में शामिल है।
किसी को भी किसी भी डिजाइन सलाह यहाँ की पेशकश कर सकते हैं?
धन्यवाद!