【问题标题】:If there isn't a keyboard input for a set amount of time skip needing input如果在设定的时间内没有键盘输入,则跳过需要输入
【发布时间】:2013-12-07 04:06:46
【问题描述】:

我正在尝试获取键盘输入,但如果它在大约半秒内没有发生,我希望它继续循环的其余部分。我尝试使用 kbhit();但它不会等待输入,它只是不停地循环。这是有问题的循环:

    while(flags)
{
    gameing.updateDraw(0, 0);
    keyIn = getch();
    //Sleep(20);
    switch(keyIn)
    {
        case UP_ARROW:
                flags = gameing.updateDraw(-1, 1);
                break;
        case DOWN_ARROW:
                flags = gameing.updateDraw(1, 1);
                break;
        case WKEY:
                flags = gameing.updateDraw(-1, 2);
                break;
        case SKEY:
                flags = gameing.updateDraw(1, 2);
                break;
    }

我们将不胜感激所有帮助。我试图避免使用 alarm();

【问题讨论】:

    标签: c++ keyboard skip getch


    【解决方案1】:

    Sleep 的注释调用表明这是一个使用<conio.h> 功能的Windows 程序,而不是一个使用curses 的*nix 程序。

    通过<conio.h>可以使用kbhit函数来检查是否有按键。

    将它放在一个循环中,在每次调用之间休眠一点。

    您可以使用更高级的 Windows API。它的等待函数可以在控制台句柄上等待,具有指定的超时时间。

    C++ 标准库没有无缓冲键盘输入功能。

    【讨论】:

    • 感谢您的帮助。我想出了一个使用 kbhit 的好方法 while(flags) { keyIn = 0; gameing.updateDraw(0, 0);睡眠(100); if(_kbhit()) 与此相比,时间太多了,至于 Alf 的回答,我将您的回答解释为仅使用 kbhit 而不是 getch(),并且 kbhit 仅返回按下了一个键而不是按下了什么键.
    【解决方案2】:

    尝试使用 ctime.h 或 chrono 之类的东西来获取时差。然后做类似的事情

    long lastTime=CurrentTime();
    int input=0;
    while(!(input=kbhit()) && CurrentTime()-lastTime < 20);
    if(input)
        // do stuff with input
    // do all the other stuff
    lastTime=CurrentTime();
    

    免责声明。我对 kbhit 之类的东西不是特别熟悉,但是基于一些谷歌搜索,这似乎应该可以工作。 CurrentTime 的实现也取决于您,它不必很长或任何东西,我只是为了简单起见而选择了它。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2016-12-12
      • 2013-04-04
      • 1970-01-01
      相关资源
      最近更新 更多