Qbik-club
Дата публикации:06.06.22 19:14;Автор:Евгений;Категория: программирование;Теги:, ;

SFML обрабтка событий

Сегодня в продолжении темы SFML рассмотрим события, которые можем использовать при работе этой библиотеки. Узнаем, как обрабатывать нажатия клавиш, движения мыши и прочие события, необходимые для любой программы.

SFML обрабтка событий

Что такое события?

И так, для начала давайте разберёмся, что же такое события и зачем они в принципе нужны. В прошлой публикации мы уже создали первую оконную программу. Она у нас ничего не делала, только рисовала кружок на всё окно. Но согласитесь, любая, даже самая простая программа, должна как то взаимодействовать с пользователем. И именно для этого и были придуманы события.

Событием может быть что угодно. Движение мыши, нажатие клавиши на клавиатуре, нажатие клавиши на джойстике, изменение размера окна и ещё много чего. Если помните, в прошлой публикации у нас уже был такой код, который отлавливал событие закрытия окна.

while (window.pollEvent(event)){
  if (event.type == sf::Event::Closed)
  window.close();
}

Так что даже в такой самой простой программке у нас есть одно событие. Теперь давайте представим, что мы создаём игру и нам не хотелось бы, чтоб игра приостанавливалась, когда пользователь отвлекается на другие задачи. Когда окно с нашей игрой теряет фокус — игру останавливаем. Когда окно снова становится активным — продолжаем. Таким образом цикл у нас будет выглядеть так.

while (window.pollEvent(event)){
if (event.type == sf::Event::Closed)
window.close();

else if (event.type == sf::Event::LostFocus)
std::cout << "окно потеряло фокус" << std::endl;

else if (event.type == sf::Event::GainedFocus)
std::cout << "окно вернуло фокус" << std::endl;
}

Как видим мы просто добавили две проверки. На самом деле, на практике, чтоб не раздувать код, эти проверки логичнее вынести в отдельную функцию. Давайте так и сделаем, в итоге функция main() будет выглядеть так.

int main(){
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen()){
        sf::Event event;
        while (window.pollEvent(event)){
            WindowEvent(event, window);
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

Список событий

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

void WindowEvent(sf::Event &event, sf::RenderWindow &window){
    switch (event.type){ // Смотрим, что за событие у нас произошло
    // События с окном
        case sf::Event::Closed:
            std::cout << "Закрыли окно" << std::endl;
            window.close();
            break;

        case sf::Event::Resized:
            std::cout << "Изменили размер окна" << std::endl;
            break;

        case sf::Event::LostFocus:
            std::cout << "окно потеряло фокус" << std::endl;
            break;

        case sf::Event::GainedFocus:
            std::cout << "окно вернуло фокус" << std::endl;
            break;

        // Клавиатура

        case sf::Event::KeyPressed:
        // Вызывается с интервалом, определённым операционной системой до тех пор, пока клавиша нажата
        // Чтобы отменить повторение события - вызываем window.setKeyRepeatEnabled(false)
            std::cout << "Нажали клавишу" << std::endl;
            break;

        case sf::Event::KeyReleased:
            std::cout << "отпустили клавишу" << std::endl;
            break;

        case sf::Event::TextEntered: // Ввод именно символа, который может быть выведен (этим отличается от KeyPressed)
            std::cout << "Введён символ: "  << static_cast<char>(event.text.unicode)<< std::endl;
            break;
        // Мышь

        case sf::Event::MouseMoved: // Событие движения курсора мыши над окном
            std::cout << "Движение по оси x: " << event.mouseMove.x << std::endl;
            std::cout << "Движение по оси y: " << event.mouseMove.y << std::endl;
            break;

        case sf::Event::MouseWheelScrolled: // Движение колёсика мыши
            if (event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel)
                std::cout << "wheel type: vertical" << std::endl;
            else if (event.mouseWheelScroll.wheel == sf::Mouse::HorizontalWheel)
                std::cout << "wheel type: horizontal" << std::endl;
            else
                std::cout << "wheel type: unknown" << std::endl;
                std::cout << "wheel movement: " << event.mouseWheelScroll.delta << std::endl;
                std::cout << "mouse x: " << event.mouseWheelScroll.x << std::endl;
                std::cout << "mouse y: " << event.mouseWheelScroll.y << std::endl;
            break;

        case sf::Event::MouseButtonPressed: // event.mouseButton.button == sf::Mouse::Right - для проверки, какая кнопка мыши нажата
            std::cout << "Клацнули на кнопку мыши" << std::endl;
            break;

        case sf::Event::MouseButtonReleased:
            std::cout << "Отпустили кнопку мыши" << std::endl;
            break;

        case sf::Event::MouseEntered:
            std::cout << "Курсор мыши вошёл в окно" << std::endl;
            break;

        case sf::Event::MouseLeft:
            std::cout << "Курсор мыши покинул окно" << std::endl;
            break;
    }
};

На случай, если вы немного запутались — сохранил для вас готовый код по этой ссылке. Вы можете просто скомпилировать его и запустить для проверки. А на сегодня у меня всё. Надеюсь у Вас всё получилось! Уже в следующей публикации мы научимся играть с окном. Научимся создавать окна различных размеров, с кнопками, без кнопок, полноэкранные и другие. А так же узнаем несколько других хитростей, связанных с созданием окон.

Публикация относится к тематической подборке: «Библиотека SFML»

Цикл публикаций посвящённый библиотеке SFML. Разбираемся с работой этой библиотеки от самых первых шагов до создания простых игр.

Понравилась публикация? Поделись ей с друзьями!

Понравился сайт? Подпишьсь на нас в соцсетях!

Мы в TelegramМы ВконтактеМы в ТвиттерМы на фейсбукМы в одноклассниках
Опубликовать
Загрузка рекомендуемых публикаций