为了好玩,我决定尝试制作一个简单的实体组件系统。我有一个包含所有组件的列表,我创建了一个名为 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 从游戏循环中的组件本地提取数据有多慢/多快?
最佳答案
我要大胆猜测一下......
您正在存储 Compoent
的列表s 在 std::vector<Component>
.当您存储 Component
的派生类时在std::vector
,你失去了派生类部分。因此,dynamic_cast
失败。
您可以通过存储指向 Components
的指针列表来解决该问题。在 `std::vector.
您可以通过确保基类是抽象基类来避免此类错误。
关于c++ - dynamic_cast 返回空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728698/