在按键上获取关键代码和关键修饰符

时间:2013-12-19 22:21:05

标签: java libgdx

当用户按下组合键时,我需要获取键的代码以及当前按下了哪些修饰键(CtrlAltShift等),并选择适当的反应基于此。有没有比以下更清洁的方法? (使用InputProcessor#keyDown):

public boolean keyDown(int keycode) {
      boolean ctrl, alt, shift, ...;
      if (Gdx.input.isKeyPressed(Input.Keys.LEFT_SHIFT) || Gdx.input.isKeyPressed(Input.Keys.RIGHT_SHIFT)) {
            shift = true;
      } else if (/* same for ctrl */) {
          ctrl = true;
      } else  /* same for other modifiers */ {
          //...
      }
      // Finally, choose an action based on the key combination pressed
      if (shift && keycode == Input.Keys.A) {
          // What to do if Shift+A is pressed
      } else if (/* and so on */) {
          //...     
      }
}

我看到有Input.Keys.META_*个位掩码,这可能是我需要的,但我没有找到任何关于如何使用它们的例子。

2 个答案:

答案 0 :(得分:1)

您可以使用keyDown()方法检测是否按下了shift(或任何其他修饰键),并使用keyUp()方法再次释放它:

class MyInputProcesses extends InputProcesses {
  boolean shift = false;
  // etc...

  public boolean keyDown(int keycode) {
    switch(keycode) {
      case Input.Keys.LEFT_SHIFT :
      case Input.Keys.RIGHT_SHIFT:
        shift = true;
        break;
      case Input.Keys.A:
        if(shift) {
          // Do something if Shift+A is pressed
        }
        break;
    }
    // etc...
  }

  public boolean keyUp(int keycode) {
    switch(keycode) {
      case Input.Keys.LEFT_SHIFT :
      case Input.Keys.RIGHT_SHIFT:
        shift = false;
        break;
      // etc...
    }
  }
}

该方法可以防止您询问修改键的状态,并且更容易修改这些键的触发器(例如,只接受左移)。

我猜这个解决方案是否更好/更好是个人喜好。我怀疑这会更快(明显)。

答案 1 :(得分:0)

你可以迭代键,例如添加到数组,然后你可以检查数组是否正在使用正确的组合

    //definition of array
    Array<String> buttons = new Array<String>();

    ...
    //now in render

    buttons.clear();

    for(int i = 0; i < 256; i++)
        if( Gdx.input.isKeyPressed( i ) )
            buttons.add( Input.Keys.toString(i) );

    if(buttons.contains("L-Ctrl", false) && buttons.contains("L-Alt", false) && buttons.contains("M", false))
    {
        System.out.println("Ctrl+Alt+M combination entered!");
    }

256是 Input.Keys 类中的最大按钮索引(你可以进入类并检查 - 你也会发现按钮的所有字符串名称)