Ogre3d:遍历子节点错误
Ogre3d: iterating through childnode error
我有一个城市节点,其中包含许多建筑节点,我希望为每个建筑节点授予一个新的子节点。这告诉房子他们的角色和标志 have/role。以后可以用于其他功能。现在所有人都得到相同的 .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
的 children 并将每个 child 存储在你的 detachable
向量中。
while (cNode.hasMoreElements()) {
detachable.push_back((Ogre::SceneNode *)cNode.getNext());
}
在这些行之后,您的 cNode
指向 children 列表的末尾(特别是 在 最后一个元素之后,因为 end()
在 std::map
是基础数据类型)
如果你试图进一步迭代它,你会得到一个错误。
您可以将 detachable
用于下一次迭代(我想这就是您创建它的原因)
_roleNode = detachable[i]->createChild(nodename.str());
或者在你的 while 循环中创建 child 并且根本不使用 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;
}
}
我有一个城市节点,其中包含许多建筑节点,我希望为每个建筑节点授予一个新的子节点。这告诉房子他们的角色和标志 have/role。以后可以用于其他功能。现在所有人都得到相同的 .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
的 children 并将每个 child 存储在你的 detachable
向量中。
while (cNode.hasMoreElements()) {
detachable.push_back((Ogre::SceneNode *)cNode.getNext());
}
在这些行之后,您的 cNode
指向 children 列表的末尾(特别是 在 最后一个元素之后,因为 end()
在 std::map
是基础数据类型)
如果你试图进一步迭代它,你会得到一个错误。
您可以将 detachable
用于下一次迭代(我想这就是您创建它的原因)
_roleNode = detachable[i]->createChild(nodename.str());
或者在你的 while 循环中创建 child 并且根本不使用 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;
}
}