それに対して,イベント(event:出来事)に対して,実行される内容が変化するプログラム をイベント駆動型プログラムと呼ぶ.例えば,マウスを動かすと,それに反応するゲーム プログラムなどである.このようなプログラムでは,フローの代わりにイベントに応じた 動作を記述する.プログラムに必要なことは,イベントの監視とどの動作内容である.こ のようなイベントの監視と動作内容をあわせて,イベントハンドラと呼ぶことがある.
ここで,学習しているGLUTを使ったプログラムは,イベント駆動型のプログラムである. 作成したウインドウをクリックして他のウインドウの上にしたり,または移動させたりす ると自動的に再描画してくれる.クリックとか移動とかのイベントに対応して,プログラ ムが実行されている.
イベントはイベントキュー(event queue)に入れられて,古いイベントから順に取り出さ れる.取り出されたイベントは,それに対応する処理を行う.プログラム中では,イベン トに対応する処理は,コールバック関数(callback function)を使って記述する.
プログラムは,イベントに対する処理内容コールバック関数で記述した後,イベントルー プと呼ばれる無限ループに動作が移る.この無限ループで,イベントを監視の監視と,そ れに対応する処理を永遠行うことになる.先週学習したリスト1の例 では,
1 #include <stdio.h> 2 #include <GL/glut.h> 3 4 void draw(void); // プロトタイプ宣言 5 void set_color(void); 6 7 //==================================================================== 8 // main関数 9 //==================================================================== 10 int main(int argc, char *argv[]) 11 { 12 13 glutInit(&argc, argv); // GLUT 初期化 14 glutInitDisplayMode(GLUT_RGBA); // 表示モードの指定 15 glutCreateWindow("Yamamoto's window"); // windowをタイトルを付けてを開く 16 glutDisplayFunc(draw); // イベントにより呼び出し 17 set_color(); // 塗りつぶす色指定 18 glutMainLoop(); // GLUTの無限ループ 19 20 return 0; 21 } 22 23 //==================================================================== 24 // ウィンドウを塗りつぶす 25 //==================================================================== 26 void draw(void) 27 { 28 glClear(GL_COLOR_BUFFER_BIT); 29 glFlush(); // 描画 30 } 31 32 //==================================================================== 33 // 色の指定 34 //==================================================================== 35 void set_color(void) 36 { 37 glClearColor(1.0, 0.0, 0.0, 1.0); //赤緑青と透明度 38 }