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




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 В зависимости от желаемого поведения (например, как долго ваш статический метод isKeyTyped будет возвращать истину после ввода ключа), вы можете сохранить еще один Map<Integer, Boolean> набранных ключей и перевернуть ключевой код на true в keyTyped, а затем, получив к нему доступ в isKeyTyped, перевернуть код ключа обратно на false.
В проекте, над которым я работаю, мои ключевые слушатели привязаны к определенным видимым панелям. (один и тот же ключ имеет варианты аналогичного действия, например KeyEvent.VK_ENTER для отправки)
Возможно, вы сможете реализовать флаг среднего человека, что-то для переключения при нажатии клавиши и переключения назад, когда клавишу можно нажать / зарегистрировать снова.
Эта ссылка, java keylistener не вызывается, была для меня очень полезной, так как мне также потребовались привязки клавиш (слушатели TextField и JPanel)
Комментарий @Vulcan к его посту в том же духе, что и к «Куда я шел с флагом посредника».
Это прекрасный способ сделать это, но у меня есть статический класс, и я хочу, чтобы статическая функция проверяла, был ли введен ключ. Спасибо за ответ.