将任何库的“isKeyPressed”函数转换为“keyPressedOnce”?

时间:2016-12-28 15:53:00

标签: c++ input keyboard sfml pseudocode

C ++中的许多多媒体库都具有检测键盘状态的功能。但这些功能是有缺陷的,因为它们只检测是否保持了一个键,并发送一个恒定的信号。我想把这样的函数发送一个信号脉冲,只有当按键被按下时,而不是在按下它后按住它。

我做了类似的事(伪代码):

while isKeyPressed { if not isKeyPressed (exit_loop) }

这是无效的,因为即使它有效,也无法测试其他键,而“while”循环正在工作,并且它还会延迟程序持有密钥的时间。

有人能想到更好的选择吗?

(顺便说一句,我使用了SFML的函数sf::Keyboard::isKeyPressed())。

1 个答案:

答案 0 :(得分: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()更改此行为),这完全符合您的要求。寻找。