gpt4 book ai didi

c - ncurses 应用程序中的 sleep()

转载 作者:太空狗 更新时间:2023-10-29 15:20:24 25 4
gpt4 key购买 nike

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

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

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() 停顿函数。

最佳答案

您需要调用 refresh()(在 usleep 之前)。


更新:新的 pastebin-ed 代码段(在几个评论)指向真正的问题,这与 ncurses-refresh 中的问题相同: 将 stdscr(由接下来的两个调用暗示)和 getchrefreshnewwinwrefresh 混合.
更新 2:使用完整代码,加上一些 hacking,我让它工作(对于“工作”的某些值,我显然没有正确调用 printmap(),我弥补了伪造的“ map ”文件)。

没有仔细看,我只是将所有出现的 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 或您设置的其他窗口或其他);然后你需要强制它刷新,并在 sleep 之前用 fflush(stdout) 强制输出到 stdout。

关于c - ncurses 应用程序中的 sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com