程序不会在getch中暂停()
我正在为roguelike游戏编写代码,并且这部分代码使用getch()来接受用户输入以指导角色接下来的移动方向。我的理解是,getch()会暂停程序,直到它接收到用户的输入,但是我的代码在到达该行时不会暂停。下面是代码程序不会在getch中暂停()
uint32_t pc_next_pos(dungeon *d)
{
char comm;
comm = getch();
command_move(d, comm);
}
整个程序编译正确,它只是代替暂停程序,让我感动我的性格,它继续走,直到程序终止,一旦在比赛中模具的所有怪物。该代码不包含在内,因为它在此方法中不起作用。
我在这个方法做错了,不允许getch()暂停程序,或者我误解了getch()做了什么?
getch()
可以阻断或非阻塞(或甚至与一个超时阻塞),这取决于输入选项。你想阻止;你得到了非阻塞。问题不在这里,在这个函数中,但在你的curses初始化代码的某个地方(没有显示) - 你可能会调用类似于nodelay(stdscr, TRUE)
或,在initscr()
之后不久。如果没有,您可能需要添加诸如nodelay(stdscr, FALSE)
之类的东西,尽管这应该是默认行为。
你也应该halfdelay()
和cbreak()
(通常是同一个人页面nodelay()
和timeout()
上)读了。
我感觉很傻。问题出现是因为我出于某种原因实际上注释了initscr()。感谢你的回答,我回头看了看那是个问题。现在一切正常。谢谢! – Zebs
您可以更改getch
功能行为调用timeout
:
为人3超时:
的超时和wtimeout程序设置阻断和非阻塞阅读给定的窗口。 如果延迟为负,则使用阻塞读取(即,无限期等待输入)。如果延迟为零,则使用非阻塞读取(即,如果没有输入等待,则读取返回ERR)。如果延迟为正值,则读取块的延迟毫秒数,如果仍然没有输入,则返回ERR。因此,这些例程提供了与nodelay相同的功能,再加上只能延迟几毫秒(延迟为正数)的阻塞功能。
uint32_t pc_next_pos(dungeon *d)
{
char comm;
/* set getch blocking */
timeout(-1);
comm = getch();
command_move(d, comm);
return ....
}
这也将编译(作为OP的确),但没有回答这个问题。 –
您有2个getch()实例。你指的是哪个实例? –
我的歉意,我调整了代码。第二个getch()是为了通信 – Zebs
请检查答案和评论在这里:http://stackoverflow.com/questions/12060572/getch-does-not-pause-the-loop – scorpGoku