我有一个包含许多数据字段的对象
class Object{
Texture texture;
glm::vec2 Position, Size;
glm::vec3 Colour;
//constructor goes here
virtual void Draw(ObjectRenderer &render);
};
我将draw函数定义为:
void Object::Draw(ObjectRenderer &render)
{
renderer.DrawObj(this->Sprite, this->Position, this->Size, this->Colour);
}
我的ObjectRenderer类有一个绘制函数,它接受这些参数
void DrawObj(Texture &texture, glm::vec2 position, glm::vec2 size, glm::vec3 colour);
稍后在我的代码中,我将一个Object instantion插入到一个向量中,并尝试将其渲染到一个openGL上下文中。
vector<Object*> cntr;
cntr.push_back(Object obj);
cntr->Draw(*Render);
现在这个工作,并且Object成功呈现在屏幕上。 (在游戏循环中)。好的,这里很复杂。
然后我拿这个矢量并将其插入地图。
map<std::string, std::vector<Object*>> mapCntr;
map.insert(std::pair<std::string, std::vector<Object*>>("objectCntr", cntr));
当我的程序处于这种状态时,我可以访问地图容器的value_type,这是存储矢量的地方,并在该矢量中绘制一个元素。
std::map<std::string, std::vector<Object*>>::iterator it;
for (it = cntr.begin(); it != cntr.end(); it++)
{
if (it->first == "objectCntr")
{
for (int i = 0; i != it->second.size(); i++)
{
it->second[i]->Draw(*Renderer);
}
}
}
然而,这是问题发生的地方。稍后在我的代码中,我必须获取映射中的向量中的对象,并将其放入临时容器中。我选择我的临时容器作为矢量:
vector<Object*> tmpCntr;
然后我将对象移动到临时向量中:
int i = cntr.find("objectCntr")->second.size() - 1;
tempCntr.push_back(std::move(cntr.find("objectCntr")->second[i]));
此移动成功,我可以访问存储在临时矢量中的对象中的数据字段。
但是我无法再将对象渲染到屏幕上。我尝试了以下代码:
tempCntr[0]->Draw(*Renderer);
没有任何作用。但我知道Object在tempCntr中。如果我删除对象并将其放回到地图中的矢量中,它会再次渲染。
有人可以建议可能是什么原因导致它不呈现?我应该使用不同类型的临时容器吗?