【问题标题】:Debounce user input in c++在 C++ 中去抖用户输入
【发布时间】:2016-11-27 11:05:02
【问题描述】:

我们在学校有一个项目,将排球编码 - 比赛作为控制台应用程序。 我们应该为团队和分数等进行输入输出,并将键绑定到 Team1-score+1、Team2-score-1 等。这很好。我们使用 getch() 来绑定这些键。 我的问题:例如,如果您按 R 并且 R 是 Team1-score+1 并按住此键,它将继续添加分数+1,我们应该停止它,因此如果您想添加另一个点,您需要再次按 R . 我在任何地方都没有找到这个解决方案! 谁能举例说明如何解决它? 我是编码新手,所以我没有经验。 谢谢你们的帮助! 编辑:我使用的是 Windows 10,我的代码的重要部分:

while (true)
{
    _kbhit();
    char L = _getch();
    if (L == 114)
    {
        score1 = score1 + 1;
    }
    else if (L == 99)
    {
        score1 = score1 - 1;
    }
    else if (L == 117)
    {
        score2 = score2 + 1;
    }
    else if (L == 110)
    {
        score2 = score2 - 1;
    }
    else if (L == 113)
    {

L=="number" 是按钮 r,u,c,n,q 的 ASCII 码

【问题讨论】:

  • 提出此类问题的聪明方法是包含您当前用于处理键盘输入的代码,并询问应如何修改它以支持所需的行为。另请参阅minimal reproducible example

标签: c++ c


【解决方案1】:

getch()stdio 上运行,这实际上只是来自/进入操作系统的字节流。它没有“按键/释放”的概念。当您按住某个键时,操作系统将开始自动重复按下的字符。更糟糕的是,如果您按住一个键,然后再按另一个键,则第一个键的重复将停止。

现在有种方法来获取原始按键按下/向上事件,但这些方法涉及操作系统特定的编程接口;你没有告诉我们你使用的是哪个操作系统,所以这有点猜测。在控制台中做你想做的事情是有可能的,但使用起来很尴尬。对于 Windows,请参见 C++ console keyboard events,对于 Linux,请参见 Receiving key press and key release events in Linux terminal applications?

但是,我强烈建议您甚至不要尝试实现所有操作系统级别的关键事件接口,而是使用一个跨平台库,该库提供了一个框架来执行您想要在其中执行的操作。如今,使用最广泛的框架之一是 SDL http://libsdl.org/——不过,它会让你离开控制台(当涉及到游戏时:很好摆脱,除非你正在开发类似 rouge 的游戏)。

【讨论】:

    【解决方案2】:

    如果您使用的是控制台,那么大多数操作系统会在您按下某个键后等待一秒钟,然后再次注册该按键。你现在可以试试:按下键盘上的一个键,看看会有什么反应。

    确保某人不会意外按两次键是操作系统负责处理的问题,否则每个接受键盘输入的应用程序都需要编写自己的解决方案来解决问题。

    如果您想比操作系统更进一步,您可以在程序中使用带有 chrono 库的计时器,然后等待 n 秒,然后再允许再次注册输入。

    【讨论】:

    • 如何使用这个计时器来允许在 n 秒后再次获取用户输入?我的代码如下所示: while (true) { _kbhit();字符 L = _getch(); if (L == 114) { score1 = score1 + 1; } 等等..
    • 首先,使用L = 'r',因为它比L = 114更容易理解,并且可能选择比L更好的名称。其次,要等待 4 秒,你可以这样做:std::this_thread::sleep_for( 4s );。您也可以只写score1++score1 += 1 而不是score1 = score1 + 1
    • 感谢您的建议,但 std::this_thread::sleep_for( 4s );停止整个 _getch() 并且您必须等待 4 秒才能给出另一条指令,如果您想添加分数 +1 或 -1 等都无所谓,并且它不会消除按下的键
    • 这就是为什么你在处理完 getch 之后在你的 while 循环中使用它。
    • 我不明白你的意思,你能举个例子吗?
    猜你喜欢
    • 2019-12-14
    • 2013-03-10
    • 2016-07-17
    • 2019-03-01
    • 2018-05-15
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多