Ostatnie 48 godzin spędziłem na czytaniu na temat systemów typu Object Component i czuję, że jestem wystarczająco gotowy, aby rozpocząć wdrażanie. Utworzyłem podstawowe klasy Object i Component, ale teraz, gdy muszę zacząć tworzyć rzeczywiste komponenty, jestem trochę zdezorientowany. Kiedy myślę o nich w kategoriach HealthComponent lub czegoś, co w zasadzie byłoby po prostu właściwością, ma to sens. Kiedy jest to coś bardziej ogólnego jako komponent fizyki / grafiki, jestem trochę zdezorientowany.
Moja klasa Object wygląda tak do tej pory (jeśli zauważysz jakieś zmiany, które powinienem wprowadzić, daj mi znać, nadal jestem w tym nowy) ...
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;
};
Problem, na który napotykam, polega na tym, co ogólna populacja zastosowałaby w komponentach takich jak fizyka / grafika? W przypadku Ogre (mój silnik renderowania) widoczne Obiekty będą składały się z wielu Ogre :: SceneNode (ewentualnie wielu), aby dołączyć go do sceny, Ogre :: Entity (ewentualnie wielu), aby pokazać widoczne siatki i tak dalej. Czy najlepiej byłoby po prostu dodać do obiektu wiele elementów graficznych i pozwolić każdemu elementowi graficznemu obsługiwać jeden element SceneNode / jednostkę, czy też pomysł posiadania jednego z nich jest potrzebny?
W przypadku fizyki jestem jeszcze bardziej zdezorientowany. Podejrzewam, że może stworzenie RigidBody i śledzenie masy / interia / etc. miałoby sens. Ale mam problem z myśleniem o tym, jak w rzeczywistości umieścić specyfikę w komponencie.
Kiedy skończę kilka z tych „wymaganych” komponentów, myślę, że będzie to o wiele bardziej sensowne. W tej chwili jestem trochę zakłopotany.