Ogre3d: повторение ошибки дочернего узла

У меня есть городской узел, в котором находится много строительных узлов, каждый из которых я хочу предоставить новому дочернему узлу. который говорит дому, какую роль и знак они имеют / роль. Который позже может быть использован для других функций. сейчас все получают один и тот же.mesh (позже будет делать знак), чтобы определить, какой дом есть что. он должен быть назначен случайным образом. Если я пытаюсь запустить это, я получаю следующую ошибку. Я очень плохо знаком с людоедом, который добавляет какой-то странный код

ошибка при попытке запуска

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

1 ответ

Решение

Призвание getNext на ChildNodeIterator будет не только получать следующий элемент, но и переходить к следующему элементу. Смотрите его описание в документации

Так что вы делаете, перебирая детей _cityNode и хранить каждого ребенка в вашем detachable вектор.

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;
  }
}
Другие вопросы по тегам