サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

イベント処理

イベント処理を使用することで、ユーザーからの入力情報をより詳細に、ほぼ全て時系列順に取得できます。 イベント処理では、特定の入力順序が重要になるユーザーインタフェース操作を実装できます。 例えば、ユーザーがボタンをクリックしたことを意味する、ボタン上でのタッチダウン→タッチアップ操作などです。 そうした操作をポーリングで実装するのは困難です。



InputProcessor

イベント処理は一般的な オブザーバーパターンを使って行います。 まず最初に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;
   }
}

最初の三つのメソッドを使ってキーボードイベントを受け取ります:

  • keyDown(): キーが押された時に呼び出されます。Keysに記載されたキーコードを通知します。
  • keyUp(): キーが離された時に呼び出されます。上記と同じキーコードを通知します。
  • keyTyped(): キー入力によってユニコード文字が生成された時に呼び出されます。これを使ってテキストフィールドやそれと同様のユーザーインタフェース要素を実装できます。

次の三つのメソッドは、マウス/タッチ イベントを通知します:

  • touchDown(): 画面上で指が触れるか、マウスボタンが押された時に呼び出されます。座標だけでなくポインタインデックスとマウスボタンの情報も通知します。(タッチスクリーンの場合は常に マウスボタンのButtons.LEFTが通知されます)。
  • touchUp(): 画面上で指が離れるか、マウスボタンが離された時に呼び出されます。既知の最後の座標だけでなくポインタインデックスとマウスボタンの情報も通知します。(タッチスクリーンの場合は常に マウスボタンのButtons.LEFTが通知されます)。
  • touchDragged(): 画面上で指がドラッグされるか、マウスボタンが押された状態でマウスがドラッグされた時に呼び出されます。座標とポインタインデックスを通知します。 マウスがドラッグされた時に複数のボタンが押されていても、そのボタン情報は通知されません。 Gdx.input.isButtonPressed() を使用して特定のボタンが押されていることを確認できます。
  • mouseMoved(): マウスボタンが押されていない状態でマウスが画面上を移動した時に呼び出されます。このイベントはデスクトップ環境でのみ発生します。タッチスクリーンの端末ではこのイベントは発生せず、touchDragged() イベントのみ取得できます。
  • scrolled(): マウスホイールが回された時に呼び出されます。回転方向に応じて -1 もしくは 1 が通知されます。これはタッチスクリーンの端末では決して呼び出されません。

メソッドは boolean型の値を戻り値として返します。この意味については後述するInputMultiplexerの項目で説明します。

InputProcessorを実装したら、新たに入力イベントが通知された時にそれらが呼び出されるように、libgdxに指示を出す必要があります:

MyInputProcessor inputProcessor = new MyInputProcessor();
Gdx.input.setInputProcessor(inputProcessor);

これで、新たに発生した入力イベントは全て MyInputProcessor インスタンスに通知されるようになります。 描写スレッド上にて、各イベントはApplicationListener.render()が呼び出される直前に送信されます。



InputAdapter

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
   }
});


InputMultiplexer

時には、 InputProcessorsを連携させて処理したい時もあるでしょう。 例えば、最初に処理する必要があるUI用の入力プロセッサーと、ゲーム内世界を操作する入力イベント用の第二入力プロセッサーなど。 InputMultiplexer クラスを使ってこれを行うことができます:

InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(new MyUiInputProcessor());
multiplexer.addProcessor(new MyGameInputProcessor());
Gdx.input.setInputProcessor(multiplexer);

InputMultiplexer は新たに発生したイベントを最初に追加された InputProcessor へ渡します。 そのプロセッサーでイベント処理するメソッドからfalseが返した場合は、イベントが処理されなかったことを示します。 そしてmultiplexer は継続して次のプロセッサーへイベントを渡します。 このメカニズムを使用することで、MyUiInputProcessorMyUiInputProcessorで扱えるイベントを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;
    }

前へ | 次へ