Passei as últimas 48 horas lendo sistemas de componentes de objetos e sinto que estou pronto o suficiente para começar a implementá-lo. Criei as classes Object e Component de base, mas agora que preciso começar a criar os componentes reais, estou um pouco confuso. Quando penso neles em termos de HealthComponent ou algo que basicamente seria apenas uma propriedade, faz todo o sentido. Quando é algo mais geral como componente de Física / Gráficos, fico um pouco confuso.
Minha classe Object se parece com isso até agora (se você perceber alguma alteração que eu deva fazer, por favor me avise, ainda é novo nisso) ...
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;
};
Agora, o problema que estou enfrentando é o que a população em geral colocaria em componentes como Física / Gráficos? Para o Ogre (meu mecanismo de renderização), os Objetos visíveis consistirão em vários Ogre :: SceneNode (possivelmente múltiplos) para anexá-lo à cena, Ogre :: Entity (possivelmente múltiplos) para mostrar as malhas visíveis, e assim por diante. Seria melhor adicionar vários GraphicComponent ao objeto e permitir que cada GraphicComponent lidasse com um SceneNode / Entity ou é a idéia de ter um de cada componente necessário?
Para a física, estou ainda mais confuso. Suponho que talvez esteja criando um RigidBody e mantendo o controle de massa / interia / etc. faria sentido. Mas estou tendo problemas para pensar em como realmente colocar detalhes em um componente.
Depois de concluir alguns desses componentes "Necessários", acho que fará muito mais sentido. A partir de agora, ainda estou um pouco perplexo.