Java
processing

Processingでキーの同時押し

はじめに

超初心者用です。ついでに長押しも実現できます。

やりかた

keyPressed関数/keyReleased関数でキーごとに押されたか、離されたかを判定する。

// それぞれのキーの入力状態を格納
boolean right, left, down, up;

void keyPressed() {
  if (keyCode == RIGHT) right = true;
  if (keyCode == LEFT)  left  = true;
  if (keyCode == DOWN)  down  = true;
  if (keyCode == UP)    up    = true;
}

void keyReleased() {
  if (keyCode == RIGHT) right = false;
  if (keyCode == LEFT)  left  = false;
  if (keyCode == DOWN)  down  = false;
  if (keyCode == UP)    up    = false;
}

これだけで同時押し/長押し処理はできます。あとは

  if (right) {
    /* 右キーが押されているときの処理 */
  }
  if (left) {
    /* 左キーが押されているときの処理 */
  }
  if (down) {
    /* 下キーが押されているときの処理 */
  }
  if (up) {
    /* 上キーが押されているときの処理 */
  }

こんな感じでキーごとに処理を分けられます。

しかしこれではあまりスマートではないので、入力状態をHashMapでまとめて管理してみます。

// keyCode(int型)とその入力状態(boolean型)を格納
HashMap<Integer, Boolean> key = new HashMap<Integer, Boolean>();

void keyPressed() {
  key.put(keyCode, true);
}

void keyReleased() {
  key.put(keyCode, false);
}

さらに、入力状態を管理するKeyStateクラスを作ります。

KeyState.pde
static class KeyState {
  static HashMap<Integer, Boolean> key;

  // 入力状態の初期化
  static void initialize() {
    key = new HashMap<Integer, Boolean>();

    key.put(RIGHT, false);
    key.put(LEFT,  false);
    key.put(UP,    false);
    key.put(DOWN,  false);
  }

  // keyCodeとその入力状態を受け取り、更新する
  static void putState(int code, boolean state) {
    key.put(code, state);
  }

  // keyCodeを受け取り、その入力状態を返す
  static boolean getState(int code) {
    return key.get(code);
  }
}

入力状態を取得するときはこんな感じ

main.pde
void setup() {
  KeyState.initialize();
}

void draw() {
  if (keyState.getState(RIGHT)) {
    /* 右キーが押されているときの処理 */
  }
  if (keyState.getState(LEFT)) {
    /* 左キーが押されているときの処理 */
  }
  if (keyState.getState(DOWN)) {
    /* 下キーが押されているときの処理 */
  }
  if (keyState.getState(UP)) {
    /* 上キーが押されているときの処理 */
  }
}

void keyPressed() {
  KeyState.putState(keyCode, true);
}

void keyReleased() {
  KeyState.putState(keyCode, false);
}

おつかれさまでした。

おわりに

方向キーはkeyCode(int型)ですが、TabやEnterはkey(char型)に格納されるのでもう一工夫要ります。