Java получить клавишу клавиатуры, введенную в функцию

Итак, я делаю игру на java, и сейчас я работаю с вводом с клавиатуры. У меня есть настройка класса прослушивателя ключей под названием KeyboardManager и в нем статическая функция, которая определяет, удерживается ли клавиша. вот код для этого класса:

public class KeyboardManager implements KeyListener {

    public static Map<Integer, Boolean> keys;

    public KeyboardManager () {
        keys = new HashMap<>();
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        keys.put(e.getKeyCode(), true);
    }

    @Override
    public void keyReleased(KeyEvent e) {
        keys.put(e.getKeyCode(), false);
    }

    public static boolean isKeyDown(int key) {
        if (!keys.containsKey(key)) return false;
        return keys.get(key);
    }
}

Функция isKeyDown работает отлично, и я использую ее для перемещения игрока, но если я использую ее для открытия графического интерфейса, например, инвентаря игрока, как вы понимаете, она открывается и закрывается с каждым тиком. Я ищу способ сделать то, что у меня есть сейчас, но с keyTyped вместо keyPressed и keyReleased. Проблема здесь, очевидно, в том, что невозможно определить, когда заканчивается тип ключа. Например, в Unity, когда вы кодируете на C#, вы можете сделать что-то вроде Input.GetKeyDown("E"), и он будет проверять тип ключа, тогда как Input.GetKey("E") определит, удерживается ли он. Любая помощь будет оценена.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
913
2

Ответы 2

keyTyped запускается при отпускании клавиши, поэтому вместо проверки в другом месте, нажата ли клавиша, вы можете добавить свой ответ на событие в саму функцию обработки событий:

@Override
public void keyTyped(KeyEvent e) {
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_I) {
        if (!isInventoryOpen) {
            openInventory();
        } else {
            closeInventory();
        }
    } else if (code == KeyEvent.VK_M) {
        // ...
    } // else if ...
}

Если у вас сложный набор взаимодействий, вы можете создать абстрактный класс с уникальным подклассом для каждого действия, содержащим соответствующий код клавиши и действие, которое нужно выполнить. Затем вы можете сохранить список или карту всех действий, которые будут использоваться в вашем keyTyped, и использовать ключевой код события, чтобы найти действие с этим ключевым кодом.

Это прекрасный способ сделать это, но у меня есть статический класс, и я хочу, чтобы статическая функция проверяла, был ли введен ключ. Спасибо за ответ.

oriont 07.01.2019 21:22

@oriont В зависимости от желаемого поведения (например, как долго ваш статический метод isKeyTyped будет возвращать истину после ввода ключа), вы можете сохранить еще один Map<Integer, Boolean> набранных ключей и перевернуть ключевой код на true в keyTyped, а затем, получив к нему доступ в isKeyTyped, перевернуть код ключа обратно на false.

FThompson 07.01.2019 21:29

В проекте, над которым я работаю, мои ключевые слушатели привязаны к определенным видимым панелям. (один и тот же ключ имеет варианты аналогичного действия, например KeyEvent.VK_ENTER для отправки)

Возможно, вы сможете реализовать флаг среднего человека, что-то для переключения при нажатии клавиши и переключения назад, когда клавишу можно нажать / зарегистрировать снова.

Эта ссылка, java keylistener не вызывается, была для меня очень полезной, так как мне также потребовались привязки клавиш (слушатели TextField и JPanel)

Комментарий @Vulcan к его посту в том же духе, что и к «Куда я шел с флагом посредника».

DarceVader 07.01.2019 21:45

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