それに対して,イベント(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 }