使用 SFML 降低向量中的值

Decreasing value in vectors with SFML

我使用带有 SFML 的向量创建了 5 个数字,但我希望第二个数字以 1 秒的间隔一个一个下降。只是,他们前三名一一陨落。我不明白为什么会发生这样的事情。你能帮帮我吗?

if (second == 1)
    {

    random.at(2)-=1;
    cout << random[2] << endl;
    text.setString(to_string(random[2]));
    text.setPosition(numbers[2].getPosition().x, numbers[2].getPosition().y);
    numbers.push_back(text);
    numbers.erase(numbers.begin() + 2);
    clock.restart();


}

The program gif

Full code

我来帮你。

这是正在发生的事情:

  1. 您在 random 数组中创建了 5 个数字。你可能没有注意到,但它们的编号是 0 到 4(SFML 位于 C++ 上,然后这意味着数组在这里从零开始)。
  2. 每一秒,您都会更新 random 数组第 3 位的库存数量。
  3. 然后就出错了:你没有更新numbers数组中的相应数字,而是用push_backerase循环它。

在这里理解我:push_back 在向量的末尾创建一个新元素,而 erase 从向量中删除一个元素然后 "sort out things" 所以没有数字差距向量的索引。

实际上,您正在正确处理 random,但是当您尝试更新 number 时,您会循环执行它。像这样:

seconds:       1 2 3 4 5 6


array content: 0 0 0 0 0 0
  (vertical)   1 1 1 1 1 1
               2 3 4 5 6 7
               3 4 5 6 7 8
               4 5 6 7 8 9

我不确定我说的有多清楚,但是如果您查看数组内容,您会发现通过在末尾擦除并创建一个新值,您正在循环遍历这些位置数组的[2-4]。这就是为什么在你的 gif 中并不是所有的数字都更新错误,只有 3 个。

显而易见的解决方案是停止擦除和推回 numbers 数组。您可以像更新 random 数组一样更新它。会好的。

像这样:

if (second == 1)
    {
    random.at(2)-=1;
    cout << random[2] << endl;
    numbers[2].setString(to_string(random[2]));
    clock.restart(); 
}

玩得开心。