你必须原谅我,如果我无法解释自己正确,我试图创建一个使用C ++ SFML字符串数组高分表。 我试图分别画他们使用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使用双缓冲 ,和RenderWindow::display
是切换后缓冲器中的命令。 让我们花点时间来讨论这是如何工作:
当你图中的双缓冲系统的内容,你实际绘制到两个单独的表面(“缓冲器”) - 在任何给定时间一个是隐藏的(缓冲器中抽签发生),并示出了一个在屏幕上。 目前用于绘制隐藏缓冲区被称为“后缓冲区”。 当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
因此,循环完成后,您会看到绘制的第一,第三和第五项。 其他人被画为好,但在后缓冲器,他们无法看到存在。
文章来源: c++ sfml array[5] of strings in for loop window.display, only showing line 1,3,5