如何在c中轮询键盘输入?
我正在尝试为unix终端制作一个简单的游戏,用c编写。我已经 一直在寻找一种方法来调查键盘,但没有任何运气 目前我正在使用ncurses getch()函数。它可以正常工作,但如果用户按住一个键,键盘重复将需要一段时间才能开始-如果按下任何其他键,它也将停止。这会导致玩游戏时出现问题(特别是在两人模式下,两个游戏都由一个输入线程控制) 例如,如果播放器1按下“a”,播放器2按下“b”,我需要轮询键盘并处理如下输入流:如何在c中轮询键盘输入?,c,ncurses,C,Ncurses,我正在尝试为unix终端制作一个简单的游戏,用c编写。我已经 一直在寻找一种方法来调查键盘,但没有任何运气 目前我正在使用ncurses getch()函数。它可以正常工作,但如果用户按住一个键,键盘重复将需要一段时间才能开始-如果按下任何其他键,它也将停止。这会导致玩游戏时出现问题(特别是在两人模式下,两个游戏都由一个输入线程控制) 例如,如果播放器1按下“a”,播放器2按下“b”,我需要轮询键盘并处理如下输入流: abababababababab aaaaaaabaaaaa
abababababababab
aaaaaaabaaaaaaaa
作为另一个例子,如果播放器1按住“a”键并同时按下“b”键,我需要如下处理输入:
abababababababab
aaaaaaabaaaaaaaa
这样,同时按下的按键不会相互中断。因此,我基本上需要按设定的间隔轮询键盘上的键,并创建自己的按键重复器实现
在c语言中,有没有一种方法(带或不带ncurses)可以简单地按时间间隔轮询键盘并读入当前正在按下的所有键?从那里我可以设计键盘输入线程来手动管理重复操作。基本上是kbhit,所以我可以检查给定键的状态。但这也可以让我轮询箭头键。这样做不起作用:
基本上是类似于kbhit的东西,因此我可以检查给定密钥的状态。但这也将让我投票的箭头键
在任何不允许直接访问硬件的系统中(MS-DOS是您可能遇到的唯一示例,其他系统可能包括嵌入式系统),您只能在终端应用程序中读取字符序列(而不是键)。GUI应用程序依赖于一台服务器,该服务器可以直接访问某些硬件(更多),但可以转换数据
在终端(如ncurses使用的终端)中,您只能检查传入的字符是否包括与您感兴趣的键盘键对应的字符。箭头键发送字符序列:使用ncurses,您可以读取序列中的单个字符,或者依靠ncurses将序列与终端描述中的已知键相匹配
即使使用特定于系统的东西,例如Linux控制台,您也不会发现对整个键盘的读取有太多支持:只支持字符事件。阅读并查看可用内容,记住后者的古老警告:
警告:不要将此手册页视为Linux的文档
控制台ioctls。这只提供给好奇的人,作为
阅读源代码的替代方法。Ioctl是未记录的Linux
内部构件,可在没有警告的情况下进行更改。(事实上
页面或多或少地描述了内核版本的情况
;与其他人有许多细微的差别
早期版本。)
建议的链接提供了一些有用的信息。但如前所述,这个问题(除了最后提到的一点)是一个可能有用的问题:您知道这在很大程度上取决于所使用的硬件吗?有些键盘无法处理这些类型的按键,键盘控制器只会发送发送到计算机的第一个键?对,但必须有一种方法来轮询特定键-然后对于我需要的每个键,我可以一个接一个地轮询。类似于:
为true时,poll('a')、poll('b')、poll('c')、doactions()