for 循环 window.display 中字符串的 c++ sfml 数组 [5],仅显示第 1、3、5 行

c++ sfml array[5] of strings in for loop window.display, only showing line 1,3,5

如果我无法正确解释自己,您将不得不原谅我,我正在尝试使用 C++ sfml 字符串数组创建高分 table。我尝试使用 window.draw(array[1],array[2] 等分别绘制它们。

但是如果我将数组放在 for 循环中并使用 int 变量,它只会绘制数组 1、3 和 5。

for(cnt = 0;cnt <5;cnt++)
    {
        thiswindow.draw(topscores[cnt]);
        thiswindow.draw(topnames[cnt]);
        thiswindow.display();
    }

将显示从循环中取出。这应该可以解决问题。

如 Rosme 所述,不应在循环内调用 RenderWindow::display。实际上,RenderWindow::display 每帧渲染内容只应调用一次...SFML 使用 double buffering,而 RenderWindow::display 是切换后台缓冲区的命令。让我们花点时间讨论一下这是如何工作的:

当您在双缓冲系统中绘制内容时,您实际上绘制到两个单独的表面 ("buffers") - 在任何给定时间,一个被隐藏(绘图发生的缓冲区),一个被显示屏幕上。当前用于绘图的隐藏缓冲区称为 "back buffer"。当调用 RenderWindow::display 时(或其他双缓冲系统中的等效项),当前显示在屏幕上的缓冲区成为新的后备缓冲区,而旧的后备缓冲区显示在屏幕上。这使您可以进行大量更改,同时降低弹出、撕裂或闪烁的风险 - 您永远不会绘制到正在显示的缓冲区。

有了这些知识,您应该了解循环内显示调用的结果是什么:

instruction  |  back buffer  |  front buffer (shown)
----------------------------------------------------
             |  (empty)      |  (empty)
draw A       |  A            |  (empty)
display      |  (empty)      |  A
draw B       |  B            |  A
display      |  A            |  B
draw C       |  A, C         |  B
display      |  B            |  A, C
draw D       |  B, D         |  A, C
display      |  A, C         |  B, D
draw E       |  A, C, E      |  B, D
display      |  B, D         |  A, C, E

因此,在循环完成后,您会看到绘制的第一个、第三个和第五个项目。其他的也被绘制,但是存在于后台缓冲区中看不到它们。