私は最近、エンティティ システム アーキテクチャを発見しました。C++ でそれを実行するのは困難であり、実装を理解することもできません。
エンティティ システムの見方:
コンポーネント: 属性、set および get を持つクラス。
- スプライト
- 物理体
- 宇宙船
- ...
System : コンポーネントのリストを持つクラス。
- リスト項目
- エンティティマネージャー
- レンダラー
- 入力
- カメラ
- ...
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アプローチは良かったですか?
ありがとう!