ncurses应用程序中的sleep()

时间:2012-03-18 03:38:08

标签: c sleep ncurses

我正在尝试为ncurses中的应用程序制作文本动画

用户按下一个键,选择一个方向,文本网格中的一个对象应该从网格的一个单元格移动到给定方向的下一个单元格,等待它移动前500ms。我使用的代码是

while (!checkcollisions(pos_f, input)) { // Checks if it can move to next grid
    pos_f = moveobject(pos_f, input, ".."); // Moves object to next cell
    usleep(50000);
}

但是当我执行它时,它不是移动,等待和再次移动,而是等待很长时间,并且对象突然出现在网格的最后一个单元格中,而没有显示动画。 / p>

这是因为ncurses如何工作?我已经尝试过使用其他解决方案,比如select()停止功能。

3 个答案:

答案 0 :(得分:7)

您需要致电refresh()usleep之前)。


更新:新的粘贴码代码段(在几条评论中)指向真正的问题,与ncurses-refresh中的内容相同:混合stdscr(由后两个调用隐含)和getch以及refreshnewwinwrefresh混合。
更新2:使用完整的代码,再加上一些黑客攻击,我得到了它的工作(对于某些“工作”的价值,我显然没有正确地调用printmap(),我编造了一个虚假的“地图” “文件)。

如果不仔细观察,我只是将所有getch()更改为wgetch(win.window),将所有mvprintw次调用更改为mvwprintw(使用相同的窗口),并至少删除一个不需要的getch / wgetch。然后是问题的核心:

                while (!checkcollisions(pos_f, input)) {
-                       pos_f = moveobject(pos_f, input, "..");
-                       // sleep + wrefresh(win.window) doesn't work, neither does refresh()
+                       struct position new_pos = moveobject(pos_f, input, "..");
+                       printmap(pos_f, new_pos);
+                       pos_f = new_pos;
+                       wrefresh(win.window);
+                       fflush(stdout);
+                       usleep(50000);
                }

以上对printmap的调用肯定是错误的,但您仍然需要在循环中执行某些来更改win.window(或stdscr中的内容或者你提出的其他窗口或其他什么;然后你需要强制它刷新,并在睡觉之前用fflush(stdout)强制输出到stdout。

答案 1 :(得分:1)

尝试类似

的内容
while (!checkcollisions(pos_f, input)) { // Checks if it can move to next grid
    pos_f = moveobject(pos_f, input, ".."); // Moves object to next cell
    refresh();
    napms(200);
}

答案 2 :(得分:1)

查看已接受的答案here。 你通过使用getch导致一切都被阻止,然后一旦getch被一个可用于读取所有内容的键解锁,就像你期望的那样。

你的循环应该看起来像这样,使用链接中的代码......

while( !kbhit() )
{
     sleep( 500 ); // You get to determine how long to sleep here...
}

input = getch();

// Your old logic, roughly, goes here.