精灵数组循环只显示 1 个元素
Sprite array loop only shows 1 element
试图让 4 朵云在屏幕上从左向右移动。当我执行时,我可以看到所有 4 朵云都绘制在代码中给定的位置。但是在游戏开始后,只有一朵云在屏幕上移动;其他 3 个从未出现。
const int NUM_CLOUDS = 4;
Sprite clouds[NUM_CLOUDS];
int position = 0;
主要内容:
Texture textureCloud;
textureCloud.loadFromFile("graphics/cloud.png");
for (int i = 0; i < NUM_CLOUDS; i++)
{
clouds[i].setTexture(textureCloud);
clouds[i].setPosition(0, position);
position += 100;
}
bool cloudsActive[NUM_CLOUDS];
for (int i = 0; i < NUM_CLOUDS; i++)
{
cloudsActive[i] = false;
}
float cloudSpeed[NUM_CLOUDS];
for (int i = 0; i < NUM_CLOUDS; i++)
{
cloudSpeed[i] = 0.0f;
}
for (int i = 0; i < NUM_CLOUDS; i++)
{
if (!cloudsActive[i])
{
srand((int)time(0) * 30);
cloudSpeed[i] = (rand() % 200);
srand((int)time(0) * 30);
float height = (rand() % 450) - 150;
clouds[i].setPosition(-200, height);
cloudsActive[i] = true;
}
else
{
clouds[i].setPosition(clouds[i].getPosition().x + (cloudSpeed[i] * dt.asSeconds()), clouds[i].getPosition().y);
if (clouds[i].getPosition().x > 1920)
{
cloudsActive[i] = false;
}
}
}
在您的代码中,您每次都在 rand 之前进行 srand-ing。您可能每次都使用相同的号码播种,因为调用 srand 之间没有足够的时间来更改号码。调用 rand() 通常确定性地取决于随机种子。这意味着如果您多次调用 rand(),每次将种子设置为相同的数字,您将从 rand() 返回相同的数字。这使得所有的云都获得相同的参数,因此它们显示在彼此之上,并且您只能将它们视为一朵云。要解决此问题,请在程序开头附近仅调用一次 srand()。另外,正如@ColonD 所说,如果您使用的是 C++11 或更新版本,则应该使用 C++ 随机数:https://en.cppreference.com/w/cpp/header/random .
由于代码错误,云并没有消失,它们只是在同一位置。
而不是这个
srand((int)time(0) * 30)
你应该使用
srand((int)time(0)*i * 30)
其中 'i' 是您在循环中声明的号码。
解释 ->
两次循环之间的时间太短,您不能将其用作 int,因此每次将其与不同的数字相乘可以更改种子并修复您的错误。
试图让 4 朵云在屏幕上从左向右移动。当我执行时,我可以看到所有 4 朵云都绘制在代码中给定的位置。但是在游戏开始后,只有一朵云在屏幕上移动;其他 3 个从未出现。
const int NUM_CLOUDS = 4;
Sprite clouds[NUM_CLOUDS];
int position = 0;
主要内容:
Texture textureCloud;
textureCloud.loadFromFile("graphics/cloud.png");
for (int i = 0; i < NUM_CLOUDS; i++)
{
clouds[i].setTexture(textureCloud);
clouds[i].setPosition(0, position);
position += 100;
}
bool cloudsActive[NUM_CLOUDS];
for (int i = 0; i < NUM_CLOUDS; i++)
{
cloudsActive[i] = false;
}
float cloudSpeed[NUM_CLOUDS];
for (int i = 0; i < NUM_CLOUDS; i++)
{
cloudSpeed[i] = 0.0f;
}
for (int i = 0; i < NUM_CLOUDS; i++)
{
if (!cloudsActive[i])
{
srand((int)time(0) * 30);
cloudSpeed[i] = (rand() % 200);
srand((int)time(0) * 30);
float height = (rand() % 450) - 150;
clouds[i].setPosition(-200, height);
cloudsActive[i] = true;
}
else
{
clouds[i].setPosition(clouds[i].getPosition().x + (cloudSpeed[i] * dt.asSeconds()), clouds[i].getPosition().y);
if (clouds[i].getPosition().x > 1920)
{
cloudsActive[i] = false;
}
}
}
在您的代码中,您每次都在 rand 之前进行 srand-ing。您可能每次都使用相同的号码播种,因为调用 srand 之间没有足够的时间来更改号码。调用 rand() 通常确定性地取决于随机种子。这意味着如果您多次调用 rand(),每次将种子设置为相同的数字,您将从 rand() 返回相同的数字。这使得所有的云都获得相同的参数,因此它们显示在彼此之上,并且您只能将它们视为一朵云。要解决此问题,请在程序开头附近仅调用一次 srand()。另外,正如@ColonD 所说,如果您使用的是 C++11 或更新版本,则应该使用 C++ 随机数:https://en.cppreference.com/w/cpp/header/random .
由于代码错误,云并没有消失,它们只是在同一位置。
而不是这个
srand((int)time(0) * 30)
你应该使用
srand((int)time(0)*i * 30)
其中 'i' 是您在循环中声明的号码。
解释 ->
两次循环之间的时间太短,您不能将其用作 int,因此每次将其与不同的数字相乘可以更改种子并修复您的错误。