我已尝试使用输入和我的一秒计时器的各种设置,但没有任何工作。当到达要求输入的部分时,整个代码停止。我有一个无缓冲的流,所以我不需要按回车发送输入。此外,这个目的是为了我正在设计终端使用的pac-man游戏。我想要的基本上是有一秒间隔,用户可以输入命令。如果没有输入命令,我希望pac-man继续移动上次输入命令时移动的方向。
编辑:
time_t startTime, curTime;
time(&startTime);
do
{
input=getchar();
time(&curTime);
} while((curTime - startTime) < 1);
答案 0 :(得分:2)
您可以尝试使用alarm()
(或类似的计时器功能)来抛出并让您的应用程序捕获SIGALRM
,尽管这对于PacMac来说肯定是有点过分。考虑使用单独的线程(POSIX线程)来控制计时器。
答案 1 :(得分:1)
在Unix上,您可以在标准输入文件描述符(STDIN_FILENO或fileno(stdin))上使用select或poll并超时。我不会为此引入由信号和线程构成的鼠标陷阱。
答案 2 :(得分:0)
您可以使用非阻塞输入函数,例如getch(),但它不是非常跨平台兼容。
理想情况下,您应该使用事件来更新游戏状态,具体取决于您所针对的操作系统,您可以使用操作系统事件进行按键操作,也可以使用SDL等库。
答案 3 :(得分:0)
我的直觉告诉了我:
确保您对队列的访问是同步的。
// I/O Thread:
while (!stop) {
input = getchar();
lock_queue();
queue.push_back(input);
unlock_queue();
}
// Timer Thread:
while (!stop) {
lock_queue();
if (queue.size() == 0) {
action = DEFAULT_ACTION;
} else {
// either handle multiple key events somehow
// or use the last key event:
action = queue.back();
queue.clear();
}
unlock_queue();
perform_action(action);
sleep();
}
完整示例发布为Github Gist。