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;
  }
}