【问题标题】:Using _kbhit() and _getch() as input, how do I clear the user's input stream?使用 _kbhit() 和 _getch() 作为输入,如何清除用户的输入流?
【发布时间】:2016-10-21 19:29:02
【问题描述】:

我正在使用控制台在 Windows 上使用 C++ 制作游戏,其中涉及回合制战斗。我正在使用Sleep() 函数来延迟战斗中的消息,然后在按下键时前进。我的问题是,当游戏被睡眠功能“暂停”时,它仍然计算用户的按键,然后开始使用它们。

例如,如果用户在游戏休眠时按了四次“a”键,那么在按下该键很长时间之后,它将继续使用该键四次。

如何暂时“关闭”用户按键向程序注册的功能?

【问题讨论】:

  • 你可以刷新输入流,这里回答:stackoverflow.com/questions/257091/…
  • 当你从暂停中恢复时,只需将队列清空,在 kbhit 为真时继续调用 getch。虽然它引出了一个问题,你如何检测到你应该取消暂停:)

标签: c++ windows


【解决方案1】:

_kbhit()getch() 是缓冲函数。睡眠时输入的所有内容都将发送到缓冲区,并在您的函数唤醒以读取新的 kb 命中后立即按顺序处理。

作为无缓冲的替代方案,您可以考虑使用GetKeyboardState() 来获取特定时刻的键盘状态。它没有缓冲,因此更适合您的游戏。

【讨论】:

    【解决方案2】:

    AFAIK 你不能关闭它,但你可以忽略击键,而是有一个忽略所有击键的循环

    例如

    time_t delay = 10;  // timeout delay
    time_t start = time(NULL); // normally returns seconds
    
    do
    {
      if (_kbhit()) getch();
    }
    while (time(NULL) - start < delay);
    

    当然,您可以在等待循环中执行其他操作,以及检查按下了什么键,然后中断 while 循环。

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多