2014-09-20 2 views
1

В SFML 2.1 на C++ существует ли функция sf :: Keyboard, которая проверяет, нажата ли буква в алфавите?
Я знаю, как проверить, если определенная клавиша нажата, как это: if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key))
Должен ли я набирать все это:SFML 2.1 нажата клавиша

if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)&&sf::Keyboard::isKeyPressed(sf::Keyboard::B)&&sf::Keyboard::isKeyPressed(sf::Keyboard::C)) 

... все пути к sf::Keyboard::Z,
Или есть проще?

+0

Кажется, что нет способа получить состояние клавиатуры, например, SDL. Я бы использовал события и либо простой «bool», чтобы каждый раз менять ключ события в A-Z, либо вектор из 26 'bool', чтобы отслеживать каждый ключ в A-Z. – Nelfeal

ответ

5

С сайта SFML:

Многие программисты используют событие KeyPressed для входа пользователя и начинают реализовывать сумасшедшие алгоритмы, которые пытаются интерпретировать все возможные комбинации клавиш для создания правильных символов. Не делай этого!

sf::Keyboard::isKeyPressed для проверки, является ли нажата клавиша, которая хороша для таких вещей, как движения: до тех пор, пока игрок держит клавишу «влево» вниз, мы хотим продолжать двигаться их символ влево. Событие KeyPressed предназначено для проверки того, какая клавиша нажата в момент ее нажатия, что хорошо для вещей, которые происходят только один раз: если игрок прыгает с помощью пробела, мы обычно не хотим, чтобы они продолжали прыгать, пока пробел удерживается.

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

1

Это решение с счетчиком увеличивается каждый раз, когда нажимается буква. window.setKeyRepeatEnabled() должен быть установлен в ложь, чтобы избежать нескольких событий, нажимая клавишу:

#include <SFML/Graphics.hpp> 
#include <iostream> 

int main() { 
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML"); 
    int keyCounter = 0; 

    window.setKeyRepeatEnabled(false); 
    while (window.isOpen()) { 
     sf::Event event; 
     while (window.pollEvent(event)) { 
      if (event.type == sf::Event::Closed) { 
       window.close(); 
      } 
      else if(event.type == sf::Event::KeyPressed) { 
       if(event.key.code >= sf::Keyboard::A && event.key.code <= sf::Keyboard::Z) { 
        keyCounter++; 
       } 
      } else if(event.type == sf::Event::KeyReleased) { 
       if(event.key.code >= sf::Keyboard::A && event.key.code <= sf::Keyboard::Z) { 
        keyCounter--; 
       }     
      } else if(event.type == sf::Event::MouseMoved) { 
       /* move cursor inside the window to observe how the counter 
        behaves while pressing the keys */ 
       std::cout << keyCounter << std::endl; 
      } 
     } 

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

    return 0; 
} 

Альтернативный подход - итерация enum:

#include <SFML/Graphics.hpp> 
#include <iostream> 

int main() { 
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML"); 

    while (window.isOpen()) { 
     sf::Event event; 
     while (window.pollEvent(event)) { 
      if (event.type == sf::Event::Closed) { 
       window.close(); 
      } else if(event.type == sf::Event::MouseButtonPressed) { 
       /* click inside window to see if there is key pressed */ 
       bool isp = false; 
       for (int i = sf::Keyboard::A; i <= sf::Keyboard::Z; ++i) { 
        if(sf::Keyboard::isKeyPressed(static_cast<sf::Keyboard::Key>(i))) { 
         isp = true; 
         break; 
        } 
       } 
       std::cout << isp << std::endl; 
      } 
     } 

     window.clear(); 
     window.display(); 
    } 
    return 0; 
} 
+0

Да, спасибо. Есть ли более простой способ? – user3882772

+0

@ user3882772, я добавил другое решение. – Nykakin

+0

Использование магического значения 0 - 25 неверно, потому что у вас нет гарантии, что всегда будут эти значения. – Hiura

Смежные вопросы