C言語+GLUT(タイマー)

GLUT続きです。
キーボードを押すたびに再描画しているので、少し効率が悪いです。 定期的に描画するように変更したいと思います。

glutTimerFuncを使えば、指定時間後に指定した関数を実行することができます。

void glutTimerFunc(unsigned int msecs, void (*func)(int value), value);

サンプルプログラムです。1秒毎にHELLOと表示します。

takk@deb9:~$ cat -n timer.c
     1  #include <stdio.h>
     2  #include <GL/glut.h>
     3
     4  void timer(int value)
     5  {
     6          printf("HELLO\n");
     7          glutTimerFunc(1000,timer,0);
     8  }
     9
    10  int main(int argc, char *argv[])
    11  {
    12
    13          glutInit(&argc, argv);
    14          glutCreateWindow(argv[0]);
    15
    16          glutTimerFunc(1000,timer,0);
    17
    18          glutMainLoop();
    19          return 0;
    20  }
takk@deb9:~$

実行結果です。

takk@deb9:~$ gcc -lglut -lGLU -lGL -lm timer.c
takk@deb9:~$ ./a.out
HELLO
HELLO
HELLO
HELLO
HELLO

では作成中ゲームを、定期的に描画更新するように修正します。
キー入力のたびに、glutPostRedisplay()をコールしていたので、コメントアウトします。

void cb_callback_keyboard(unsigned char key, int x, int y)
{
        switch(key){
~省略~
        }

redisplay:
        if(cb_get_block(p->x, p->y, p->z) != 0)
                p->y++;
        if(cb_get_block(p->x, p->y-1, p->z) == 0)
                p->y--;
//      glutPostRedisplay();
}

時間経過後に呼び出しするコールバック関数を追加。

void cb_callback_timer(int value)
{
        glutPostRedisplay();
        glutTimerFunc(10,cb_callback_timer,0);
}

main関数に追加。

int main(int argc, char *argv[])
{
~省略~
        glutTimerFunc(10,cb_callback_timer,0);
~省略~
        glutMainLoop();
        return 0;
}
takk@deb9:~$

キー入力の度に描画更新より、滑らかに動くようになった気がします。

10msに一回更新するので、100FPSってことになるのでしょうか。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA