我正在制作一个使用基于组件的游戏对象的游戏,但是我很难为每个组件实现一种与其游戏对象进行通信的方式。我将不解释所有内容,而是解释相关示例代码的每个部分:
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
。
但是,我不希望组件能够调用管理器的更新功能。我是从事此项目的唯一人员,但我不想养成编写潜在危险代码的习惯。
如何在保持代码安全和缓存友好的同时解决此问题?