【问题标题】:Ogre3d: iterating through childnode errorOgre3d:遍历子节点错误
【发布时间】:2017-04-07 11:19:53
【问题描述】:

我有一个包含许多建筑节点的城市节点,我希望为每个节点授予一个新的子节点。这告诉房子他们有什么角色和标志/角色。以后可以用于其他功能。现在所有人都得到相同的.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;
}

【问题讨论】:

  • getNext 不仅检索下一个子节点,而且还推进迭代器。看到它的docs。将它们更改为peekNextValue 可能会解决您的问题
  • 另外,见评论here:“请注意,返回的迭代器仅在没有从该节点添加或删除子节点时有效”,女巫与任何 stl 迭代器的行为相同跨度>
  • 这是否意味着我不能遍历我的 cityNode 的子节点来以这种方式添加额外的节点?或者 peekNextValue 会解决这个问题吗?
  • 为什么不遍历detachable?只是打电话给detachable[i]-&gt;createChild
  • 我会制定答案

标签: c++ iteration ogre ogre3d


【解决方案1】:

ChildNodeIterator 上调用getNext 不仅会检索下一个元素,还会前进 到下一个元素。参见documentation中的描述

所以你要做的是遍历_cityNode 的孩子并将每个孩子存储在你的detachable 向量中。

while (cNode.hasMoreElements()) {
  detachable.push_back((Ogre::SceneNode *)cNode.getNext());
}

在这些行之后,您的cNode 指向子列表的末尾(特别是最后一个元素之后,如std::map 中的end(),这是基础数据类型)

如果你试图进一步迭代它,你会得到一个错误。

您可以使用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;
  }
}

【讨论】:

    猜你喜欢
    • 2019-01-19
    • 2017-09-18
    • 2013-09-13
    • 1970-01-01
    • 2019-01-23
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多