Для того чтобы компоненты могли обновлять каждый кадр (и исключать эту функциональность из компонентов, которые не нужны), у меня появилась идея создать компонент UpdateComponent. Другие компоненты, такие как MovableComponent
(который содержит скорость) будут наследоваться от IUpdatable
абстрактного класса. Это заставляет MovableComponent
реализовать Update(gametime dt)
метод и другой, RegisterWithUpdater()
который дает UpdateComponent
указатель на MovableComponent
. Многие компоненты могут сделать это, а затем UpdateComponent
могут вызывать все свои Update(gametime dt)
методы, не заботясь о том, кто или что они есть.
Мои вопросы:
- Кажется ли это чем-то нормальным или кем-то используемым? Я не могу найти что-нибудь по этому вопросу.
- Как я могу поддерживать порядок для таких компонентов, как физика, а затем менять положение? Это даже необходимо?
- Каковы другие способы обеспечения того, чтобы компоненты, которые должны обрабатываться в каждом кадре, действительно обрабатывались?
РЕДАКТИРОВАТЬ
Я думаю, что я решу, как дать менеджеру сущностей список типов, которые можно обновлять. Тогда ВСЕ компоненты этого типа могут обновлять, а не управлять ими для каждой сущности (которые в любом случае являются просто индексами в моей системе).
По-прежнему. Мои вопросы остаются в силе для меня. Я не знаю, является ли это разумным / нормальным или что другие склонны делать.
Кроме того, люди в Insomniac потрясающие! /РЕДАКТИРОВАТЬ
Код выкипания для предыдущего примера:
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_;
};