【问题标题】:Drawing multiple shapes using SFML使用 SFML 绘制多个形状
【发布时间】:2020-11-23 13:17:03
【问题描述】:

我想在 C++ 中使用 SFML 库绘制 5 个矩形。当我运行代码时,只绘制了 3 个矩形。部分代码如下。声明了一个矩形数组并使用 for 循环,我已经固定了那里的大小。 while 循环中的条件语句执行了 5 次,但我的窗口中只显示了 3 个矩形。我的窗口大小是 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++;
               }
          }

【问题讨论】:

    标签: c++ graphics sfml


    【解决方案1】:

    主要问题是每次绘制一个矩形时都会调用window.display();。这不是必需的,因为 SFML 有一个隐藏缓冲区来跟踪已绘制的内容。更重要的是,这是有问题的,因为 SFML 使用双缓冲。

    根据SFML

    调用 display 也是强制性的,它需要自 最后调用显示并将其显示在窗口上。的确,事情是 不是直接绘制到窗口,而是绘制到隐藏缓冲区。这个缓冲区 然后在您调用 display 时将其复制到窗口 - 这被称为 双缓冲。

    存在三个矩形,因为调用 display 将当前缓冲区复制到窗口,然后交换到下一个缓冲区。

    1. 绘制矩形 1 并显示以显示 1 个矩形并交换到空缓冲区。
    2. 绘制 Rectangle 2 并显示以显示 1 个矩形并交换到当前具有 1 个矩形的缓冲区。
    3. 绘制矩形 3 并显示以显示 2 个矩形并与 1 个矩形交换到缓冲区。
    4. 此模式重复 N 个矩形。

    如果您使用断点并在每次调用 window.display() 后停止,您可以自己查看。

    因此,解决方法是在调用window.display() 之前绘制所有矩形、形状、文本等。此外,请确保使用window.clear() 清除窗口的缓冲区。

    此外,值得注意的是,您只有五个矩形,但您正在迭代 while(l&lt;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;
    }
    

    【讨论】:

    • 这个程序通过绘制 5 个矩形设法消耗了我 60% 的(不是太慢)CPU。为什么pollEvent?为什么?!使用waitEvent
    【解决方案2】:

    您应该用 for 循环替换您的 if 语句,循环遍历矩形并显示它们。
    您还可以在初始化期间设置矩形位置,而不是每次主循环迭代。
    不要忘记使用 window.clear(sf::Color::Black) 清除窗口。

    【讨论】:

    • while (l
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多