Ich habe die letzten 48 Stunden mit dem Lesen von Object Component-Systemen verbracht und bin jetzt bereit, mit der Implementierung zu beginnen. Ich habe die Basisklassen Object und Component erstellt, aber jetzt, da ich mit dem Erstellen der eigentlichen Komponenten beginnen muss, bin ich ein bisschen verwirrt. Wenn ich sie in Bezug auf HealthComponent oder etwas, das im Grunde genommen nur eine Eigenschaft wäre, betrachte, ist dies absolut sinnvoll. Wenn es sich um eine allgemeinere Physik- / Grafikkomponente handelt, bin ich etwas verwirrt.
So sieht meine Object-Klasse bisher aus (Wenn Sie Änderungen bemerken, die ich vornehmen sollte, lassen Sie es mich bitte wissen, noch neu in dieser Klasse) ...
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;
};
Das Problem, auf das ich stoße, ist, was die allgemeine Bevölkerung in Komponenten wie Physik / Grafik stecken würde. Für Ogre (meine Rendering-Engine) bestehen die sichtbaren Objekte aus mehreren Ogre :: SceneNode (möglicherweise mehreren), um sie an die Szene anzuhängen, Ogre :: Entity (möglicherweise mehreren), um die sichtbaren Netze anzuzeigen, und so weiter. Wäre es am besten, einfach mehrere GraphicComponent's zum Objekt hinzuzufügen und jede GraphicComponent mit einem SceneNode / Entity umgehen zu lassen, oder ist die Idee, eine von jeder Component zu haben, die benötigt wird?
Für die Physik bin ich noch verwirrter. Ich nehme an, dass Sie vielleicht einen RigidBody erstellen und die Masse / interia / etc. Verfolgen. würde Sinn machen. Es fällt mir jedoch schwer zu überlegen, wie ich bestimmte Elemente in eine Komponente einbauen kann.
Sobald ich ein paar dieser "erforderlichen" Komponenten fertiggestellt habe, wird es meiner Meinung nach viel sinnvoller sein. Ab sofort bin ich allerdings noch ein bisschen ratlos.