J'ai passé les 48 dernières heures à lire sur les systèmes de composants d'objet et je sens que je suis assez prêt pour commencer à l'implémenter. J'ai créé les classes d'objet et de composant de base, mais maintenant que je dois commencer à créer les composants réels, je suis un peu confus. Quand je pense à eux en termes de HealthComponent ou quelque chose qui ne serait fondamentalement qu'une propriété, c'est parfaitement logique. Quand c'est quelque chose de plus général en tant que composant physique / graphique, je suis un peu confus.
Ma classe d'objet ressemble à ceci jusqu'à présent (si vous remarquez des changements que je devrais faire s'il vous plaît faites le moi savoir, encore nouveau à cela) ...
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;
};
Maintenant, le problème que je rencontre est ce que la population générale mettrait dans des composants tels que la physique / graphique? Pour Ogre (mon moteur de rendu), les objets visibles seront constitués de plusieurs Ogre :: SceneNode (éventuellement plusieurs) pour le joindre à la scène, Ogre :: Entity (éventuellement plusieurs) pour afficher les maillages visibles, etc. Serait-il préférable d'ajouter simplement plusieurs GraphicComponent à l'objet et de laisser chaque GraphicComponent gérer un SceneNode / Entity ou l'idée d'avoir un de chaque composant est-elle nécessaire?
Pour la physique, je suis encore plus confus. Je suppose que peut-être créer un RigidBody et garder une trace de la masse / interia / etc. serait logique. Mais j'ai du mal à penser à comment réellement mettre des détails dans un composant.
Une fois que j'aurai fait quelques-uns de ces composants "requis", je pense que cela aura beaucoup plus de sens. En ce moment même si je suis encore un peu perplexe.