雑念日記

主に技術的なことをつらとらと(書ければいいな)。

Processingでゲームパッドを使おう (その3)

関連記事。


GameControlPlusを使ってゲームパッドを扱うにあたって、ボタンにイベントハンドラを追加することができます。

以下のようにすることで、draw()メソッド内に複雑な処理を書かなくて済むようになる上に、ボタンを押した(離した)とき1回だけの処理を簡単に記述することができます。

サンプルコード:

import org.gamecontrolplus.*;

ControlIO control;
ControlDevice device;
ControlButton button;

void setup() {
  control = ControlIO.getInstance(this);
  device = control.getMatchedDevice("gamepad_config");

  button = device.getButton("B_0");
  button.plug(this, "pressButton",   ControlIO.ON_PRESS);
  button.plug(this, "releaseButton", ControlIO.ON_RELEASE);
}

// ボタンが押されたタイミングでメッセージを表示
void pressButton() {
  println("PRESSED!");
}

// 押されたボタンを離すタイミングでメッセージを表示
void releaseButton() {
  println("RELEASED!");
}

void draw() {
  // 入力待ち
}

イベントハンドラの追加を行うplug()メソッドの詳細は以下です。

public void plug(Object i_object, String i_methodName, int i_eventType)
引数 説明
i_object 第3引数で指定するイベントが発生したときに、ここで指定したオブジェクトをレシーバとして、第2引数で指定するメソッドを実行する。
i_methodName イベント発生時に実行するメソッドの名前を指定。
i_eventType トリガーとなるイベントを指定。

トリガーとなるイベントは以下の3つの中から選べます。

定数名 説明
ON_PRESS ボタン押下時に1度だけ発火するイベント。
ON_RELEASE 押下状態のボタンを離したときに1度だけ発火するイベント。
WHILE_PRESS ボタン押下中に発火し続けるイベント。

以下のように、1つのイベントに対して複数イベントハンドラを追加することも可能です。

void setup() {
  control = ControlIO.getInstance(this);
  device = control.getMatchedDevice("gamepad_config");

  button = device.getButton("B_0");
  button.plug(this, "pressButton",  ControlIO.ON_PRESS);
  button.plug(this, "pressButton2", ControlIO.ON_PRESS);
}

void pressButton() {
  println("PRESSED!");
}

void pressButton2() {
  println("PRESSED 2 !");
}

なお、plug()メソッドが使えるのはボタン(ControlButton)とハット(ControlHat)のみで、スライダー(ControlSlider)にはイベントハンドラを登録することはできない模様。

参考: Javadocs: GameControlPlus