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)  up    = false;
  if(keyCode == UP)    down  = false;
}

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

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

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

しかしこれではあまりスマートではないので、入力状態を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
public class KeyState
{
  HashMap<Integer, Boolean> Key;

  //コンストラクタ
  KeyState()
  {
    this.Initialize();
  }

  //入力状態の初期化
  void Initialize()
  {
    this.Key = new HashMap<Integer, Boolean>();

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

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

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

最終的にプログラム全体はこんな感じになる ↓

main.pde
//インスタンスを生成
KeyState keyState;

void setup()
{
  /*省略*/

  //インスタンスを生成、初期化
  keyState = new KeyState();
  keyState.Initialize();
}

void draw()
{
  /*省略*/

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

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

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

おつかれさまでした。

おわりに

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