GLUT定时器功能

时间:2016-12-10 20:10:49

标签: c++ opengl glut

我试图在棋盘游戏中让我的代币缓慢下降。现在,他们跌倒了,但他们跌得这么快。我怎么能在我的代码中实现计时器功能?现在我做一个循环,更新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);

2 个答案:

答案 0 :(得分: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::durationstd::chrono::stead_clock之类的内容来执行时间安排。

答案 1 :(得分:0)

这里的实际问题是过剩是如何运作的。基本上,用户只获得在主循环结束时呈现的图像。只要您不从鼠标功能返回,屏幕上就不会显示任何内容。您可以通过将工作转移到显示功能并将转换分布在多个框架来解决问题:

全局变量:

double circlex = 0, circley = 0, bottomy = 0;
bool isfalling = false;
int topy = 0;

mouse_func:

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;
}

display_func:

if (isfalling)
{
    circley += .0000000000000000001;
    topy += 2;

    if (topy >= bottomy)
        isfalling = false;
}

glTranslatef(circlex, circley, 0.0f);
display();