только window.display () переключает между последним и текущим отображаемым буфером - PullRequest
0 голосов
/ 26 мая 2018

Я сделал этот код, который показывает таймер и делает паузу при нажатии пробела:

#include <SFML/Graphics.hpp>
#include <iostream>

using namespace sf;
using namespace std;
void events();

bool pause, exitPause;
char key;
double timeFrame, timeTot = 0;
Clock timer;
Text text;
Font font;

RenderWindow window(VideoMode(800, 600), "Window", Style::Close);

int main()
{
    font.loadFromFile("C:/Windows/Fonts/arial.ttf");
    text.setFont(font);
    text.setCharacterSize(15);
    window.setFramerateLimit(120);
    while (window.isOpen())
    {
        for (Event event; window.pollEvent(event);) {
            if (event.type == Event::Closed)
                window.close();
            if (event.type == Event::TextEntered) {
                key = std::tolower(static_cast<char>(event.text.unicode));
                if (key == ' ') {
                    pause = !pause;
                    if (!pause) {
                        timer.restart();
                    }
                }
            }
        }
        if (!pause) {
            timeFrame = timer.restart().asSeconds();
            timeTot += timeFrame;
            text.setString(to_string(timeTot));
            window.clear();
            window.draw(text);
        }
        window.display();
    }
}

Если вы протестируете, вы увидите что-то любопытное.При паузе нажатием пробела window.display чередует последнее и текущее отображаемое число.

Но если я поставлю window.clear и window.draw вместе с window.display, проблема не произойдет.

        if (!pause) {
            timeFrame = timer.restart().asSeconds();
            timeTot += timeFrame;
            text.setString(to_string(timeTot));
        }
        window.clear();
        window.draw(text);
        window.display();

Я думал, что только в windows.display будет показан только последний буфер.В чем проблема?

1 Ответ

0 голосов
/ 26 мая 2018

В тот момент, когда вы останавливаетесь, вы прекращаете обновлять буферы рисования.SFML всегда с двойной буферизацией, и в каждой итерации вы всегда должны анализировать ввод, обновлять все, что нужно обновить, перерисовывать «скрытый» фрейм и затем переворачивать буферы.По сути, это паттерн "Game Loop".

В вашем коде вы всегда анализируете ввод, обновляете таймер и состояние паузы, основываясь на этом, и вы всегда переворачиваете буферы (с window.display()).Однако вы перерисовываете «скрытый» буфер кадра только в том случае, если состояние не приостановлено.

Итак, вы видите ожидаемый результат и нашли правильное решение.

В стороне,в вашем коде действительно есть несколько стилевых проблем, включая неинициализированные переменные, которые всегда опасны в C ++.

...