【问题标题】:Program won't pause at getch()程序不会在 getch() 处暂停
【发布时间】:2017-03-06 05:07:28
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c ncurses getch


【解决方案1】:

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

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

【讨论】:

  • 我觉得自己很傻。问题来了,因为我实际上出于某种原因注释掉了 initscr() 。感谢您的回答,我回头一看,发现这就是问题所在。现在一切正常。谢谢!
【解决方案2】:

你可以改变getch函数调用timeout的行为:

对于 man 3 超时:

timeoutwtimeout 例程设置给定窗口的阻塞或非阻塞读取。 如果延迟为负,则使用阻塞读取(即无限期等待输入)。如果延迟为零,则使用非阻塞读取(即,如果没有输入等待,则读取返回 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 一样),但不回答问题。
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多