3

私は最近、エンティティ システム アーキテクチャを発見しました。C++ でそれを実行するのは困難であり、実装を理解することもできません。

エンティティ システムの見方:

コンポーネント: 属性、set および get を持つクラス。

  1. スプライト
  2. 物理体
  3. 宇宙船
  4. ...

System : コンポーネントのリストを持つクラス。

  1. リスト項目
  2. エンティティマネージャー
  3. レンダラー
  4. 入力
  5. カメラ
  6. ...

Entity : コンポーネントのリストを持つ単なる空のクラス。

私がやったこと:

現在、私はそれを可能にするプログラムを持っています:

// Create a new entity/
Entity* entity = game.createEntity();

// Add some components.
entity->addComponent( new TransformableComponent() )
            ->setPosition( 15, 50 )
            ->setRotation( 90 )
        ->addComponent( new PhysicComponent() )
            ->setMass( 70 )
        ->addComponent( new SpriteComponent() )
            ->setTexture( "name.png" )
            ->addToSystem( new RendererSystem() );

EntitySystem を正しく理解していれば、各システムには、それが動作するコンポーネントの独自のリストがあります。(コンポーネントのリストまたはエンティティのリスト、それが問題です)

class Component;

/////////////////////////////////////////////////
/// \brief  An abstract system. (Interface)
///
/////////////////////////////////////////////////
class System
{
public:

    /////////////////////////////////////////////////
    /// \brief Call when process is created.
    ///
    /////////////////////////////////////////////////
    virtual bool start() = 0;

    /////////////////////////////////////////////////
    /// \brief Call when process is updated.
    ///
    /////////////////////////////////////////////////   
    virtual void update() = 0;

    /////////////////////////////////////////////////
    /// \brief Call when process is removed.
    ///
    /////////////////////////////////////////////////
    virtual void end() = 0;

    /////////////////////////////////////////////////
    /// \brief Call when process is removed.
    ///
    /////////////////////////////////////////////////
    virtual void addComponent( Component* component )
    {
        elements.push_back( component );
    }

protected:

    std::vector<Component*> elements;

};

(高速デバッグのためだけにコードを .h に入れました ^^)

問題

X コンポーネントのリストを持つシステムに「T」コンポーネントを追加したい

私が試したこと:

std::vector<Component*> elements;

しかし、私はそのようなものが欲しい:

std::vector<T*> elements;

私の System クラスは抽象的です。私のシステムの子クラスには、このリストが独自のタイプである必要があります。

解決 :

System クラスにテンプレート クラスを持たせようとしたので、次のようにしました: class Renderer: System

しかし、私の SystemManager はこのコードが好きではありません: std::vector<System> systems.

T タイプのシステム クラス:

template<class T>
class System
{
public:

    /////////////////////////////////////////////////
    /// \brief Call when process is created.
    ///
    /////////////////////////////////////////////////
    virtual bool start() = 0;

    /////////////////////////////////////////////////
    /// \brief Call when process is updated.
    ///
    /////////////////////////////////////////////////   
    virtual void update() = 0;

    /////////////////////////////////////////////////
    /// \brief Call when process is removed.
    ///
    /////////////////////////////////////////////////
    virtual void end() = 0;

    /////////////////////////////////////////////////
    /// \brief Call when process is removed.
    ///
    /////////////////////////////////////////////////
    virtual void addComponent( T* component )
    {
        elements.push_back( component );
    }

protected:

    std::vector<T*> elements;

};

SystemManager コード:

class System;

class SystemManager
{
public:

    /////////////////////////////////////////////////
    /// \brief Default constructor.
    ///
    /////////////////////////////////////////////////
    SystemManager();

    /////////////////////////////////////////////////
    /// \brief Call when system is created.
    /// \param system A system to add.
    ///
    /////////////////////////////////////////////////
    bool addSystem( System* system);

    /////////////////////////////////////////////////
    /// \brief Call when system is updated.
    ///
    /////////////////////////////////////////////////
    void update();

    /////////////////////////////////////////////////
    /// \brief Call when system is removed.
    /// \param system A system to remove.
    ///
    /////////////////////////////////////////////////
    void removeSystem( System* system );

private:

    std::vector<System*> systemList;

};

これにより、SystemManager に次のエラーが表示され ます

この問題の解決策はありましたか? 私のEntitySystemアプローチは良かったですか?

ありがとう!

4

1 に答える 1

0

コードでは、Systemはテンプレートですが、後でSystem managerクラスで、Systemをテンプレートではないかのように使用しようとします。これは機能しません。タイプを指定するか、システムマネージャをテンプレートにして、タイプパラメータをシステムに渡すか、システムをテンプレートにしないかのいずれかを行う必要があります。また、非テンプレートとしての前方宣言テンプレートは機能しません。一歩下がって、C++でテンプレートがどのように機能するかを理解してください。

さらに多くのhttp://gamedev.stackexchange.comには、エンティティコンポーネントの設計に関する多くの質問と回答があり、役立つ場合があります。

于 2012-09-07T15:07:26.033 に答える