Damit Komponenten in der Lage sind, jeden Frame zu aktualisieren (und diese Funktionalität aus Komponenten herauszulassen, die nicht benötigt werden), kam mir die Idee, eine UpdateComponent-Komponente zu erstellen. Andere Komponenten wie MovableComponent
(die Geschwindigkeit halten) würden von der IUpdatable
abstrakten Klasse erben . Dies erzwingt MovableComponent
die Implementierung einer Update(gametime dt)
Methode und einer anderen RegisterWithUpdater()
, die UpdateComponent
einen Zeiger auf die gibt MovableComponent
. Viele Komponenten könnten dies tun und dann UpdateComponent
alle ihre Update(gametime dt)
Methoden aufrufen , ohne sich darum kümmern zu müssen, wer oder was sie sind.
Meine Fragen sind:
- Scheint dies etwas zu sein, das normal ist oder von irgendjemandem benutzt wird? Ich kann nichts zu diesem Thema finden.
- Wie könnte ich eine Reihenfolge für die Komponenten wie Physik aufrechterhalten und dann die Position ändern? Ist das überhaupt nötig?
- Was sind andere Möglichkeiten, um sicherzustellen, dass Komponenten, die in jedem Frame verarbeitet werden sollen, tatsächlich verarbeitet werden?
BEARBEITEN
Ich denke, ich werde überlegen, wie ich dem Entitätsmanager eine Liste der Typen geben kann, die aktualisiert werden können. Dann können ALLE Komponenten dieses Typs aktualisiert werden, anstatt sie pro Entität zu verwalten (die ohnehin nur Indizes in meinem System sind).
Immer noch. Meine Fragen bleiben für mich gültig. Ich weiß nicht, ob dies vernünftig / normal ist oder was andere dazu neigen.
Auch die Leute bei Insomniac sind großartig! /BEARBEITEN
Eingekochter Code für das vorherige Beispiel:
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_;
};