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:~$
キー入力の度に描画更新より、滑らかに動くようになった気がします。
glut timer
10msに一回更新するので、100FPSってことになるのでしょうか。


コメント