GLUT定时器功能
Posted
技术标签:
【中文标题】GLUT定时器功能【英文标题】:GLUT timer function 【发布时间】:2016-12-10 20:10:48 【问题描述】:我正试图让我的棋盘游戏中的代币慢慢下降。现在,他们跌倒了,但他们跌倒的速度如此之快。如何在我的代码中实现计时器功能?现在我做了一个循环,更新 glTranslate 的 y 坐标。但是还是太快了!顶部 y 是我在屏幕上按下的 y 坐标,底部是令牌最低开放点的坐标。
col =0;
double bottomy = 0;
int row = 0;
circlex = (double)x / width ;
circley = (double)y / height ;
row = board.getRow(col) + 1;
bottomy = 500 - (25*row);
for( double topy = y ; topy <= bottomy; topy += 2 )
glTranslatef(circlex, circley, 0.0f);
circley += .0000000000000000001;
display();
r = board.makeMove(col);
【问题讨论】:
您能添加更多代码吗?我在这里看到至少两个问题:1)如果所有这些代码都是glutDisplayFunc
的一部分,那么您很可能只看到最终结果而没有中间步骤,因为缓冲区没有交换。 2) 除非您在 display() 中重置模型矩阵,否则您会将转换相加,而不是用当前的 circley
值替换它们。
所有这些代码都是我的鼠标功能的一部分,当用户按下左键进行移动时。我认为我的问题是openGL的世界坐标。我将如何将鼠标坐标转换为世界坐标?
【参考方案1】:
您可以使用glutTimerFunc
定期执行功能。这有签名
void glutTimerFunc(unsigned int msecs,
void (*func)(int value),
value);
例如,如果您的绘图功能是
void UpdateTokens(int time);
然后您可以通过以下调用每 0.5 秒调用一次更新(其中current_time
是当前模拟时间)
glutTimerFunc(500, UpdateTokens, current_time);
为了更精确的计时,我建议改用<chrono>
,并使用std::chrono::duration
和std::chrono::steady_clock
之类的东西来执行计时。
【讨论】:
std::chrono::stead_clock
应该是std::chrono::steady_clock
【参考方案2】:
这里的实际问题是 glut 是如何工作的。基本上,用户只会在主循环结束时获得图像。只要您不从鼠标功能返回,屏幕上就不会出现任何内容。您可以通过将工作转移到显示功能并跨多个框架分配翻译来解决问题:
全局变量:
double circlex = 0, circley = 0, bottomy = 0;
bool isfalling = false;
int topy = 0;
鼠标函数:
if (isfalling == false) //Prevents the user from clicking during an animation
circlex = (double)x / width ;
circley = (double)y / height ;
int row = board.getRow(col) + 1;
bottomy = 500 - (25*row);
topy = y;
isfalling = true;
显示函数:
if (isfalling)
circley += .0000000000000000001;
topy += 2;
if (topy >= bottomy)
isfalling = false;
glTranslatef(circlex, circley, 0.0f);
display();
【讨论】:
以上是关于GLUT定时器功能的主要内容,如果未能解决你的问题,请参考以下文章