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

Введение

Этот урок объясняет как получить доступ к глобальным ресурсам (global inputs): клавиатуре, мыши и джойстику. Не следует путать их с событиями: ресурсы в режиме реального времени позволяют запросить глобальные состояния клавиатуры, мыши и джойстика в любое время («Эта кнопка нажата в данный момент?», «Где мышь?»). В то время как события уведомляют вас когда что-то происходит («Эта кнопка была нажата», «Мышь переместилась»).

Клавиатура

Класс, предоставляющий доступ к состоянию клавиатуры, — sf::Keyboard. Он содержит только один метод isKeyPressed(), который проверяет текущее состояние клавиши (нажата или отпущена). Это статический метод, и поэтому вам не нужно создавать экземпляр класса sf::Keyboard что бы воспользоваться им.

Эта функция напрямую считывает состояние клавиатуры игнорируя факт, что ваше окно активно или неактивно.

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 кнопок мыши: левая, правая, средняя (колёсико), дополнительная #1 и дополнительная #2 (боковые кнопки).

Вы также можете получить и установить положение мыши, либо относительно окна, либо относительно экрана монитора.

// получить глобальную позицию мыши (относительно экрана)
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

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

Джойстик

 Класс, предоставляющий доступ к состоянию джойстика, — 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() для того, что бы быть уверенным в актуальном состоянии джойстика.

6 Комментарии

  1. Павел

    Помоги пожалуйста, подробнее объясни про нажатия мыши, если честно я ни чего не понял из того что ты там написал.

    1. samuel_unknown (Автор записи)

      Вот абсолютно рабочий пример:

      sf::Event event;
       
      // пока имеются события в очереди...
      while (window.pollEvent(event))
      {
      	// проверяем была ли нажата левая кнопка мыши
      	if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
      		// сообщаем о том что нажата левая кнопка
              	std::cout < < "Left button";
      	}
      }
      

      Задавай более конкретные вопросы, а то мне непонятно, что именно тебе не понятно :)

  2. Никита

    Где найти список всех клавиш?

    1. samuel_unknown (Автор записи)
  3. Роман

    Как узнать на каком месте я кликнул мышь? Мне нужно при нажатии на определенный тайл его повернуть. Как узнать на какой именно я нажал?

    1. samuel_unknown (Автор записи)

      Вы как-то невнимательно читали видимо)) там же есть метод для получения позиции мыши..

      sf::Vector2i globalPosition = sf::Mouse::getPosition(); // глобальная позиция
      sf::Vector2i localPosition = sf::Mouse::getPosition(window); // локальная
      

      Сравнивайте координаты тайла и координаты мышки по событию клика, если координаты мыши попадают в нужную область — поворачивайте. :)

Добавить комментарий для Павел Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Капча * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.