2012-03-18 93 views
4

我试图做一个文字动画在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); 
} 

但是,当我执行,而不是移动,等待和再次移动它,它会等待很长一段时间,并且对象突然出现在网格的最终细胞,而不显示动画

就是因为这样的ncurses是如何工作的?我已经尝试过使用其他解决方案,如select()拖延函数。

+0

你尝试刷新? – 2012-03-18 03:39:53

+0

对此问题有任何答案都有帮助吗? (http://stackoverflow.com/questions/2076380/linux-terminal-animation-best-way-to-delay-printing-of-frame-in-c) – summea 2012-03-18 03:41:19

+0

是,已经与'wrefresh试过(win.window) ;但它什么都不会做。 – user1002327 2012-03-18 03:45:11

回答

7

你需要调用refresh()(前usleep)。


更新:新的pastebin-ed代码段(在几条评论中)指向真实的问题,这与 ncurses-refresh中的相同: stdscr(暗示接下来的两个调用)和 getchrefreshnewwinwrefresh
更新2:使用完整的代码,加上一些黑客,我得到它的工作(为“工作”一定的价值,我显然不是()调用正确printmap,和我做了一个假的“地图”文件)。

没有仔细看,我刚换的getch()所有出现wgetch(win.window),所有mvprintw调用mvwprintw(使用同一窗口),并删除至少一个不需要的残培/ 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。

+0

在使用usleep之前和之后尝试使用wrefresh()和refresh(),都无效。 – user1002327 2012-03-18 03:48:03

+0

嗯,在这种情况下,可能需要看到更多的代码。 – torek 2012-03-18 03:50:46

+0

下面是相关的代码:http://pastebin.com/0b2s2Qhs – user1002327 2012-03-18 03:52:07

0

尝试像

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); 
} 
+0

已经尝试过,等待时间稍长一点,仍然不动画。 – user1002327 2012-03-18 04:06:15

+0

呵呵。那么总有一个问题,如果你确定你的两个职能实际上在做你的想法。你通过调试器运行它们? – Duck 2012-03-18 04:19:03

+0

是的,他们正在做我想做的事。玩家在地图上自由移动,碰撞检查工作正常,这里唯一的问题就是动画。看起来像发布小代码片段是不够的,所以这里是完整的代码。它很短。 http://pastebin.com/mL2FkDTg – user1002327 2012-03-18 04:22:25

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. 
+0

试图在两个函数中都替换它,游戏会在按下一个键后退出。 – user1002327 2012-03-18 04:34:47