对不起,我无法为我的问题想出更好的标题。我遇到了以下问题:
我有一个GameObject类,代表世界上所有可能的东西。它可以包含几个定义其行为的组件。 GameObject可以渲染如下:
//GameObjectPtr is std::shared_ptr<GameObject>
GameObjectPtr skyBoxGameObject = GameObject::makeGameObject();
skyBoxGameObject->AddComponent<RenderComponent>(skyBox);
在主循环中,如果我现在从GameObject获取RenderComponent,如下所示:
planeGameObject->GetComponent<RenderComponent>()->Draw();
skyBoxGameObject->GetComponent<RenderComponent>()->Draw();
一切正常。另一方面,我现在想要实现一个RenderSystem,它按ID存储GameObjects并再次使用std :: shared_ptr来保存对它们的引用:
//In RenderSystem:
std::map<unsigned int, std::shared_ptr<GameObject>> m_gameObjects;
将GameObject添加到RenderingSystem完成:
void RenderSystem::AddGameObject(std::shared_ptr<GameObject> gameObjectPtr)
{
if (m_gameObjects.count(gameObjectPtr->GetId()) > 0)
throw std::runtime_error("GameObject already registered");
if (gameObjectPtr->GetComponent<RenderComponent>() == nullptr)
throw std::runtime_error("GameObject doesn't provide rendercomponent");
m_gameObjects[gameObjectPtr->GetId()] = gameObjectPtr;
}
绘图以这种方式完成:
void RenderSystem::DrawAll() const
{
for (auto const & gameObject : m_gameObjects)
{
gameObject.second->GetComponent<RenderComponent>()->Draw();
}
}
不幸的是,对象显示不正确。我的代码有什么问题,或者通过将它添加到地图中而不是复制/移动的东西?我一点也不清楚。
感谢您的帮助!
答案 0 :(得分:1)
查看此代码:
void RenderSystem::DrawAll() const
{
for (auto const & gameObject : m_gameObjects)
{
gameObject.second->GetComponent<RenderComponent>()->Draw();
}
}
Draw
函数按地图gameObject
中存储的m_gameObjects
顺序调用,而不是按实际需要的顺序调用。
vector
或deque
似乎是存储对象的更好选择,但是按照您想要绘制的顺序。