为了好玩,我决定尝试制作一个简单的实体组件系统。我有一个包含所有组件的列表,我创建了一个名为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。在debbuging我可以确认Component * comp =&amp; components_ [index];返回正确的组件类型。
另一方面,我正在阅读一篇文章,其中对于MMO,他们使用SQL来存储组件。在单人游戏中,sql从游戏循环中的组件本地提取数据的速度有多慢?
答案 0 :(得分:2)
我打算在这里猜测......
您正在Compoent
中存储std::vector<Component>
的列表。在Component
中存储std::vector
的派生类时,会丢失派生类部分。因此,dynamic_cast
失败。
您可以通过在`std :: vector中存储指向Components
的指针列表来解决该问题。
通过确保基类是抽象基类,可以避免这样的错误。