2017-03-06 113 views
0

我正在为roguelike游戏编写代码,并且这部分代码使用getch()来接受用户输入以指导角色接下来的移动方向。我的理解是,getch()会暂停程序,直到它接收到用户的输入,但是我的代码在到达该行时不会暂停。下面是代码程序不会在getch中暂停()

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

整个程序编译正确,它只是代替暂停程序,让我感动我的性格,它继续走,直到程序终止,一旦在比赛中模具的所有怪物。该代码不包含在内,因为它在此方法中不起作用。

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

+1

您有2个getch()实例。你指的是哪个实例? –

+0

我的歉意,我调整了代码。第二个getch()是为了通信 – Zebs

+0

请检查答案和评论在这里:http://stackoverflow.com/questions/12060572/getch-does-not-pause-the-loop – scorpGoku

回答

1

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

你也应该halfdelay()cbreak()(通常是同一个人页面nodelay()timeout()上)读了。

+0

我感觉很傻。问题出现是因为我出于某种原因实际上注释了initscr()。感谢你的回答,我回头看了看那是个问题。现在一切正常。谢谢! – Zebs

0

您可以更改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 .... 
    } 
+0

这也将编译(作为OP的确),但没有回答这个问题。 –