(मैं जो वर्णन कर रहा हूं वह इस डिजाइन पर आधारित है: इकाई प्रणाली ढांचा क्या है?, नीचे स्क्रॉल करें और आप इसे पा लेंगे)
मुझे C ++ में एक इकाई-घटक प्रणाली बनाने में कुछ समस्याएं आ रही हैं। मेरे पास मेरा घटक वर्ग है:
class Component { /* ... */ };
जो वास्तव में एक इंटरफ़ेस है, जिसे अन्य घटकों के लिए बनाया जाना है। इसलिए, एक कस्टम घटक बनाने के लिए, मैं सिर्फ इंटरफ़ेस लागू करता हूं और उस डेटा को जोड़ता हूं जिसका उपयोग इन-गेम में किया जाएगा:
class SampleComponent : public Component { int foo, float bar ... };
इन घटकों को एक इकाई वर्ग के अंदर संग्रहीत किया जाता है, जो इकाई के प्रत्येक उदाहरण को एक अद्वितीय आईडी देता है:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
घटक के नाम को हैशिंग द्वारा इकाई में जोड़ा जाता है (यह शायद इतना बड़ा विचार नहीं है)। जब मैं एक कस्टम घटक जोड़ता हूं, तो यह एक घटक प्रकार (बेस क्लास) के रूप में संग्रहीत होता है।
अब, दूसरी ओर, मेरे पास एक सिस्टम इंटरफ़ेस है, जो अंदर एक नोड इंटरफेस का उपयोग करता है। नोड क्लास का उपयोग किसी एकल इकाई के कुछ घटकों को संग्रहीत करने के लिए किया जाता है (क्योंकि सिस्टम इकाई के सभी घटकों का उपयोग करने में दिलचस्पी नहीं रखता है)। जब सिस्टम के पास है update()
, तो उसे केवल विभिन्न संस्थाओं से निर्मित नोड्स के माध्यम से पुनरावृति करना होगा। इसलिए:
/* System and Node implementations: (not the interfaces!) */
class SampleSystem : public System {
std::list<SampleNode> nodes; //uses SampleNode, not Node
void update();
/* ... */
};
class SampleNode : public Node {
/* Here I define which components SampleNode (and SampleSystem) "needs" */
SampleComponent* sc;
PhysicsComponent* pc;
/* ... more components could go here */
};
अब समस्या: मान लीजिए कि मैं एक इकाई को नमूना सिस्टम में पारित करके नमूना नोड्स का निर्माण करता हूं। यदि नमूना में सैंपलसिस्टम द्वारा उपयोग किए जाने वाले आवश्यक घटक हैं, तो नमूना नोड "चेक" करता है। समस्या तब प्रकट होती है जब मुझे इकाई के अंदर वांछित घटक तक पहुंचने की आवश्यकता होती है: घटक को Component
(बेस क्लास) संग्रह में संग्रहीत किया जाता है , इसलिए मैं घटक तक नहीं पहुंच सकता और इसे नए नोड पर कॉपी कर सकता हूं। मैंने अस्थायी रूप Component
से एक व्युत्पन्न प्रकार के लिए कास्टिंग करके समस्या को हल किया है , लेकिन मैं जानना चाहता था कि क्या ऐसा करने का एक बेहतर तरीका है। मैं समझता हूं कि इसका मतलब होगा कि मेरे पास पहले से जो है उसे फिर से डिजाइन करना। धन्यवाद।