मैं एक गेम बना रहा हूं जो घटक-आधारित गेम ऑब्जेक्ट का उपयोग करता है, और मुझे प्रत्येक घटक के लिए अपने गेम ऑब्जेक्ट के साथ संवाद करने के लिए एक कठिन तरीका लागू करना है। एक बार में सब कुछ समझाने के बजाय, मैं प्रासंगिक नमूना कोड के प्रत्येक भाग को समझाऊंगा:
class GameObjectManager {
public:
//Updates all the game objects
void update(Time dt);
//Sends a message to all game objects
void sendMessage(Message m);
private:
//Vector of all the game objects
std::vector<GameObject> gameObjects;
//vectors of the different types of components
std::vector<InputComponent> input;
std::vector<PhysicsComponent> ai;
...
std::vector<RenderComponent> render;
}
GameObjectManagerसभी खेल वस्तुओं और उनके घटक रखती है। यह गेम ऑब्जेक्ट्स को अपडेट करने के लिए भी जिम्मेदार है। यह एक विशिष्ट क्रम में घटक वैक्टर को अपडेट करके करता है। मैं सरणियों के बजाय वैक्टर का उपयोग करता हूं ताकि गेम ऑब्जेक्ट्स की संख्या की लगभग कोई सीमा न हो जो एक बार में मौजूद हो सकते हैं।
class GameObject {
public:
//Sends a message to the components in this game object
void sendMessage(Message m);
private:
//id to keep track of components in the manager
const int id;
//Pointers to components in the game object manager
std::vector<Component*> components;
}
GameObjectवर्ग जानता है कि क्या उसके घटकों कर रहे हैं और उन्हें संदेश भेज सकते हैं।
class Component {
public:
//Receives messages and acts accordingly
virtual void handleMessage(Message m) = 0;
virtual void update(Time dt) = 0;
protected:
//Calls GameObject's sendMessage
void sendMessageToObject(Message m);
//Calls GameObjectManager's sendMessage
void sendMessageToWorld(Message m);
}
Componentवर्ग शुद्ध आभासी इसलिए घटकों के विभिन्न प्रकार के लिए कक्षाएं कैसे संदेश और अद्यतन को संभालने के लिए लागू कर सकते हैं। यह संदेश भेजने में भी सक्षम है।
अब समस्या पर उठता है कैसे घटकों कॉल कर सकते हैं sendMessageमें काम करता है GameObjectऔर GameObjectManager। मैं दो संभावित समाधानों के साथ आया:
- इसके लिए
Componentएक सूचक देंGameObject।
हालाँकि, चूंकि गेम ऑब्जेक्ट एक वेक्टर में हैं, पॉइंटर्स जल्दी से अमान्य हो सकते हैं (वही वेक्टर में कहा जा सकता है GameObject, लेकिन उम्मीद है कि इस समस्या का समाधान भी उस एक को हल कर सकता है)। मैं खेल वस्तुओं को एक सरणी में रख सकता था, लेकिन फिर मुझे आकार के लिए एक मनमाना संख्या में पास करना होगा, जो आसानी से अनावश्यक रूप से उच्च और बेकार स्मृति हो सकती है।
- के लिए
Componentएक सूचक देंGameObjectManager।
हालाँकि, मैं नहीं चाहता कि घटक प्रबंधक के अपडेट फ़ंक्शन को कॉल करने में सक्षम हों। मैं इस परियोजना पर काम करने वाला एकमात्र व्यक्ति हूं, लेकिन मैं संभावित खतरनाक कोड लिखने की आदत में नहीं आना चाहता।
अपने कोड को सुरक्षित और कैश के अनुकूल रखते हुए मैं इस समस्या को कैसे हल कर सकता हूं?