我正在尝试为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()停止功能。
答案 0 :(得分:7)
您需要致电refresh()
(usleep
之前)。
stdscr
(由后两个调用隐含)和getch
以及refresh
与newwin
和wrefresh
混合。
如果不仔细观察,我只是将所有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.