标题描述了情况,但潜在的问题可能完全不同。
我正在尝试制作一个简单的ECS游戏引擎。我有一堆实体,每个实体都包含一个vector<shared_ptr<Component>>
。 Component
是所有派生组件的基类。
在游戏循环中,我有不同的System
用来更新具有某些组件的实体。我为系统获取正确组件的方法是使用以下功能
template <typename T>
inline T& GetComponent(std::uint32_t type)
{
std::shared_ptr<Component> baseComponent = this->components[this->typeToIndexMap[type]];
std::shared_ptr<T> component = std::static_pointer_cast<T>(baseComponent);
return *(component.get());
}
问题是,当我尝试修改系统(inputComponent.lastX = 5.f;
)中的组件时,它不起作用。下一个帧的值是相同的。我猜测发生某种中断是因为我正在存储Component
,但不确定如何解决此问题。有什么想法是真的,我该如何解决?
编辑:其他信息
实体将组件保存在vector<shared_ptr<Component>>
添加组件
void Entity::AddComponent(std::shared_ptr<Component> component)
{
this->components.push_back(component);
this->componentBitset = this->componentBitset | component->GetComponentType();
this->typeToIndexMap[component->GetComponentType()] = this->components.size() - 1;
}
组件创建
std::shared_ptr<InputComponent> inputComponent = std::make_shared<InputComponent>(InputComponent());
entity->AddComponent(inputComponent);
组件结构
class Component
{
public:
// Constructor / Destructor
Component(std::uint32_t type);
~Component();
std::uint32_t GetComponentType();
private:
std::uint32_t type;
};
输入组件
class InputComponent : public Component
{
public:
InputComponent();
~InputComponent();
double lastX;
double lastY;
};
最后我们有了系统
void InputSystem::Update(GLFWwindow* window, std::vector<std::shared_ptr<Entity>>& entities)
{
for (int i = 0; i < entities.size(); i++)
{
if (entities[i]->IsEligibleForSystem(this->primaryBitset))
{
InputComponent component = entities[i]->GetComponent<InputComponent>(ComponentType::Input);
double x, y;
glfwGetCursorPos(window, &x, &y);
// some other things are happening here
component.lastX = x;
component.lastY = y;
}
}
}
答案 0 :(得分:1)
问题在这里:
InputComponent component = entities[i]->GetComponent<InputComponent>(ComponentType::Input);
您实际上是按值获得了InputComponent
。尝试更改GetComponent
,使其返回T*
,在此提到的第一行更改为:
InputComponent *component = entities[i]->GetComponent<InputComponent>(ComponentType::Input);