我在用代码块在SFML中生成形状时遇到麻烦,并且无法验证其是否重叠了另一种形状,以及是否确实存在重叠,然后尝试在另一位置再次生成它。
代码如下:
srand(time(0));
CircleShape circleObjectArray[50];
for(int i = 0; i < 50; i++)
{
for(int j = i - 1; j < 49; j++)
{
circleObjectArray[i] = CircleShape(rand() % 50 + 5);
circleObjectArray[i].setPosition(rand() % 1870 + 50, rand() % 1030 + 50);
circleObjectArray[i].setFillColor(Color(rand() % 255,rand() % 255,rand() % 255));
if(circleObjectArray[i].getGlobalBounds().intersects( circleObjectArray[j].getGlobalBounds()))
{
srand(time(0));
circleObjectArray[i].setPosition(rand() % 1870 + 50, rand() % 1030 + 50);
cout << "overlap" << endl;
}
}
}
如果我使用一段时间而不是if语句,if将进入无限循环。
反正我可以做这项工作吗?
非常感谢您的时间:D
答案 0 :(得分:1)
要检查当前生成的形状是否与任何已经生成的形状不相交,您的嵌套循环需要从第一个迭代到先前生成的形状,因此从索引0
到上一个生成的索引i - 1
,而不是从上一个开始。如果发生重叠,则还需要重置内循环索引j = 0;
,以确保新位置不会导致与已经检查的形状重叠。
在检查与先前形状的相交时,无需初始化当前形状。我将这些指令移到了外循环中,因此每个新形状都调用一次。
也不需要多次初始化随机数生成器。我删除了第二个srand(time(0));
。
其余部分保持不变。
srand(time(0));
CircleShape circleObjectArray[50];
for (int i = 0; i < 50; i++)
{
circleObjectArray[i] = CircleShape(rand() % 50 + 5);
circleObjectArray[i].setPosition(rand() % 1870 + 50, rand() % 1030 + 50);
circleObjectArray[i].setFillColor(Color(rand() % 255, rand() % 255, rand() % 255));
for (int j = 0; j < i - 1; j++)
{
if (circleObjectArray[i].getGlobalBounds().intersects(circleObjectArray[j].getGlobalBounds()))
{
circleObjectArray[i].setPosition(rand() % 1870 + 50, rand() % 1030 + 50);
cout << "overlap" << endl;
j = 0;
}
}
}