user3882772
user3882772

Reputation: 149

SFML 2.1 is key pressed

In SFML 2.1 on c++, is there a sf::Keyboard function that checks if any letter in the alphabet being pressed?
I know how to check if a certain key is pressed, like this: if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key))
Do I have to type all this:

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

...all the way to sf::Keyboard::Z,
Or is there an easier way?

Upvotes: 1

Views: 18085

Answers (2)

Conduit
Conduit

Reputation: 2735

From the SFML website:

Many programmers use the KeyPressed event to get user input, and start to implement crazy algorithms that try to interpret all the possible key combinations to produce correct characters. Don't do that!

sf::Keyboard::isKeyPressed is for checking whether a key is pressed, which is good for things like movement: as long as the player is holding the 'left' key down, we wish to keep moving their character left. A KeyPressed event is for checking which key is pressed at the time it is pressed, which is good for things that happen only once: if the player jumps with the spacebar, we typically don't want them to keep jumping as long as the spacebar is held down.

When it comes to checking entered text, though, neither of these solutions are very good. In the official tutorials, we are advised against using these for checking text input - we have actually been given a different event for exactly this type of situation. The appropriate thing to do is to get the text-based contents of the key via the TextEntered event as described here. Get the text from the event then apply the logic you need to ensure its validity, or (if possible) use the text from the event directly.

Upvotes: 7

Nykakin
Nykakin

Reputation: 8747

Here's a solution with a counter increased every time when a letter key is pressed. window.setKeyRepeatEnabled() must be set to false to avoid getting multiple events while pressing a key:

#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;
}

Alternative approach - iterating over 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;
}

Upvotes: 2

Related Questions