SFML 2.1是关键压力

时间:2014-09-20 19:17:42

标签: c++ keyboard sfml

在c ++的SFML 2.1中,是否有一个sf :: Keyboard函数检查字母表中是否有任何字母被按下?
我知道如何检查某个键是否被按下,如下所示: if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key))
我必须输入所有这些:

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

......一直到sf::Keyboard::Z
或者有更简单的方法吗?

2 个答案:

答案 0 :(得分:5)

来自SFML网站:

  

许多程序员使用KeyPressed事件来获取用户输入,并开始实现疯狂算法,尝试解释所有可能的键组合以生成正确的字符。别这么做!

sf::Keyboard::isKeyPressed用于检查按键是否被按下,这对于移动之类的事情是有益的:只要玩家持有“左”键。关键,我们希望继续保持他们的性格。 KeyPressed事件用于检查在按下时按下哪个键,这对于仅发生一次的事情是有益的:如果玩家跳过空格键,我们通常不希望他们保留只要空格键被按下就会跳跃。

但是,在检查输入的文本时,这些解决方案都不是很好。在官方教程中,我们建议不要使用这些来检查文本输入 - 我们实际上已经针对这种情况给出了不同的事件。要做的恰当是通过TextEntered事件as described here获取密钥的基于文本的内容。从事件中获取文本然后应用您需要的逻辑以确保其有效性,或者(如果可能)直接使用事件中的文本。

答案 1 :(得分:1)

这是每次按下字母键时计数器增加的解决方案。必须将window.setKeyRepeatEnabled()设置为false,以避免在按键时出现多个事件:

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