Para que los componentes puedan actualizar cada marco (y dejar esta funcionalidad fuera de los componentes que no lo necesitan), tuve la idea de hacer un componente UpdateComponent. Otros componentes como MovableComponent
(que tiene velocidad) heredarían de la IUpdatable
clase abstracta. Esto obliga MovableComponent
a implementar un Update(gametime dt)
método y otro RegisterWithUpdater()
que le da UpdateComponent
un puntero al MovableComponent
. Muchos componentes podrían hacer esto y luego UpdateComponent
llamar a todos sus Update(gametime dt)
métodos sin tener que preocuparse por quiénes o qué son.
Mis preguntas son:
- ¿Parece esto algo normal o usado por alguien? No puedo encontrar nada sobre el tema.
- ¿Cómo podría mantener un orden para los componentes como la física y luego el cambio de posición? ¿Es esto incluso necesario?
- ¿Cuáles son otras formas de asegurar que los componentes que deben procesarse en cada cuadro se procesen realmente?
EDITAR
Creo que voy a considerar cómo darle al administrador de la entidad una lista de tipos que se pueden actualizar. Luego, TODOS los componentes de ese tipo pueden actualizarse en lugar de administrarlo por entidad (que de todos modos son solo índices en mi sistema).
Todavía. Mis preguntas siguen siendo válidas para mí. No sé si esto es razonable / normal, o qué tienden a hacer los demás.
Además, ¡la gente de Insomniac es increíble! /EDITAR
Código resumido para el ejemplo anterior:
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_;
};