GLFWでのキーボード入力

GLFWでキーボード状態を取得する方法の日本語情報がないような気がしたので,ユーザーマニュアルを簡単に訳してみました.

(*追記 GLFWのバージョンは2.??で、ユーザーマニュアルのURIは見失ってライセンス確認できてないです。ゴラァしてくれると引っ込めます。)

GLFWが提供する3つの方法

  1. 個々のキーのそのときの状態を調べる
  2. あるキーの状態が変わったの受け取るコールバック関数
  3. 文字を受け取るコールバック関数

何をしたいかによって,どの方法が好まれるかは異なります. 2と3の方法の違いは,シフトなどの修飾キーに影響されるかどうかというところ.文字のコールバックでは,カーソルキーや修飾キーを受け取れない.

1.キー状態を調べる

ある瞬間のキーが押されてるかどうかをチェックする

int glfwGetKey( int key );

引数keyでどのキーを調べたいかを指定します.キーの指定はISO 8859-1で.返り値はキーが押されていたならGLFW_PRESS(すなわち 1),押されてなかったならGLFW_RELEASE(すなわち 0).

glfwGetKeyしてから次のglfwGetKeyまでにキーの状態が変わったか知りたいときの方法

(処理落ちしたときには,glfwGetKeyが呼ばれるまでにユーザーがキーを放してしまう!)

glfwEnable( GLFW_STICKY_KEYS ); 

これが有効になっていると,glfwGetKeyでチェックされるまでキーは開放されない.

glfwDisable( GLFW_STICKY_KEYS );

現在押されてない全てのキーが解放される,glfwGetKeyにチェックされるのを待たずに解放されたキー入力は即座に開放状態に取り変わり,入力を受け取れない. デフォルトではGLFW_STICKY_KEYSは無効になっている. Sticky key(粘りキー判定)はとても有効だけど,危険もはらんでる.それはglfwGetKeyでチェックされないまま長いこと"pressed"になったままになっている場合だ.典型例は,メニューとゲームの2つの構成を持つプログラムでメニューでの入力を残したままゲームセクションへ遷移したときなどである.これを避けるためには,セクションを離れるときには必ずSticky keyを無効化すること.

2.コールバック関数

これは,glfwGetKeyの代替となる.

void glfwSetKeyCallback( GLFWkeyfun cbfun );

引数funはコールバック関数へのポインタです.コールバック関数は2つの整数型の引数をとる.第1引数はキー識別子,第2引数はGLFW_PRESS か GLFW_RELEASEの状態.もし,コールバック関数を登録したくないならfun=NULL指定できる.

コールバック関数を使えば,キーが押されたことや開放されたことを逃すことはないだろう.必要なイベントが発生したかを調べる代わりに必要なイベントにだけ反応すればいいのだ.

3.文字入力のためのコールバック関数

キーボードを文字入力デバイスとして使うなら,文字入力コールバック関数を使えばいい.

void glfwSetCharCallback( GLFWcharfun cbfun );

funはコールバック関数へのポインタだ.コールバック関数の第1引数はユニコードコードポイント.第2引数はGLFW_PRESS か GLFW_RELEASE.これも,fun=NULLにできる.

その他

キーリピート
glfwEnable( GLFW_KEY_REPEAT );

これで,キーリピートできる.

システムキーの無効化

ALT+TABなどのOSが提供するイベントを無効化したいとき.

glfwDisable( GLFW_SYSTEM_KEYS );