LibGdx:是否可以同时返回两个按键?

时间:2015-09-29 18:19:06

标签: java input libgdx listener

这样的事情会成为可能吗? 我知道有Gdx.input.isKeyPressed(int key)。

public class KeyListener implements EventListener {

public boolean handle(Event e) {
    if (!(e instanceof InputEvent)) return false;
    InputEvent event = (InputEvent) e;

    if (event.getType() == InputEvent.Type.keyDown) keysPressed(event.getKeyCode(), keycode????)
}

public boolean keysPressed(int firstKey, int secondKey) {

}

}

编辑:如何返回第二个keyCode?

3 个答案:

答案 0 :(得分:2)

如果你想在没有任何监听器的情况下检查所有按下的键,最简单的解决方案是使用 Gdx.input.isKeyPressed 方法并将密钥的所有整数标识符传递给它。

Input.Keys 类中,列出了所有键,例如:

    public static final int I = 37;
    public static final int J = 38;
    public static final int K = 39;
    public static final int L = 40;
    ...

你可以看到一个键的最大值是255(BUTTON_CIRCLE),所以我们将从0-255迭代检查键是否被按下。然后将按下的键的id添加到数组中,并检查是否存在所需的组合。

总而言之,代码应如下所示:

    //this should not be in the render function!
    Array<Integer> pressedButtons = new Array<Integer>();

    ...
    //this should be in the render function

    pressedButtons.clear();

    for(int i = 0; i < 256; i++)
        if( Gdx.input.isKeyPressed( i ) )
            pressedButtons.add( i );

    if(pressedButtons.contains(Keys.CONTROL_LEFT, false) && pressedButtons.contains(Keys.ALT_LEFT, false) && pressedButtons.contains(Keys.M, false))
    {
        System.out.println("PRESSED!");
    }

你可以在if上添加一些标志,只会被触发一次

答案 1 :(得分:2)

在我输入这个答案之前,我没有注意到另一个答案,但这种方法有一些优点。它使用一个InputProcessor,如果你需要与其他输入处理器和Stage2D玩得很好,这是正确的方法;你不必每帧迭代255个键;并且每次按键时它只会触发一次而不是每一帧。

没有自动处理多个按键的方法,但实现自己的按键非常简单。 Libgdx附带了一个IntSet类,它非常适合这种情况,并且因为它使用原始int而避免生成垃圾。

private final IntSet downKeys = new IntSet(20);

private InputAdapter inputAdapter = new InputAdapter(){
    public boolean keyDown (int keycode) {
        downKeys.add(keycode);
        if (downKeys.size >= 2){
            onMultipleKeysDown(keycode);
        }
        return true;
    }

    public boolean keyUp (int keycode) {
        downKeys.remove(keycode);
        return true;
    }
};

private void onMultipleKeysDown (int mostRecentKeycode){
    //Keys that are currently down are in the IntSet. Do whatever you like, for example:

    //Alt-F4 to quit:
    if (downKeys.contains(Input.Keys.ALT_LEFT) || downKeys.contains(Input.Keys.ALT_RIGHT)){
        if (downKeys.size == 2 && mostRecentKeycode == Input.Keys.F4){
            Gdx.app.exit();
        }
    }
}

@Override
public void show() {
    downKeys.clear();
    Gdx.input.setInputProcessor(inputAdapter);
}

答案 2 :(得分:1)

这是捕获按键组合的一种方法,这适用于名为JMenuItem的特定mniPrefUnlimitedReuse

mniPrefUnlimitedReuse.setAccelerator(getKeyStroke(VK_U, 
    SHIFT_DOWN_MASK | CTRL_DOWN_MASK));

当用户按下Ctrl-Shift-U时,菜单项会起作用。

你可能还需要一些像这样的代码,这是我为应用程序编写的实际代码的一部分:

  private  void cellsKeyPressedAction(KeyEvent e)
  {
    int key  = e.getKeyCode();
    int mods = e.getModifiers();

    if(key == VK_DELETE || key == BKSP || key == VK_SPACE)
      ... do same thing if the delete, backspace or space bar is hit ...

    if((mods & CTRL_MASK)  == CTRL_MASK)  ctrlIsDown  = true ;
    if((mods & SHIFT_MASK) == SHIFT_MASK) shiftIsDown = true;

    if(ctrlIsDown && shiftIsDown && key == VK_V)
      ... do something when user presses `Ctrl-Shift-V` ...

    if(     ctrlIsDown 
         && key > 0 
      )
        ... do something if user presses, e.g., `Ctrl-A` among others ...      

要为名为cells的对象调用该代码,KeyListener需要keyPressed

    cells.addKeyListener(new KeyListener() {
         public void keyPressed (KeyEvent e)
         {
            cellsKeyPressedAction(e);
         }
     });      

<强> 修改

鉴于你想使用libgdx来做,肯定逻辑和调用是相似的。例如,我在github的libgdx/libgdxtests/gdx-tests-lwjgl/src/com/badlogic/gdx/tests/lwjgl/LwjglTestStarter.java找到的内容看起来像纯Java。我不知道你是否可以找到libgdx的类似例程 - 你为什么要这样做?

list.addKeyListener(new KeyAdapter() {
                public void keyPressed (KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_ENTER) 
                       ... do something ...
                }
            });

我没有使用libgdx的经验,因此我不知道需要更换Java例程以检查按键操作。

也许谷歌?

编辑2

喔。 &#34;没有java&#34;例程。但为什么?我想我表现出了无知。但我想这就是原因:

The libgdx project is an open-source cross-platform game development library written in Java. It abstracts away the differences between writing OpenGL-based games on various platforms.

This link可能有所帮助。绝对是this tutorial。并且thisAnd thisAnd finally

再一次,我想一旦你学会了什么样的惯例&#39;名称是,keysPressed方法看起来很像我的Java例程,只是名称和参数列表略有不同。

编辑3

This可能是最好的。也许在咨询this之后修改它:

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;
      } 
      if (Gdx.input.isKeyPressed(Input.Keys.CONTROL_LEFT) || Gdx.input.isKeyPressed(Input.Keys.CONTROL_RIGHT))) {
          ctrl = true;
      } 
      if( Gdx.input.isKeyPressed(Input.Keys.ALT_LEFT) || Gdx.input.isKeyPressed(Input.Keys.ALT_RIGHT))) {
          alt = true;
      }
      // 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 */) {
          //...     
      }
}