我花了最后48个小时来阅读对象组件系统,并觉得我已经准备好开始实施它。我已经创建了基本的Object和Component类,但是现在我需要开始创建实际的组件,我有点困惑。当我用HealthComponent或基本上只是属性的东西来考虑它们时,这是很有意义的。当它作为物理/图形学组件更为通用时,我会有些困惑。
到目前为止,我的Object类是这样的(如果您注意到我应该进行的任何更改,请告诉我,这仍然是新的)...
typedef unsigned int ID;
class GameObject
{
public:
GameObject(ID id, Ogre::String name = "");
~GameObject();
ID &getID();
Ogre::String &getName();
virtual void update() = 0;
// Component Functions
void addComponent(Component *component);
void removeComponent(Ogre::String familyName);
template<typename T>
T* getComponent(Ogre::String familyName)
{
return dynamic_cast<T*>(m_components[familyName]);
}
protected:
// Properties
ID m_ID;
Ogre::String m_Name;
float m_flVelocity;
Ogre::Vector3 m_vecPosition;
// Components
std::map<std::string,Component*> m_components;
std::map<std::string,Component*>::iterator m_componentItr;
};
现在,我遇到的问题是,普通人群将对诸如物理/图形学之类的组件投入什么?对于Ogre(我的渲染引擎),可见对象将包含多个Ogre :: SceneNode(可能多个)以将其附加到场景; Ogre :: Entity(可能多个)以显示可见的网格,依此类推。最好只是将多个GraphicComponent添加到Object中,然后让每个GraphicComponent处理一个SceneNode / Entity,还是有需要每个组件之一的想法?
对于物理学,我感到更加困惑。我想也许是创建一个RigidBody并跟踪质量/ interia /等。会很有意义。但是我在思考如何将细节实际放入组件时遇到了麻烦。
一旦我完成了这些“必需”组件中的几个,我认为它将变得更加有意义。截至目前,尽管我仍然有些困惑。