Программирование: Клавиатура,мышь и джойстик в SFML

» Раздел: C++

Оригинал статьи - официальный туториал
Автор перевода - Nerevar

Клавиатура,мышь и джойстик в SFML

Введение

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

Клавиатура

Этот класс предоставляет доступ к состоянию клавиатуры - sf::Keyboard. Он содержит только одну функцию - isKeyPressed, которая проверяет текущее состояние клавиши (нажата или отпущена). Это статическая функция и вам не требуется создавать экземпляр класса sf::Keyboard для её использования.
Эта функция напрямую читает состояние клавиатуры, игнорируя тот факт, является ли окно активным. Это значит, что функция isKeyPressed может вернуть истину, даже если окно не является активным.
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
    // левая стрелка нажата - двигаем нашего персонажа
    character.move(1, 0);
}
Коды клавиш определены в sf::Keyboard::Key.
В зависимости от вашей операционной системы и раскладки клавиатуры, некоторые коды клавиш могут быть неправильно прочитаны. Это то, что будет исправлено в будущей версии SFML.

Мышь

Этот класс предоставляет доступ к состоянию мыши - sf::Mouse. Подобно sf::Keyboard, sf::Mouse содержит только статические функции и обрабатывает только одну мышь одновременно.
Вы можете проверить, нажаты ли кнопки:
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
    // левая кнопка мыши нажата, стреляем!
    gun.fire();
}
Коды кнопок мыши определены в sf::Mouse::Button. SFML поддерживает 5 кнопок : левую, правую, среднюю (колесико), и две дополнительные кнопки, какими бы они ни были.
Вы также можете узнать и изменить текущее положение курсора мыши, относительно рабочего стола или окна:
// получаем глобальную позицию курсора мыши (относительно рабочего стола)
sf::Vector2i globalPosition = sf::Mouse::getPosition();

// получаем локальную позицию курсора мыши (относительно окна)
sf::Vector2i localPosition = sf::Mouse::getPosition(window); // window - это sf::Window

// устанавливаем глобальную позицию курсора мыши (относительно рабочего стола)
sf::Mouse::setPosition(sf::Vector2i(10, 50));

// устанавливаем локальную позицию курсора мыши (относительно окна)
sf::Mouse::setPosition(sf::Vector2i(10, 50), window); // window - это sf::Window
Функция чтения текущего состояния колесика мыши отсутствует. Так как колесико может быть прокручено, оно не имеет исходного состояния, которое можно было бы запросить. Смотря на клавишу, вы можете сказать, нажата она или отпущена. Смотря на курсор мыши вы можете сказать, где на экране она находится. При этом, смотря на колесико мыши, вы не сможете сказать, в каком положении оно находится. Вы только можете заметить, как оно движется с помощью события MouseWheelMoved.

Джойстик

Этот класс предоставляет доступ к состоянию джойстиков - sf::Joystick. Подобно другим классам в этой статье, он содержит только статичные функции.
Джойстики идентифицируются с помощью их индексов (от 0 до 7, так как SFML поддерживает до 8 джойстиков включительно). Таким образом, первым аргументом любой функции sf::Joystick будет индекс джойстика, состояние которого вы хотите запросить.
Вы даже можете проверить, подсоединен ли джойстик:
if (sf::Joystick::isConnected(0))
{
    // джойстик номер 0 подсоединен
    ...
}
Вы также можете проверить возможности подсоединенных джойстиков:
// проверяем, как много джойстик номер 0 имеет кнопок
unsigned int buttonCount = sf::Joystick::getButtonCount(0);

// проверяем, имеет ли джойстик номер 0 ось Z
bool hasZ = sf::Joystick::hasAxis(0, sf::Joystick::Z);
Оси джойстика определены в sf::Joystick::Axis. Так как кнопки не несут определенного назначения, они просто пронумерованы от 0 до 31.
В конце концов, вы даже можете проверить состояние кнопок и осей джойстика:
// нажата ли кнопка 1 на джойстике номер 0?
if (sf::Joystick::isButtonPressed(0, 1))
{
    // кнопка нажата - стреляем!
    gun.fire();
}

// какая позиция осей X и Y на джойстике номер 0?
float x = sf::Joystick::getAxisPosition(0, sf::Joystick::X);
float y = sf::Joystick::getAxisPosition(0, sf::Joystick::Y);
character.move(x, y);
Состояния джойстика автоматически обновляются, когда вы проверяете события. Если вы не проверяете события и хотите проверить состояние джойстика (например, проверить, какие джойстики подсоединены) до начала игрового цикла, вы должны вручную вызвать функцию sf::Joystick::update(), чтобы быть уверенным, что состояния джойстиков не ошибочны.

Просмотров: 3 478

alexprey #1 - 4 года назад 0
Судя по данному туториалу, sfml очень удобная библиотека. Есть ли опыт написания на ней и вправду ли там все так красиво выглядит?
Nerevar #2 - 4 года назад 0
sfml очень удобная библиотека
yes
Есть ли опыт написания на ней и вправду ли там все так красиво выглядит?
да, там все так красиво, как выглядит, я не просто так на ней остановился
alexprey #3 - 4 года назад 0
Nerevar, еще было бы интересно посмотреть на работу с графикой, там такое есть или просто создаешь окошко и потом на нативном OpenGl или DX пишешь?
Nerevar #4 - 4 года назад 2
там можно как напрямую с графическими библиотеками работать, так и с встроенными базовыми возможностями для 2д графики - спрайтами и буферами вершин, про спрайты будет сразу после работы с оглом переведено
ivostrikov #5 - 3 года назад 0
Поотрывал бы руки разработчикам библиотеки за "joystick")))