Al fine di ottenere componenti in grado di aggiornare ogni frame (e lasciare questa funzionalità fuori dai componenti che non ne hanno bisogno), ho avuto l'idea di creare un componente UpdateComponent. Altri componenti come MovableComponent
(che detiene la velocità) erediterebbero dalla IUpdatable
classe astratta. Questo costringe MovableComponent
a implementare un Update(gametime dt)
metodo e un altro RegisterWithUpdater()
che fornisce UpdateComponent
un puntatore al MovableComponent
. Molti componenti potrebbero farlo e quindi UpdateComponent
chiamare tutti i loro Update(gametime dt)
metodi senza preoccuparsi di chi o cosa siano.
Le mie domande sono:
- Sembra qualcosa di normale o utilizzato da qualcuno? Non riesco a trovare nulla sull'argomento.
- Come posso mantenere un ordine per i componenti come la fisica e quindi il cambio di posizione? È anche necessario?
- Quali sono altri modi per assicurare che i componenti che dovrebbero essere processati in ogni frame vengano effettivamente elaborati?
EDIT
Penso che mi occuperò di come fornire al gestore entità un elenco di tipi che sono aggiornabili. Quindi TUTTI i componenti di quel tipo possono aggiornarsi piuttosto che gestirli per entità (che comunque sono solo indici nel mio sistema).
Ancora. Le mie domande rimangono valide per me. Non so se questo sia ragionevole / normale o cosa gli altri tendano a fare.
Inoltre, le persone di Insomniac sono fantastiche! /MODIFICARE
Codice ridotto per l'esempio precedente:
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_;
};