Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c中轮询键盘输入?_C_Ncurses - Fatal编程技术网

如何在c中轮询键盘输入?

如何在c中轮询键盘输入?,c,ncurses,C,Ncurses,我正在尝试为unix终端制作一个简单的游戏,用c编写。我已经 一直在寻找一种方法来调查键盘,但没有任何运气 目前我正在使用ncurses getch()函数。它可以正常工作,但如果用户按住一个键,键盘重复将需要一段时间才能开始-如果按下任何其他键,它也将停止。这会导致玩游戏时出现问题(特别是在两人模式下,两个游戏都由一个输入线程控制) 例如,如果播放器1按下“a”,播放器2按下“b”,我需要轮询键盘并处理如下输入流: abababababababab aaaaaaabaaaaa

我正在尝试为unix终端制作一个简单的游戏,用c编写。我已经 一直在寻找一种方法来调查键盘,但没有任何运气

目前我正在使用ncurses getch()函数。它可以正常工作,但如果用户按住一个键,键盘重复将需要一段时间才能开始-如果按下任何其他键,它也将停止。这会导致玩游戏时出现问题(特别是在两人模式下,两个游戏都由一个输入线程控制)

例如,如果播放器1按下“a”,播放器2按下“b”,我需要轮询键盘并处理如下输入流:

    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()