C++ Ogre3d:迭代子节点错误
我有一个城市节点,其中包含许多建筑节点,每个节点我都希望授予一个新的子节点。这告诉房子他们有什么角色和标志。以后可用于其他功能。现在所有人都得到了相同的.mesh(稍后会做一个标记)来识别哪栋房子是什么。应随机分配。如果我尝试运行此命令,则会出现以下错误。我对食人魔很陌生,它增加了一些奇怪的代码C++ Ogre3d:迭代子节点错误,c++,iteration,ogre,ogre3d,C++,Iteration,Ogre,Ogre3d,我有一个城市节点,其中包含许多建筑节点,每个节点我都希望授予一个新的子节点。这告诉房子他们有什么角色和标志。以后可用于其他功能。现在所有人都得到了相同的.mesh(稍后会做一个标记)来识别哪栋房子是什么。应随机分配。如果我尝试运行此命令,则会出现以下错误。我对食人魔很陌生,它增加了一些奇怪的代码 int CityManager::assignBuildingRole(Ogre::SceneNode*\u cityNode,int\u numberOfBuildings) { 标准::strin
int CityManager::assignBuildingRole(Ogre::SceneNode*\u cityNode,int\u numberOfBuildings)
{
标准::stringstream节点名称(“buildingRoleNode”);
Ogre::SceneNode::ChildNodeIterator cNode=\u cityNode->getChildIterator();
可分离的载体;
while(cNode.hasMoreElements()){
可分离。向后推((食人魔::场景节点*)cNode.getNext();
}
对于(int i=0;iattachObject(_signEntity);
打破
案例2:
_roleNode=(Ogre::SceneNode*)cNode.getNext()->createChild(nodename.str());
_signEntity=manager->createEntity(“Barrel.mesh”);
_roleNode->attachObject(_signEntity);
打破
案例3:
_roleNode=(Ogre::SceneNode*)cNode.getNext()->createChild(nodename.str());
_signEntity=manager->createEntity(“Barrel.mesh”);
_roleNode->attachObject(_signEntity);
打破
案例4:
_roleNode=(Ogre::SceneNode*)cNode.getNext()->createChild(nodename.str());
_signEntity=manager->createEntity(“Barrel.mesh”);
_roleNode->attachObject(_signEntity);
打破
违约:
打破
}
}
返回角色;
}
在ChildNodeIterator
上调用getNext
不仅会检索下一个元素,还会前进到下一个元素。请参见中的描述
因此,您要做的是迭代\u cityNode
的子元素,并将每个子元素存储在可分离的
向量中
while (cNode.hasMoreElements()) {
detachable.push_back((Ogre::SceneNode *)cNode.getNext());
}
在这些行之后,您的cNode
指向子列表的末尾(特别是在最后一个元素之后,如std::map
中的end()
,它是基础数据类型)
如果您试图进一步迭代它,您将得到一个错误
您可以在下一次迭代中使用detaccable
(我想这就是您创建它的原因)
或者在while循环中创建子对象,并且根本不使用detaccable
while (cNode.hasMoreElements()) {
Ogre::SceneNode* curr = (Ogre::SceneNode *)cNode.getNext();
switch (rand() % 5)
{
case 0:
_roleNode = curr->createChild(nodename.str());
_signEntity = manager->createEntity("Barrel.mesh");
_roleNode->attachObject(_signEntity);
break;
/* ... */
default:
break;
}
}
getNext
不仅检索下一个子节点,还推进迭代器。看看它。将它们更改为peek nextvalue
可能会解决您的问题。另外,请参阅注释:“注意,返回的迭代器仅在没有从该节点添加或删除子节点的情况下有效”,这与任何stl迭代器的行为相同。这是否意味着我无法通过cityNode的子节点以这种方式添加额外节点?或者peekNextValue会解决这个问题吗?为什么不反复使用可分离的?只要调用detaccable[i]->createChild
我就可以给出一个答案
_roleNode = detachable[i]->createChild(nodename.str());
while (cNode.hasMoreElements()) {
Ogre::SceneNode* curr = (Ogre::SceneNode *)cNode.getNext();
switch (rand() % 5)
{
case 0:
_roleNode = curr->createChild(nodename.str());
_signEntity = manager->createEntity("Barrel.mesh");
_roleNode->attachObject(_signEntity);
break;
/* ... */
default:
break;
}
}