0

为了好玩,我决定尝试制作一个简单的实体组件系统。我有一个包含所有组件的列表,我创建了一个名为 getPositionComponent 的函数,它获取实体 ID 并返回与该实体相关的位置组件。我制作的所有组件都派生自 Components 类。

struct Component
{
public:
    std::string readableName;
    Component::Component();
    Component(std::string name);
    virtual ~Component();
};

位置组件

 struct PositionComponent :
        public Component
    {
    public:
        PositionComponent(int x, int y);
        ~PositionComponent();
        int x, y;
    };

这就是 getPositionComponent 的样子

PositionComponent* ComponentManager::getPositionComponent(int entityID) {
    int index = entitiesLookup_[entityID] + positionComponentsLookup_[entityID];

    Component *comp = &components_[index];
    PositionComponent* postionComponent = dynamic_cast<PositionComponent*>(comp);

    if (postionComponent != nullptr)
        return postionComponent;
    return nullptr;
}

当我运行它时,当我使用 dynamic_cast 时它总是返回一个 nullptr。在调试时,我可以确认 Component *comp = &components_[index]; 返回正确的组件类型。

在旁注中,我正在阅读一篇文章,其中对于 MMO,他们使用 SQL 来存储组件。sql 在单人游戏中从游戏循环中的组件本地提取数据的速度有多慢/快?

4

1 回答 1

2

我在这里冒险猜测一下...

您将Compoents 的列表存储在 a 中std::vector<Component>。当您将派生类存储Component在 a 中std::vector时,您将丢失派生类部分。因此,dynamic_cast失败。

您可以通过将指针列表存储Components在 `std::vector 中来解决该问题。

您可以通过确保基类是抽象基类来避免此类错误。

于 2014-05-19T01:58:47.193 回答