Для того, щоб компоненти могли мати змогу оновлювати кожен кадр (а також залишати цю функціональність поза компонентами, які не потребують), у мене з’явилася ідея зробити компонент UpdateComponent. Інші компоненти на зразок MovableComponent
(який утримує швидкість) успадкували б від IUpdatable
абстрактного класу. Це змушує MovableComponent
реалізувати Update(gametime dt)
метод та інший, RegisterWithUpdater()
що дає UpdateComponent
вказівник на MovableComponent
. Багато компонентів могли це зробити, а потім UpdateComponent
могли закликати всі свої Update(gametime dt)
методи, не піклуючись про те, хто чи що вони є.
Мої запитання:
- Чи здається це схожим на все, що є нормальним чи хтось використовує? Я нічого не можу знайти з цього приводу.
- Як я можу підтримувати порядок таких компонентів, як фізика, а потім змінювати положення? Це навіть потрібно?
- Які ще способи гарантувати, що компоненти, які слід обробити кожен кадр, насправді обробляються?
EDIT
Я думаю, що я буду вирішувати, як надати менеджеру суб’єктів список типів, які можна оновити. Тоді ВСІ компоненти цього типу можуть оновлюватись, а не керувати нею для кожної сутності (що так само є індексами в моїй системі).
Все-таки. Мої питання залишаються актуальними для мене. Я не знаю, чи це розумно / нормально, чи що, як правило, роблять інші.
Крім того, люди в Безсонні є приголомшливими! / РЕД
Скинутий код для попереднього прикладу:
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_;
};