コンポーネントがすべてのフレームを更新できるようにする(そしてこの機能を必要のないコンポーネントから除外する)ために、UpdateComponentコンポーネントを作成するというアイデアを得ました。MovableComponent
(速度を保持する)などの他のコンポーネントは、IUpdatable
抽象クラスを継承します。これによりMovableComponent
、Update(gametime dt)
メソッドへのポインタとへのポインタをRegisterWithUpdater()
提供するメソッドの実装が強制されUpdateComponent
ますMovableComponent
。多くのコンポーネントがこれを実行し、誰が何であるかを気にすることなくUpdateComponent
、すべてのUpdate(gametime dt)
メソッドを呼び出すことができます。
私の質問は:
- これは、正常または誰かが使用しているもののように見えますか?この件については何も見つかりません。
- 物理学などのコンポーネントの順序を変更してから位置を変更するにはどうすればよいですか?これも必要ですか?
- フレームごとに処理する必要があるコンポーネントが実際に処理されることを保証する他の方法は何ですか?
編集
私はエンティティマネージャに更新可能なタイプのリストを与える方法を検討していると思います。次に、そのタイプのすべてのコンポーネントを、エンティティごとに管理するのではなく更新できます(とにかく、私のシステムのインデックスにすぎません)。
まだ。私の質問は引き続き有効です。これが理にかなっているのか、通常のことなのか、他の人が何をする傾向があるのかはわかりません。
また、不眠症の人々は素晴らしいです! /編集
前の例のコードを煮詰めました:
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_;
};