为了好玩,我决定尝试制作一个简单的实体组件系统。我有一个包含所有组件的列表,我创建了一个名为 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 在单人游戏中从游戏循环中的组件本地提取数据的速度有多慢/快?