Ogre3d 具有唯一的节点名称错误

Ogre3d having unique node names error

我正在为我的一款 pcg 游戏制作城市生成。我有一个 for 循环,它在随机位置生成 3 个城市,我分配 parentIteration 以获得城市的 "id" 并在我制作建筑物的 for 循环中执行相同的操作

for (int i = 0; i < 3; i++)
{
    parentIteration = i;
    std::srand(i);
    _rootNode = GameManager::getSingletonPtr()->getSceneManager()->getRootSceneNode();

    _cityNode = _rootNode->createChildSceneNode("cityNode " + parentIteration);
    generateCity(std::rand() % 10000 + 10, std::rand() % 10000 + 10, std::rand() % 11 +1);
}

建筑物

for (int i = 0; i < _numberOfBuildings; i++)
    {
        childIteration = i;
        printf(" parent  %d and child %d \n", parentIteration, childIteration);
        Ogre::SceneNode* buildingNode  = _cityNode->createChildSceneNode("citybuildingNode"+childIteration+parentIteration );
}

然而,当我尝试启动游戏时,它会在创建第二个城市时崩溃。说它已经有一个类似于它试图写的名字。然而我的 printf 清楚地表明那一点的数字都是唯一的。任何人都知道如何解决这个问题? (为输出证明添加图片)

错误信息中的"itybuildingNode"提示

"citybuildingNode"+childIteration+parentIteration

没有按照您想要的方式工作。

这是因为有几件事对您不利:

  1. "citybuildingNode" 是字符串文字,而不是字符串 object。它只是一行中的一堆字符,以空字符结尾并表示为 const char *,指向该字符数组的指针。它是 low-level 巫术,是那种你可以用字符串 class 围绕的东西。 For more information see String Literals

  2. 因为它不是字符串 object,所以您不能使用任何常用的字符串 object 技巧,例如与 + 连接并与 ==。但是因为它是一个指针,所以编译器将 + 解释为尝试执行指针运算并引用数组中的另一个位置。它可以编译,但请注意它是如何将 "citybuildingNode" 变成 "itybuildingNode" 的。哎呀。

这看起来像:

const char* temp = "citybuildingNode"
_cityNode->createChildSceneNode(temp + childIteration + parentIteration);

解析为

const char* temp = "citybuildingNode"
_cityNode->createChildSceneNode(&temp[childIteration + parentIteration]);
  1. 即使是字符串 object,C++ 标准字符串 object、std::string 也不允许您向字符串添加数字。它只是将字符串加在一起以构建更大的字符串。要将数字添加到 std::string,您必须将数字变成 std::stringstd::to_string 可以在这里为您提供帮助,但是 cleaner-looking 可以使用 std::stringstream
  2. 来做到这一点

例如:

std::stringstream nodename("citybuildingNode"); 
// builds a string stream around the string literal
nodename << childIteration << parentIteration;
// writes the numbers into the stream the same way `cin << number;` would
// turning the number into a string for you
Ogre::SceneNode* buildingNode  = _cityNode->createChildSceneNode(nodename.str());
// gets the assembled string from the stringstream 
// null-terminated string like ogre expects

这让你开始朝着正确的方向前进,但仍然允许 child 1 和 parent 10 ("citybuildingNode110") 和 child 11 和 parent 0(也就是 "citybuildingNode110")和类似的。所以你真的想要更像

的东西
nodename << childIteration << '_' << parentIteration;

强制在两个数字之间使用分隔符。

Documentation for std::stringstream.

还有一种可能是讨厌的。只要 std::stringstream nodename 存在,我们刚刚提供给 ogre 的 string 就会存在,并且它会在生成它的循环结束时消失。快速浏览 the documentation that says ogre makes its own copy of this string. So play around a bit to make sure that you don't have to store this name somewhere to prevent it from falling out of scope, being destroyed, and leaving ogre with a dangling reference.

我没有看到任何内容