Рисование нескольких фигур с помощью SFML - PullRequest
1 голос
/ 03 августа 2020

Я хочу нарисовать 5 прямоугольников с помощью библиотеки SFML на C ++. Когда я запускаю код, рисуется только 3 прямоугольника. Часть кода ниже. Объявлен массив прямоугольников, и, используя для l oop, я зафиксировал его размер. Оператор conditonal в while l oop выполняется 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++;
               }
          }

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Основная проблема в том, что вы вызываете window.display(); каждый раз, когда рисуете один из прямоугольников. В этом нет необходимости, потому что SFML имеет скрытый буфер, который отслеживает, что было нарисовано. Что еще более важно, это проблема c, потому что SFML использует двойную буферизацию.

Согласно SFML

Отображение вызова также является обязательным, требуется то, что было нарисовано с момента последнего вызова для отображения и отображает его в окне. Действительно, вещи рисуются не непосредственно в окне, а в скрытом буфере. Затем этот буфер копируется в окно, когда вы вызываете display - это называется двойной буферизацией.

Есть три прямоугольника, потому что вызов display копирует текущий буфер в окно, а затем переключается на следующий буфер.

  1. Нарисуйте прямоугольник 1 и отобразите, чтобы отобразить 1 прямоугольник и переключиться на пустой буфер.
  2. Нарисуйте прямоугольник 2 и отобразите, чтобы отобразить 1 прямоугольник и переключиться на буфер, который в настоящее время имеет 1 прямоугольник.
  3. Нарисуйте прямоугольник 3 и отобразите, чтобы отобразить 2 прямоугольника и переключиться на буфер с 1 прямоугольником.
  4. Этот шаблон повторяется для количества прямоугольников N.

Если вы используете точку останова и останавливаетесь после каждого вызова window.display(), вы можете увидеть это сами.

Таким образом, исправление состоит в том, чтобы нарисовать все ваши прямоугольники, фигуры, текст и т. Д. c перед позвонив на 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;
}
0 голосов
/ 03 августа 2020

Вы должны заменить ваш оператор if на for l oop итерацию по прямоугольникам и их отображение.
Вы также можете установить позиции прямоугольников во время их инициализации вместо каждой основной l oop итерации.
Не забудьте также очистить окно с помощью window.clear (sf :: Color :: Black).

...