3

我最近发现了实体系统架构,我在 C++ 中遇到了一些困难/理解实现。

我如何看待实体系统:

组件:具有属性、设置和获取的类。

  1. 雪碧
  2. 实体
  3. 飞船
  4. ...

System:具有组件列表的类。

  1. 项目清单
  2. 实体管理器
  3. 渲染器
  4. 输入
  5. 相机
  6. ...

实体:只是一个带有组件列表的空类。

我做了什么:

目前,我有一个允许我这样做的程序:

// 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,那么每个 System 都有自己的组件列表,可以在其中工作。(组件列表或实体列表,这就是问题)

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;

};

系统管理器代码:

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 中出现了这个错误: “将'System'重新定义为不同类型的符号” (指向 SystemManager 中的“class System”行)

你有解决这个问题的方法吗?我的 EntitySystem 方法好吗?

谢谢!

4

1 回答 1

0

In your code System is a template, later in the System manager class you try to use System as if it were not a template. This will not work. You need to either specify the type, make system manager a template and pass the type parameter through to system, or not have system be a template. Also forward declaring templates, as a non template no less, isn't going to work. Take a step back and figure out how templates work in C++.

Further more http://gamedev.stackexchange.com has many questions and answers about entity component designs, you might find it useful.

于 2012-09-07T15:07:26.033 回答