将std :: shared_ptr添加到地图会破坏程序行为

时间:2016-06-15 15:53:58

标签: c++ shared-ptr

对不起,我无法为我的问题想出更好的标题。我遇到了以下问题:

我有一个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();
     }
   }

不幸的是,对象显示不正确。我的代码有什么问题,或者通过将它添加到地图中而不是复制/移动的东西?我一点也不清楚。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

查看此代码:

void RenderSystem::DrawAll() const
   {
     for (auto const & gameObject : m_gameObjects)
     {
       gameObject.second->GetComponent<RenderComponent>()->Draw();
     }
   }

Draw函数按地图gameObject中存储的m_gameObjects顺序调用,而不是按实际需要的顺序调用。

vectordeque似乎是存储对象的更好选择,但是按照您想要绘制的顺序。