【OpenGL】-008 GLUT中的定时器

【OpenGL】-008 GLUT中的定时器

  定时器是窗口程序中的一个重要功能,用于按照固定的时间间隔之后执行某些特定动作。在window程序中,有WM_TIMER消息进行响应。在使用GLUT进行窗口管理的程序中,如何进行定时器操作?

1. glutTimerFunc函数

  在进行窗口绘制的过程中,我们接触了glutDisplayFunc函数。该函数用于设置glut在需要进行绘制时的回调函数。在查看函数定义时,发现glut中还定义了glutTimerFunc函数,用于设置定时器的回调函数。该函数定义如下:

FGAPI void    FGAPIENTRY glutTimerFunc( unsigned int time, void (* callback)( int ), int value );

  该函数中,第一个参数time用于指定定时间隔,单位是毫秒。第二个参数定义了一个函数指针,指回调函数。第三个参数value用于制定定时器ID。例如,函数调用形式如下:

void timerFunc(int nTimerID);
glutTimerFunc(100,timerFunc,1);

  该调用设置了一个ID为1,时间间隔为100毫秒,回调函数为timerFunc的定时器。

2. 注意

  按照上述方式进行了定时器设定之后,发现定时回调函数只调用了一次,没有像window中的SetTimer函数一样,一次定义定时器,之后多次响应,知道进行KillTimer.查找资料之后发现,可以在定时回调函数中继续进行定时器的定义,从而实现循环响应。需要退出定时器或关闭定时器的时候只需要在回调函数中不再进行定时器的定义即可。

#include <GL/glut.h>
#include <iostream>

#define REDISPLAYTIMERID 1

void init(void)
{
    glClearColor(0.0,0.0,0.0,0.0);
    glMatrixMode(GL_PROJECTION);
    glOrtho(-5,5,-5,5,5,15);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0,0,10,0,0,0,0,1,0);
    return ;
}
int g_c = 0;

void display(void)
{

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,0,0);

    glBegin(GL_TRIANGLES);
    glColor3f(1,0,0);glVertex2f(-5,5-g_c*0.01);
    glColor3f(0,1,0);glVertex2f(-5,-5-g_c*0.01);
    glColor3f(0,0,1);glVertex2f(5,-5-g_c*0.01);
    glEnd();
 
    glFlush();
    std::cout << g_c << std::endl;
    return ;
}

void timerFunc(int nTimerID)
{
    switch(nTimerID)
    {
        case REDISPLAYTIMERID:
            g_c++;
            glutPostRedisplay();
            glutTimerFunc(100,timerFunc,REDISPLAYTIMERID);
        break;
    }
}
int main(int argc, char* argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
    glutInitWindowPosition(0,0);
    glutInitWindowSize(500,500);
    glutCreateWindow("OGLWindow");
    init();
    glutDisplayFunc(display);
    glutTimerFunc(100,timerFunc,REDISPLAYTIMERID);
    glutMainLoop();
    return 0;
}

3. 效果

  本程序的作用是在窗口上显示一个三角形,并逐渐向下移动。

iUT4C8.gif

猜你喜欢

转载自blog.csdn.net/freehawkzk/article/details/83058187
008