Обработка нескольких ключевых событий libgdx

Я пытаюсь сделать игру, используя фреймворк 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;
}

}

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 в качестве обработчика ввода, вы можете просто сделать Gdx.input.setInputProcessor(new Keyboard()); или если вам нужно несколько InputProcessors (например, для этапа), вы можете использовать InputMultiplexer.

InputMultiplexer input;

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

Я уверен, что есть другие способы реализовать обработку ввода в вашем проекте libGDX, но я так и делаю.

Другие вопросы по тегам