程序不会在getch()

时间:2017-03-06 05:07:28

标签: c ncurses getch

我正在为roguelike游戏编写代码,这部分代码使用getch()来获取用户输入以指示角色下一步移动的位置。我的理解是getch()将暂停程序直到它收到用户的输入,但我的代码在到达该行时不会暂停。这是代码

uint32_t pc_next_pos(dungeon *d)
  {
    char comm;
    comm = getch();
    command_move(d, comm);
  }

整个程序编译正确,只是不是暂停程序让我移动我的角色,它会一直持续到程序终止,因为游戏中的所有怪物都会死掉。该代码未包含在内,因为它在此方法中不起作用。

我在这个方法中做错了什么不允许getch()暂停程序,或者我误解了getch()的作用?

2 个答案:

答案 0 :(得分:1)

getch()可能是阻塞或非阻塞(甚至是超时阻塞),具体取决于输入选项。你想要阻止;你得到了非阻塞。问题不在这里,在这个函数中,但是你的curses初始化代码中的某个地方(未显示) - 你可能会调用像nodelay(stdscr, TRUE)或前面提到的timeout()这样的东西,在initscr()之后不久。如果没有,您可能需要添加nodelay(stdscr, FALSE)之类的内容,尽管这应该是默认行为。

您还应该阅读halfdelay()cbreak()(通常与nodelay()timeout()在同一页面上阅读。)

答案 1 :(得分:0)

您可以更改调用getch的{​​{1}}功能行为:

for man 3 timeout:

  

超时 wtimeout 例程为给定窗口设置阻止或非阻塞读取。 如果延迟为负,则使用阻塞读取(即,无限期地等待输入)。如果延迟为零,则使用非阻塞读取(即,如果没有输入正在等待,则读取返回ERR)。如果延迟为正,则读取块延迟毫秒,如果仍然没有输入则返回ERR。因此,这些例程提供与nodelay相同的功能,以及能够仅阻止延迟毫秒(其中延迟为正)的附加能力。

timeout