c++ - Ogre3d:遍历子节点错误

标签 c++ iteration ogre ogre3d

我有一个城市节点,其中包含许多建筑节点,我希望为每个建筑节点授予一个新的子节点。它告诉房子他们有什么角色和标志/角色。以后可以用于其他功能。现在所有人都得到相同的 .mesh(稍后会做一个标志)来识别哪个房子是什么。它应该是随机分配的。如果我尝试运行它,我会收到以下错误。我对 ogre 很陌生,它添加了一些奇怪的代码

error when trying to launch

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/

相关文章:

c++ - 代码 :Blocks Mingw Compiler Error: Variable-Sized Object May Not Be Initialized

c++ - 为什么在 C++ 中,Visual Studio 将我的类构造函数描述为具有 "2+ Overloads"?

python - 列表理解中的捕获和 yield

javascript - 如何在 jquery 中使用 "For"而不是 "each"函数

javascript - 有人可以解释 Angular as-for-in 表达式符号吗?

c++ - 添加符号时出错 : DSO missing from command line

android - 如何在 Android 应用程序上启用 msaa

java - 内部调用另一个 dll 的 JNI DLL 的依赖项

c++ - 参数必须是另一个模板类的模板类

c++ - 在没有设置对话框的情况下启动 Ogre BaseApplication