我有一个城市节点,其中包含许多建筑节点,我希望为每个建筑节点授予一个新的子节点。它告诉房子他们有什么角色和标志/角色。以后可以用于其他功能。现在所有人都得到相同的 .mesh(稍后会做一个标志)来识别哪个房子是什么。它应该是随机分配的。如果我尝试运行它,我会收到以下错误。我对 ogre 很陌生,它添加了一些奇怪的代码
int CityManager::assignBuildingRole(Ogre::SceneNode * _cityNode, int _numberOfBuildings)
{
std::stringstream nodename("buildingRoleNode");
Ogre::SceneNode::ChildNodeIterator cNode = _cityNode->getChildIterator();
std::vector <Ogre::SceneNode*> detachable;
while (cNode.hasMoreElements()) {
detachable.push_back((Ogre::SceneNode *)cNode.getNext());
}
for (int i = 0; i < detachable.size(); i++) {
nodename << childIteration << "_" << parentIteration << "_" << i;
switch (rand() % 5) // assign building random proffessions by giving them a rolenode
{
case 0:
_roleNode = ( Ogre::SceneNode *)cNode.getNext()->createChild(nodename.str());
_signEntity = manager->createEntity("Barrel.mesh");
_roleNode->attachObject(_signEntity);
break;
case 1:
_roleNode = (Ogre::SceneNode *)cNode.getNext()->createChild(nodename.str());
_signEntity = manager->createEntity("Barrel.mesh");
_roleNode->attachObject(_signEntity);
break;
case 2:
_roleNode = (Ogre::SceneNode *)cNode.getNext()->createChild(nodename.str());
_signEntity = manager->createEntity("Barrel.mesh");
_roleNode->attachObject(_signEntity);
break;
case 3:
_roleNode = (Ogre::SceneNode *)cNode.getNext()->createChild(nodename.str());
_signEntity = manager->createEntity("Barrel.mesh");
_roleNode->attachObject(_signEntity);
break;
case 4:
_roleNode = (Ogre::SceneNode *)cNode.getNext()->createChild(nodename.str());
_signEntity = manager->createEntity("Barrel.mesh");
_roleNode->attachObject(_signEntity);
break;
default:
break;
}
}
return role;
}
最佳答案
在ChildNodeIterator
上调用getNext
不仅会检索下一个元素,而且前进 到下一个元素。请参阅 documentation 中的描述
因此,您所做的是遍历 _cityNode
的子节点,并将每个子节点存储在您的 detachable
vector 中。
while (cNode.hasMoreElements()) {
detachable.push_back((Ogre::SceneNode *)cNode.getNext());
}
在这些行之后,您的 cNode
指向子列表的末尾(特别是 在 最后一个元素之后,如 中的
是底层数据类型)end()
std::map
如果您尝试进一步迭代它,您将收到错误。
您可以在下一次迭代中使用detachable
(我想这就是您创建它的原因)
_roleNode = detachable[i]->createChild(nodename.str());
或者在您的 while 循环中创建子对象并且根本不使用 detachable
。
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;
}
}
关于c++ - Ogre3d:遍历子节点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43276845/