【问题标题】:Sprite array loop only shows 1 elementSprite 数组循环仅显示 1 个元素
【发布时间】:2021-02-23 16:07:33
【问题描述】:

试图让 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;
      }
   }

}

【问题讨论】:

  • 我不知道是不是这个原因,但你的程序应该只调用一次srand,来为随机数生成器播种。看起来每次您需要随机数时都会重置种子,从而产生相同的随机数。此外,理想情况下,如果您使用 C++11 或更新版本,您还应该使用 C++ 的标准随机库。
  • ...换句话说,您正在显示所有四朵云,但它们都具有相同的位置,因此它们看起来像一朵云,因为它们被绘制在彼此之上。

标签: c++ arrays sprite sfml


【解决方案1】:

由于代码错误,云并没有消失,它们只是在同一位置。

而不是这个

srand((int)time(0) * 30)

你应该使用

srand((int)time(0)*i * 30)

其中 'i' 是您在循环中声明的号码。

解释->

两个循环之间的时间太短,您不能将其用作 int,因此每次将其乘以不同的数字可以更改种子并修复您的错误。

【讨论】:

    【解决方案2】:

    在您的代码中,您每次在 rand 之前都在进行 srand-ing。您可能每次都使用相同的号码播种,因为在调用 srand 之间没有足够的时间来更改号码。调用 rand() 通常取决于随机种子。这意味着如果您多次调用 rand(),每次将种子设置为相同的数字,您将从 rand() 返回相同的数字。这使得所有云都获得相同的参数,因此它们彼此重叠显示,而您只会将它们视为一朵云。要解决此问题,请在程序开始附近仅调用 srand() 一次。此外,正如@ClonD 所说,如果您使用 C++11 或更高版本,则应该使用 C++ 随机数:https://en.cppreference.com/w/cpp/header/random

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多