私は最後の48時間をオブジェクトコンポーネントシステムに目を通し、それを実装する準備が十分に整ったと感じています。基本のObjectクラスとComponentクラスを作成しましたが、実際のコンポーネントの作成を開始する必要があるため、少し混乱しています。HealthComponentまたは基本的に単なるプロパティのようなものでそれらを考えるとき、それは完全に理にかなっています。物理/グラフィックコンポーネントとしてより一般的なものである場合、少し混乱します。
これまでのところ、私のオブジェクトクラスは次のようになっています(変更が必要な場合は、まだ新しいことをお知らせください)。
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をオブジェクトに追加し、各GraphicComponentで1つのSceneNode / Entityを処理するのが最善でしょうか、それとも各コンポーネントの1つが必要なのでしょうか?
物理学では、私はさらに混乱しています。おそらくRigidBodyを作成し、質量/インテリア/などを追跡していると思います。理にかなっています。しかし、実際にコンポーネントに詳細を入れる方法を考えるのに苦労しています。
これらの「必須」コンポーネントをいくつか完了したら、もっと意味があると思います。今のところ、私はまだ少し困惑しています。