使用 SFML 绘制多个形状
Drawing multiple shapes using SFML
我想在 C++ 中使用 SFML 库绘制 5 个矩形。当我运行代码只绘制了3个矩形。部分代码如下。声明了一个矩形数组并使用 for 循环,我已经固定了那里的大小。 while循环中的条件语句执行了5次,但我的window中只显示了3个矩形。我的 window 的尺寸是 800 x 1080。我该如何解决?
sf::RectangleShape rect[5] ; //Declaring an array of Rectangles
int i=0, j=50, l=0;
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
while(l<6){
rect[l].setSize(sf::Vector2f(20,20));
rect[l].setPosition(i,j);
window.draw(rect[l]);
window.display();
cout<<l<<endl;
i+=20;
l++;
}
}
您应该将 if 语句替换为在矩形上迭代并显示它们的 for 循环。
您还可以在初始化期间设置矩形位置,而不是每次主循环迭代。
不要忘记也使用 window.clear(sf::Color::Black) 清除 window。
主要问题是每次绘制其中一个矩形时都会调用 window.display();
。这不是必需的,因为 SFML 有一个隐藏的缓冲区来跟踪绘制的内容。更重要的是,这是有问题的,因为 SFML 使用双缓冲。
根据SFML
Calling display is also mandatory, it takes what was drawn since the
last call to display and displays it on the window. Indeed, things are
not drawn directly to the window, but to a hidden buffer. This buffer
is then copied to the window when you call display -- this is called
double-buffering.
之所以有三个矩形,是因为调用 display 会将当前缓冲区复制到 window,然后交换到下一个缓冲区。
- 绘制矩形 1 并显示以显示 1 个矩形并交换到空缓冲区。
- 绘制矩形 2 并显示以显示 1 个矩形并交换到当前有 1 个矩形的缓冲区。
- 绘制矩形 3 并显示以显示 2 个矩形并用 1 个矩形交换到缓冲区。
- 此模式重复 N 个矩形。
如果您使用断点并在每次调用 window.display()
后停止,您可以自己查看。
因此,解决方法是在调用 window.display()
之前绘制所有矩形、形状、文本等。此外,确保使用 window.clear()
.
清除 window 的缓冲区
此外,值得注意的是您只有五个矩形,但您正在迭代 while(l<6)
。这将导致关闭一个错误,并且您访问了一个越界的索引。
#include <SFML/Graphics.hpp>
#include <iostream>
int main()
{
sf::RenderWindow window(sf::VideoMode(600, 400), "SFML works!");
sf::RectangleShape rect[5];
int i = 0, j = 50, l = 0;
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
while (l < sizeof(rect) / sizeof(rect[0])) {
rect[l].setSize(sf::Vector2f(20, 20));
rect[l].setPosition(i, j);
window.draw(rect[l]);
i += 25;
l++;
}
// Reset variables.
l = 0;
i = 0;
// Copy the buffer to the window.
window.display();
}
return 0;
}
我想在 C++ 中使用 SFML 库绘制 5 个矩形。当我运行代码只绘制了3个矩形。部分代码如下。声明了一个矩形数组并使用 for 循环,我已经固定了那里的大小。 while循环中的条件语句执行了5次,但我的window中只显示了3个矩形。我的 window 的尺寸是 800 x 1080。我该如何解决?
sf::RectangleShape rect[5] ; //Declaring an array of Rectangles
int i=0, j=50, l=0;
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
while(l<6){
rect[l].setSize(sf::Vector2f(20,20));
rect[l].setPosition(i,j);
window.draw(rect[l]);
window.display();
cout<<l<<endl;
i+=20;
l++;
}
}
您应该将 if 语句替换为在矩形上迭代并显示它们的 for 循环。
您还可以在初始化期间设置矩形位置,而不是每次主循环迭代。
不要忘记也使用 window.clear(sf::Color::Black) 清除 window。
主要问题是每次绘制其中一个矩形时都会调用 window.display();
。这不是必需的,因为 SFML 有一个隐藏的缓冲区来跟踪绘制的内容。更重要的是,这是有问题的,因为 SFML 使用双缓冲。
根据SFML
Calling display is also mandatory, it takes what was drawn since the last call to display and displays it on the window. Indeed, things are not drawn directly to the window, but to a hidden buffer. This buffer is then copied to the window when you call display -- this is called double-buffering.
之所以有三个矩形,是因为调用 display 会将当前缓冲区复制到 window,然后交换到下一个缓冲区。
- 绘制矩形 1 并显示以显示 1 个矩形并交换到空缓冲区。
- 绘制矩形 2 并显示以显示 1 个矩形并交换到当前有 1 个矩形的缓冲区。
- 绘制矩形 3 并显示以显示 2 个矩形并用 1 个矩形交换到缓冲区。
- 此模式重复 N 个矩形。
如果您使用断点并在每次调用 window.display()
后停止,您可以自己查看。
因此,解决方法是在调用 window.display()
之前绘制所有矩形、形状、文本等。此外,确保使用 window.clear()
.
此外,值得注意的是您只有五个矩形,但您正在迭代 while(l<6)
。这将导致关闭一个错误,并且您访问了一个越界的索引。
#include <SFML/Graphics.hpp>
#include <iostream>
int main()
{
sf::RenderWindow window(sf::VideoMode(600, 400), "SFML works!");
sf::RectangleShape rect[5];
int i = 0, j = 50, l = 0;
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
while (l < sizeof(rect) / sizeof(rect[0])) {
rect[l].setSize(sf::Vector2f(20, 20));
rect[l].setPosition(i, j);
window.draw(rect[l]);
i += 25;
l++;
}
// Reset variables.
l = 0;
i = 0;
// Copy the buffer to the window.
window.display();
}
return 0;
}