मैं एक गेम बना रहा हूं जो घटक-आधारित गेम ऑब्जेक्ट का उपयोग करता है, और मुझे प्रत्येक घटक के लिए अपने गेम ऑब्जेक्ट के साथ संवाद करने के लिए एक कठिन तरीका लागू करना है। एक बार में सब कुछ समझाने के बजाय, मैं प्रासंगिक नमूना कोड के प्रत्येक भाग को समझाऊंगा:
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
।
हालाँकि, मैं नहीं चाहता कि घटक प्रबंधक के अपडेट फ़ंक्शन को कॉल करने में सक्षम हों। मैं इस परियोजना पर काम करने वाला एकमात्र व्यक्ति हूं, लेकिन मैं संभावित खतरनाक कोड लिखने की आदत में नहीं आना चाहता।
अपने कोड को सुरक्षित और कैश के अनुकूल रखते हुए मैं इस समस्या को कैसे हल कर सकता हूं?