Java получить клавиатуру, набранную в функции - PullRequest
0 голосов
/ 07 января 2019

Итак, я делаю игру на Java, и сейчас я работаю с клавиатурным вводом. У меня есть настройка класса keylistener под названием 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") определит, удерживается ли оно. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

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

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

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

0 голосов
/ 07 января 2019

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, и использовать код клавиши события, чтобы найти действие с этим кодом.

...