Обработка нескольких ключевых событий 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, но я так и делаю.