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ってことになるのでしょうか。
コメント