イベント処理を使用することで、ユーザーからの入力情報をより詳細に、ほぼ全て時系列順に取得できます。 イベント処理では、特定の入力順序が重要になるユーザーインタフェース操作を実装できます。 例えば、ユーザーがボタンをクリックしたことを意味する、ボタン上でのタッチダウン→タッチアップ操作などです。 そうした操作をポーリングで実装するのは困難です。
イベント処理は一般的な オブザーバーパターンを使って行います。 まず最初にInputProcessorという名前のリスナーインタフェースを実装する必要があります:
public class MyInputProcessor implements InputProcessor { public boolean keyDown (int keycode) { return false; } public boolean keyUp (int keycode) { return false; } public boolean keyTyped (char character) { return false; } public boolean touchDown (int x, int y, int pointer, int button) { return false; } public boolean touchUp (int x, int y, int pointer, int button) { return false; } public boolean touchDragged (int x, int y, int pointer) { return false; } public boolean mouseMoved (int x, int y) { return false; } public boolean scrolled (int amount) { return false; } }
最初の三つのメソッドを使ってキーボードイベントを受け取ります:
次の三つのメソッドは、マウス/タッチ イベントを通知します:
Gdx.input.isButtonPressed()
を使用して特定のボタンが押されていることを確認できます。
touchDragged()
イベントのみ取得できます。
メソッドは boolean
型の値を戻り値として返します。この意味については後述するInputMultiplexerの項目で説明します。
InputProcessor
を実装したら、新たに入力イベントが通知された時にそれらが呼び出されるように、libgdxに指示を出す必要があります:
MyInputProcessor inputProcessor = new MyInputProcessor(); Gdx.input.setInputProcessor(inputProcessor);
これで、新たに発生した入力イベントは全て MyInputProcessor
インスタンスに通知されるようになります。
描写スレッド上にて、各イベントはApplicationListener.render()
が呼び出される直前に送信されます。
InputAdapter
は、 InputProcessor
を実装して全てのメソッドで false を返すようにしているクラスです。
InputAdapter
クラスを継承して、必要なメソッドのみ実装することができます。
匿名のインナークラスとして使用することもできます。
Gdx.input.setInputProcessor(new InputAdapter () { @Override public boolean touchDown (int x, int y, int pointer, int button) { // your touch down code here return true; // return true to indicate the event was handled } @Override public boolean touchUp (int x, int y, int pointer, int button) { // your touch up code here return true; // return true to indicate the event was handled } });
時には、 InputProcessors
を連携させて処理したい時もあるでしょう。
例えば、最初に処理する必要があるUI用の入力プロセッサーと、ゲーム内世界を操作する入力イベント用の第二入力プロセッサーなど。
InputMultiplexer クラスを使ってこれを行うことができます:
InputMultiplexer multiplexer = new InputMultiplexer(); multiplexer.addProcessor(new MyUiInputProcessor()); multiplexer.addProcessor(new MyGameInputProcessor()); Gdx.input.setInputProcessor(multiplexer);
InputMultiplexer
は新たに発生したイベントを最初に追加された InputProcessor
へ渡します。
そのプロセッサーでイベント処理するメソッドからfalseが返した場合は、イベントが処理されなかったことを示します。
そしてmultiplexer は継続して次のプロセッサーへイベントを渡します。
このメカニズムを使用することで、MyUiInputProcessor
はMyUiInputProcessor
で扱えるイベントをMyUiInputProcessor
内で処理し、それ以外のイベントをMyGameInputProcessor
へ渡すことができます。
入力プロセッサを使ってゲーム内の要素を動かしたい場合は、キーが入力された(もしくはキーが押されている状態の)時だけそれを動かせばいいのです。 継続して入力処理を行ったりSpriteを動かしたりするには、以下のようにして移動させる対象にフラグを追加します。:
public class Bob { boolean leftMove; boolean rightMove; ... updateMotion() { if (leftMove) { x -= 5 * Gdx.graphics.getDeltaTime(); } if (rightMove) { x += 5 * Gdx.graphics.getDeltaTime(); } } ... public void setLeftMove(boolean t) { if(rightMove && t) rightMove = false; leftMove = t; } public void setRightMove(boolean t) { if(leftMove && t) leftMove = false; rightMove = t; }
そして、入力プロセッサー内を以下のように修正します:
... @Override public boolean keyDown(int keycode) { switch (keycode) { case Keys.LEFT: bob.setLeftMove(true); break; case Keys.RIGHT: bob.setRightMove(true); break; } return true; } @Override public boolean keyUp(int keycode) { switch (keycode) { case Keys.LEFT: bob.setLeftMove(false); break; case Keys.RIGHT: bob.setRightMove(false); break; } return true; }