Afin d'obtenir des composants pour pouvoir mettre à jour chaque trame (et laisser cette fonctionnalité hors des composants qui n'en ont pas besoin), j'ai eu l'idée de créer un composant UpdateComponent. D'autres composants comme MovableComponent
(qui détient la vitesse) hériteraient de la IUpdatable
classe abstraite. Cela oblige MovableComponent
à implémenter une Update(gametime dt)
méthode et une autre RegisterWithUpdater()
qui donne UpdateComponent
un pointeur vers le MovableComponent
. De nombreux composants pourraient le faire et UpdateComponent
pourraient ensuite appeler toutes leurs Update(gametime dt)
méthodes sans avoir à se soucier de qui ou de ce qu'ils sont.
Mes questions sont:
- Cela semble-t-il quelque chose de normal ou utilisé par quelqu'un? Je ne trouve rien sur le sujet.
- Comment pourrais-je maintenir l'ordre des composants comme la physique puis changer de position? Est-ce même nécessaire?
- Quels sont les autres moyens de garantir que les composants qui doivent être traités à chaque image sont effectivement traités?
EDIT
Je pense que je vais réfléchir à la façon de donner au gestionnaire d'entités une liste de types pouvant être mis à jour. Ensuite, TOUS les composants de ce type peuvent être mis à jour plutôt que gérés par entité (qui ne sont de toute façon que des index dans mon système).
Encore. Mes questions restent valables pour moi. Je ne sais pas si c'est raisonnable / normal, ou ce que les autres ont tendance à faire.
De plus, les gens d' Insomniac sont géniaux! /ÉDITER
Code réduit pour l'exemple précédent:
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_;
};