Para que os componentes possam atualizar todos os quadros (e deixar essa funcionalidade fora dos componentes que não precisam), tive a ideia de criar um componente UpdateComponent. Outros componentes como MovableComponent
(que mantém a velocidade) herdariam da IUpdatable
classe abstrata. Isso força MovableComponent
a implementar um Update(gametime dt)
método e outro RegisterWithUpdater()
que fornece UpdateComponent
um ponteiro para o MovableComponent
. Muitos componentes poderiam fazer isso e, em seguida, UpdateComponent
poderiam chamar todos os seus Update(gametime dt)
métodos sem precisar se preocupar com quem ou o que são.
Minhas perguntas são:
- Parece algo normal ou usado por alguém? Não consigo encontrar nada sobre o assunto.
- Como eu poderia manter uma ordem para os componentes como física e depois mudar de posição? Isso é mesmo necessário?
- Quais são outras maneiras de garantir que os componentes que devem ser processados em cada quadro sejam realmente processados?
EDIT
Acho que vou considerar como fornecer ao gerente da entidade uma lista dos tipos que são atualizáveis. Todos os componentes desse tipo podem ser atualizados em vez de gerenciá-los por entidade (que são apenas índices no meu sistema).
Ainda. Minhas perguntas permanecem válidas para mim. Não sei se isso é razoável / normal ou o que os outros tendem a fazer.
Além disso, o pessoal da Insomniac é incrível! /EDITAR
Código resumido para o exemplo 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_;
};