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