【问题标题】:Handling multiple key events libgdx处理多个关键事件 libgdx
【发布时间】:2015-08-02 12:47:26
【问题描述】:

我正在尝试使用 libgdx 框架制作游戏。 我正在使用 InputAdapter 来检查按键事件,一切正常,直到一次按下 3 个以上的键。 如果玩家在对角线移动并同时射击,我需要 3 个或超过 3 个关键事件。 由于某种原因,输入适配器仅注册前 2 个键事件,并且在其中一个键启动之前不会注册新的按下事件。

public class MyInputProcessor extends InputAdapter{

public boolean keyDown(int k)
{
    switch (k)
    {


        case Keys.LEFT:
        MyInput.setKey(MyInput.LEFT, true);
        break;

        case Keys.UP:
            MyInput.setKey(MyInput.UP, true);

            break;
        case Keys.DOWN:
            MyInput.setKey(MyInput.DOWN, true);

            break;
        case Keys.RIGHT:
            MyInput.setKey(MyInput.RIGHT, true);

            break;
        case Keys.Z:
            MyInput.setKey(MyInput.SHOOT, true);

            break;
        case Keys.ESCAPE:
            MyInput.setKey(MyInput.ESC, true);

            break;
    }

    return true;
}
public boolean keyUp(int k)
{
    switch (k)
    {


        case Keys.LEFT:
        MyInput.setKey(MyInput.LEFT, false);
        break;

        case Keys.UP:
            MyInput.setKey(MyInput.UP, false);
            break;
        case Keys.DOWN:
            MyInput.setKey(MyInput.DOWN, false);
            break;
        case Keys.RIGHT:
            MyInput.setKey(MyInput.RIGHT, false);
            break;
        case Keys.Z:
            MyInput.setKey(MyInput.SHOOT, false);
            break;
        case Keys.ESCAPE:
            MyInput.setKey(MyInput.ESC, false);
            break;
    }

    return true;
}

}

【问题讨论】:

  • 这可能不是 libgdx 问题,而是您的键盘问题。大多数键盘无法识别超过 3 个键或仅特定键的组合键。
  • 这似乎是原因!谢谢! :)
  • 遇到同样问题的人,请尝试不同的密钥集。我在使用“Z”和箭头键时遇到了问题,但“X”工作正常!希望这会有所帮助。

标签: libgdx game-engine


【解决方案1】:

当我在 libGDX 中处理输入时,我通常会创建自己的类,其中包含对每个键的布尔数组的静态引用,然后在按下按钮时检查我的游戏代码。

这是一个例子:

public class InputHandler {

    public static final int NUM_KEYBOARD_KEYS = 155; // Input.Keys in libGDX has 155 keys.

    public static boolean[] keys;
    public static boolean[] pkeys;
    static {
        keys = new boolean[NUM_KEYBOARD_KEYS];
        pkeys = new boolean[NUM_KEYBOARD_KEYS];
    }

    public static void setKey(int i, boolean b) { keys[i] = b; }
    public static boolean isDown(int i) { return keys[i]; }
    public static boolean isPressed(int i) { return keys[i] && !pkeys[i]; }

    public static void update() {
        for(int i = 0; i < NUM_KEYBOARD_KEYS; i++)
            pkeys[i] = keys[i]; 
    }

}

这样我就可以在代码中的任何位置简单地调用InputHandler.isPressed(Keys.Key)InputHandler.isDown(Keys.key)

为了在 InputHandler 中设置值,我使用了另一个扩展 InputAdapter 的类。

public class Keyboard extends InputAdapter {

    public boolean keyDown(int k) {
        InputHandler.setKey(k, true);
        return true;
    }

    public boolean keyUp(int k) {
        InputHandler.setKey(k, false);
        return true;
    }

}

要将 Keyboard 类注册为 inputhandler,您只需执行 Gdx.input.setInputProcessor(new Keyboard()); 即可,或者如果您需要多个 InputProcessor(例如用于舞台),则可以使用 InputMultiplexer。

InputMultiplexer input;

public void func() {
   input.add(new Keyboard());
   input.add(someOtherInputProcessor());
}

我确信还有其他方法可以在您的 libGDX 项目中实现输入处理,但我就是这样做的。

【讨论】:

  • 我就是这样做的,但问题似乎出在我的键盘上!谢谢 ! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多