我正在为roguelike游戏编写代码,这部分代码使用getch()来获取用户输入以指示角色下一步移动的位置。我的理解是getch()将暂停程序直到它收到用户的输入,但我的代码在到达该行时不会暂停。这是代码
uint32_t pc_next_pos(dungeon *d)
{
char comm;
comm = getch();
command_move(d, comm);
}
整个程序编译正确,只是不是暂停程序让我移动我的角色,它会一直持续到程序终止,因为游戏中的所有怪物都会死掉。该代码未包含在内,因为它在此方法中不起作用。
我在这个方法中做错了什么不允许getch()暂停程序,或者我误解了getch()的作用?
答案 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