【问题标题】:Is there an alternative to getch(); which won't pause the program?有没有替代 getch();哪个不会暂停程序?
【发布时间】:2017-10-18 12:41:45
【问题描述】:

我正在编写一个当前在 ncurses 中的游戏,我有一艘由用户控制的船和一个“自动”,它会慢慢地沿着线路移动以杀死你。但是,我使用了一个包含所有内容的 while 循环,每次我使用 getch() 时,循环都会暂停并等待输入,这意味着敌人只会在用户输入后才会移动。

        c=getch(); //causes a pause until a button is pressed before the next action

        if(c==97) //if a is pressed, move position of '*' left
        {
            dir=-1;

        }

        if(c==100) //if d is pressed, move position of '*' right
        {
            dir=1;

        }

【问题讨论】:

  • 这个函数的传统名称是 kbhit()。键盘敲击的非黑屏检测,通常用于视频游戏目的。
  • @d9ngle:这不是关于如何使用curses进行非阻塞输入。有了curses,就容易多了。

标签: c linux ubuntu ncurses


【解决方案1】:

由于您正在使用 curses,只需调用 nodelayhalfdelaytimeout 以使 getch 非阻塞,或者如果没有按下任何键,则在短暂等待后返回。请参阅 inopts(3ncurses) 手册页。

【讨论】:

    【解决方案2】:

    在输入文件描述符(0,又名STDIN_FILENO)上使用poll 来确定在调用getch 之前是否存在待处理的输入。通常,您会使用非零超时进行轮询,然后调用加倍作为游戏循环的计时,因此它以您控制的固定滴答速率运行,而不是 cpu/系统负载允许的每秒迭代次数。

    【讨论】:

    • 如果你使用poll()select(),那么你也应该使用非阻塞I/O...
    • @Attie:不一定,而且几乎可以肯定不是诅咒。
    • @R 很有趣,你能解释一下吗?如果您read() 出现在错误的位置或次数过多,那么在使用诅咒时您的应用程序是否仍会阻塞?或者您是否建议每个read() 读取不超过一个字节,并且每个read() 不超过一次poll()/select()
    • 重新阅读手册页后,我怀疑@Chris 的答案更合适(getch() 似乎是窗口感知的),应该采用no-delay 模式来防止阻塞。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多