1. 程式人生 > >【OpenGL】-008 GLUT中的定時器

【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