События SFML не отображаются?

Функция "События" в моей программе SFML не работает. Общая структура main() приведена ниже. Я хочу зарегистрировать последнюю нажатую клавишу и соответственно переключать экраны. Я знаю, что ниже потребуется, чтобы клавиша оставалась нажатой, но даже если тест не работает.

Какой синтаксис мне не хватает? Обучающие программы и примеры кода, которые я видел на форумах, сделали его таким же простым, как показано ниже. Я видел переключение, используемое на кодах клавиш, но это, казалось, больше для мгновенного ответа в видеоиграх.

int main()
{

    srand (time(NULL));

    sf::RenderWindow window(sf::VideoMode(SIZE, SIZE), "Curling Party");

    window.setFramerateLimit(30);

   ...

    while(window.isOpen())
    {

        sf::Event event;

        window.pollEvent(event);

        if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Q)

        {

            window.close();
            break;
        }

        if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::R)

        {


            ...

            window.display();

        }


        if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::B)

        {

            ...

            window.display();

        }

        if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)
        {
           ...
        }


        window.clear(sf::Color::White);

        window.draw(house[0]);
        window.draw(house[1]);
        window.draw(house[2]);
        window.draw(house[3]);

        window.display();

    }

    return 0;

}

1 ответ

Решение

window.pollEvent(event) должен быть в цикле while, как сказано в документации:

Ошибка, которую часто совершают люди, заключается в том, что они забывают о цикле событий просто потому, что им еще не нужно обрабатывать события (вместо этого они используют входные данные в реальном времени). Без цикла событий окно перестает отвечать на запросы. Важно отметить, что цикл обработки событий имеет две роли: в дополнение к предоставлению событий пользователю, он также дает окну возможность обрабатывать свои внутренние события, что необходимо для того, чтобы он мог реагировать на перемещение или изменение размера действий пользователя.

Altought window.display() должен вызываться только в конце цикла окна, вам не нужно отображать окно после каждого нажатия клавиши.

Другие вопросы по тегам