Ho trascorso le ultime 48 ore a leggere sui sistemi Object Component e mi sento abbastanza pronto per iniziare a implementarlo. Ho creato le classi di oggetti e componenti di base, ma ora che ho bisogno di iniziare a creare i componenti effettivi sono un po 'confuso. Quando penso a loro in termini di HealthComponent o qualcosa che sarebbe sostanzialmente una proprietà, ha perfettamente senso. Quando è qualcosa di più generale come componente di Fisica / Grafica, mi confondo un po '.
La mia classe di oggetti è così simile (se noti cambiamenti che dovrei fare per favore fammi sapere, ancora nuovo a questo) ...
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;
};
Ora il problema che sto incontrando è che cosa metterebbe la popolazione in componenti come Fisica / Grafica? Per Ogre (il mio motore di rendering) gli oggetti visibili saranno costituiti da più Ogre :: SceneNode (possibilmente multipli) per collegarlo alla scena, Ogre :: Entity (possibilmente multipli) per mostrare le mesh visibili, e così via. Sarebbe meglio aggiungere più GraphicComponent all'Oggetto e lasciare che ogni GraphicComponent gestisca un SceneNode / Entity o è necessaria l'idea di avere uno di ciascun Component?
Per la fisica sono ancora più confuso. Suppongo che forse crei un RigidBody e tenga traccia di massa / interia / ecc. avrebbe senso. Ma ho problemi a pensare a come inserire effettivamente i dettagli in un componente.
Una volta che avrò fatto un paio di questi componenti "richiesti", penso che avrà molto più senso. A partire da ora, anche se sono ancora un po 'perplesso.