void keyPress(unsigned char key,int x,int y){
int i;
switch(key){
case 'f':
i = 3;
while(i--){
x_pos += 3;
sleep(100);
glutPostRedisplay();
}
}
}
上面是在Windows 7中使用GLUT库用C ++编写的代码片段。
此功能采用字符键和鼠标坐标x,y,并在按下f字符的3个连续步骤中沿x方向执行平移。在每个步骤之间程序应该睡眠100毫秒。
我们想要移动一个机器人,并在他前进的步骤中连续停顿。
我们正面临着让程序在3个步骤之间休眠的问题。上面的代码片段有什么问题?
答案 0 :(得分:3)
免责声明: jozxyqk的答案对我来说似乎更好。这个答案以肮脏的方式解决了这个问题。
您正在滥用glutPostRedisplay
,如this answer中所述。问题是,glutPostRedisplay
标记当前窗口需要重新显示,但只有在您再次进入glutMainLoop
后才会执行。这确实只发生一次,因此只有一次睡眠似乎有效。
事实上,所有三个睡眠都有效,但300毫秒后你只能重画一次。
要解决此问题,您必须找到另一种重绘场景的方法。
while(i--){
x_pos += 3;
sleep(100);
yourDrawFunction();
}
假设您正在使用UNIX系统。
睡眠100毫秒
sleep(100);
这里的问题是,你正在睡觉100秒,因为你可能正在使用<unistd.h>
标题的睡眠功能,它将sleep()
定义为:
extern unsigned int sleep (unsigned int __seconds);
你想要的可能是
usleep(100000); //sleeps for 100000 microseconds == 100 ms
答案 1 :(得分:3)
我相信你的代码的问题是你的睡眠正在弄乱过剩的主循环。调用堆栈可能看起来像这样
main() -> glutMainLoop() -> keyPress() -> sleep()
#but can't get to this...
main() -> glutMainLoop() -> display()
在keyPress()
返回之前,过剩的主循环无法继续渲染下一帧。它等待函数返回。 所有glutPostRedisplay()
都会说&#34; 嘿,某些内容已经更改,因此图片已过时,我们需要在下次主循环迭代时重绘&# 34; 即可。它实际上并没有调用display()
。
您必须构建代码,以便主循环可以正常继续,但仍然需要在绘制之间延迟。例如:
keyPress()
中,设置moving = true
州。让函数返回。idle()
功能中,如果正在移动,或者如果您上次移动,请致电sleep()
(实际上您可能需要考虑计算已用时间并进行计时)你自己,所以你不要阻止整个程序)idle()
增加x_pos
并减少你的移动次数,让函数返回,过剩,然后再次调用空闲,你可以再次睡眠/移动。