Aby komponenty mogły aktualizować każdą ramkę (i pozostawić tę funkcjonalność poza komponentami, które nie muszą), wpadłem na pomysł, aby utworzyć komponent UpdateComponent. Inne elementy, takie jak MovableComponent
(które utrzymują prędkość), dziedziczyłyby po IUpdatable
klasie abstrakcyjnej. Wymusza MovableComponent
to implementację Update(gametime dt)
metody i innej, RegisterWithUpdater()
która daje UpdateComponent
wskaźnik do MovableComponent
. Wiele komponentów może to zrobić, a następnie UpdateComponent
może wywołać wszystkie swoje Update(gametime dt)
metody bez konieczności dbania o to, kim lub czym są.
Moje pytania to:
- Czy to wydaje się być czymś normalnym lub używanym przez kogokolwiek? Nie mogę nic znaleźć na ten temat.
- Jak mogę utrzymać porządek w elementach takich jak fizyka, a następnie zmienić pozycję? Czy to w ogóle konieczne?
- Jakie są inne sposoby zapewnienia, że komponenty, które powinny być przetwarzane w każdej ramce, są w rzeczywistości przetwarzane?
EDYCJA
Myślę, że będę zastanawiał się, jak dać menadżerowi encji listę typów, które można aktualizować. Wtedy WSZYSTKIE komponenty tego typu mogą się aktualizować zamiast zarządzać nimi dla poszczególnych jednostek (które i tak są tylko indeksami w moim systemie).
Nadal. Moje pytania pozostają dla mnie ważne. Nie wiem, czy jest to uzasadnione / normalne, lub co robią inni.
Również ludzie w Insomniac są niesamowici! /EDYTOWAĆ
Gotowany kod dla poprzedniego przykładu:
class IUpdatable
{
public:
virtual void Update(float dt) = 0;
protected:
virtual void RegisterAsUpdatable() = 0;
};
class Component
{
...
};
class MovableComponent: public Component, public IUpdatable
{
public:
...
virtual void Update(float dt);
private:
...
virtual void RegisterWithUpdater();
};
class UpdateComponent: public Component
{
public:
...
void UpdateAll();
void RegisterUpdatable(Component* component);
void RemoveUpdatable(Component* component);
private:
...
std::set<Component*> updatables_;
};