9.6 そのほかの関数

ggetch キーボードからの入力を待つ

ggetch()

キーを押すまで動作を停止し、押されたキーの番号を整数型で戻り値として返します。以下に押されたキーを調べるプログラム例を示します。

  #include <eggx.h>
  int main() {
    int win, key;
    win=gopen(400,400);
    while( 1 ) {
      key=ggetch();
      if(key==32) return 0;
      gclr(win);
      drawstr(win, 50.0, 50.0, 12, 0.0,
              "key number = %d (%c)", key, (char)key);
    }
  }

初期状態では ggetch( ) 関数はキーが押されるまで待ちますが、gsetnonblock ノンブロッキングモードではキー入力が無くても即座に戻ってくるように制御できます。

ggetxpress マウスからのクリック、キー入力などを待つ

ggetxpress(&type, &code, &x, &y)

マウスのクリック、またはキーの押し下げまで動作を停止し、結果を返します。
type, code は整数型。x, y は実数型。
キー押し下げの場合は type に KeyPress (2)、code にキーの番号が設定されます。
マウスクリックの場合は type に ButtonPress (4) が、code に押されたボタンの番号(1,2,3)と x, y にクリックした時のポインタの座標位置が設定されます。

以下にその機能を試す簡単なプログラムを示します。

  #include <eggx.h>
  int main() {
    int win, code, type;
    double x,y;
    win=gopen(400,400);
    if( ggetxpress( &type, &code, &x, &y) == win ) {
      printf("%d = %d, %f:%f\n", type, code, x, y);
    }
    gclose(win);
    return 0;
  }

初期状態では ggetxpress( ) 関数はキーが押されるまで待ちますが、gsetnonblock ノンブロッキングモードではキー入力が無くても即座に戻ってくるように制御できます。

gsetnonblock ノンブロッキングモード

gsetnonblock(mode)

mode は整数型。ggetch 関数や ggetxpress 関数の動作モードを設定します。初期的にはこれらの関数を呼び出すと、入力があるまでプログラムは停止します。
しかし gsetnonblock 関数に ENABLE を指定して呼び出すことで、それ以降はこれらの関数は入力が無くてもすぐに関数から戻るようになります。その場合(入力がなかった場合)、関数の戻り値には負の値が設定されます。

gsetnonblock を用いたサンプル

gsetnonblock 関数を利用して、入力に即時に反応するサンプルプログラムをだしておきます。
このプログラムはクリックしたところから波紋が広がるアニメーションです。何かキーを押すと終了します。

ripple1.c 最もシンプルなもの。

ripple2.c 見た目の面白さを優先して、複数の波紋が出るようにしたもの。配列を利用していたり、少し複雑になっている。実行結果を以下に示す。

gsetnonblock サンプル

msleep 指定ミリ秒の間実行を停止する

msleep(t)

整数型の t に与えられた時間(単位はミリ秒)実行を停止します。例えば msleep(100) で 100 ミリ秒(0.1 秒)停止し、再開します。アニメーションを描くような場合に、進行速度を調整するために便利でしょう。


Yutaka Yasuda (yasuda@bakkers.gr.jp)