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
没有按照您想要的方式工作。
这是因为有几件事对您不利:
"citybuildingNode" 是字符串文字,而不是字符串 object。它只是一行中的一堆字符,以空字符结尾并表示为 const char *
,指向该字符数组的指针。它是 low-level 巫术,是那种你可以用字符串 class 围绕的东西。 For more information see String Literals
因为它不是字符串 object,所以您不能使用任何常用的字符串 object 技巧,例如与 +
连接并与 ==
。但是因为它是一个指针,所以编译器将 +
解释为尝试执行指针运算并引用数组中的另一个位置。它可以编译,但请注意它是如何将 "citybuildingNode" 变成 "itybuildingNode" 的。哎呀。
这看起来像:
const char* temp = "citybuildingNode"
_cityNode->createChildSceneNode(temp + childIteration + parentIteration);
解析为
const char* temp = "citybuildingNode"
_cityNode->createChildSceneNode(&temp[childIteration + parentIteration]);
- 即使是字符串 object,C++ 标准字符串 object、
std::string
也不允许您向字符串添加数字。它只是将字符串加在一起以构建更大的字符串。要将数字添加到 std::string
,您必须将数字变成 std::string
。 std::to_string
可以在这里为您提供帮助,但是 cleaner-looking 可以使用 std::stringstream
来做到这一点
例如:
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.
我没有看到任何内容
我正在为我的一款 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
没有按照您想要的方式工作。
这是因为有几件事对您不利:
"citybuildingNode" 是字符串文字,而不是字符串 object。它只是一行中的一堆字符,以空字符结尾并表示为
const char *
,指向该字符数组的指针。它是 low-level 巫术,是那种你可以用字符串 class 围绕的东西。 For more information see String Literals因为它不是字符串 object,所以您不能使用任何常用的字符串 object 技巧,例如与
+
连接并与==
。但是因为它是一个指针,所以编译器将+
解释为尝试执行指针运算并引用数组中的另一个位置。它可以编译,但请注意它是如何将 "citybuildingNode" 变成 "itybuildingNode" 的。哎呀。
这看起来像:
const char* temp = "citybuildingNode"
_cityNode->createChildSceneNode(temp + childIteration + parentIteration);
解析为
const char* temp = "citybuildingNode"
_cityNode->createChildSceneNode(&temp[childIteration + parentIteration]);
- 即使是字符串 object,C++ 标准字符串 object、
std::string
也不允许您向字符串添加数字。它只是将字符串加在一起以构建更大的字符串。要将数字添加到std::string
,您必须将数字变成std::string
。std::to_string
可以在这里为您提供帮助,但是 cleaner-looking 可以使用std::stringstream
来做到这一点
例如:
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.