2016-12-28 11 views
0

Многие мультимедийные библиотеки на C++ имеют функцию обнаружения состояний клавиатуры. Но эти функции являются дефектными, потому что они только обнаруживают, что удерживается ключ, и посылает постоянный сигнал. Я хочу повернуть функцию, подобную этой, чтобы посылать один импульс сигнала, только когда кнопка нажата сама, а не пока она удерживается после нажатия.Включение функции «isKeyPressed» любой библиотеки в «keyPressedOnce»?

я сделал что-то вроде этого (в псевдокоде):

while isKeyPressed { if not isKeyPressed (exit_loop) } 

Это не эффективно, потому что даже если это работает, это невозможно проверить для других клавиш, в то время как «в то время как» петля работает, и это также задерживает программу в том, как долго удерживается ключ.

Может ли кто-нибудь подумать о лучшем варианте?

(Кстати, я использовал функцию SFML sf::Keyboard::isKeyPressed()).

+0

У вас есть одна петля опроса в вашей программе и оберните ее внутри класса наряду с предыдущими состояниями клавиш. Вы можете заставить его регистрировать обратные вызовы, что угодно ... – LogicStuff

+0

Как я мог сделать это более точно? – KKZiomek

ответ

1

Просто потому, что некоторая библиотека не работает точно так, как вы хотите, не делает ее неисправной. Это может быть намеренно (как в данном случае).

SFML дает вам два различных подхода к получать ввод с клавиатуры (три, если рассматривать sf::Event::TextEntered событие иной подход):

  • Вы можете проверить состояние клавиатуры непосредственно определить, нажата ли клавиша или нет ,
  • Вы можете проверить очередь событий вашего окна, чтобы обнаружить нажатые или отпускаемые клавиши.

В то время как вы использовали первый подход, вы на самом деле хотите использовать второй один:

sf::Event event 
while (window.pollEvent(event) { 
    switch (event.type) { 
     case sf::Event::KeyPressed: 
      std::cout << "down: " << event.key.code << std::endl; 
      break; 
     case sf::Event::KeyReleased: 
      std::cout << "up: " << event.key.code << std::endl; 
      break; 
     // Don't forget to check for other events here 
    } 
} 

Как вы заметите, эти события будут только огонь, как только вы нажмете или отпустите клавишу (если вы не используете sf::Window::setKeyRepeatEnabled(), чтобы изменить это поведение), что точно соответствует тому, что вы ищете.