Как использовать KeyListener без кнопки или текстовой области? - PullRequest
0 голосов
/ 06 февраля 2020

Я пишу игровую программу с использованием Java Swing и хочу получить ответ пользователя на движение прямо с клавиатуры, вместо того, чтобы заставлять их нажимать кнопки. Но все учебники, которые я нашел, должны связать действие с кнопкой, а затем связать действие с кнопками.

Можно ли дать программе ответ, просто нажав клавиши?

1 Ответ

0 голосов
/ 06 февраля 2020

Вы можете использовать AWTEventListeners. Они ловят любое Событие, независимо от того, какой Компонент в конечном итоге его получит (нет необходимости прослушивать какие-либо Компоненты, я протестировал его с одним JLabel в JFrame). Если абсолютно необходимо использовать KeyListener, вам нужно выполнить ручное преобразование. Пример такого преобразования для MouseListener (должно быть аналогично KeyListener):

if(event.getID() == MouseEvent.MOUSE_PRESSED) {
    listener.mousePressed(mouseEvent);
}

Примечание: я тоже создал Swing Games, и пока он работает, вы столкнетесь с проблемами с производительностью, если попытаетесь рендерить множество вещей, а повышение эффективности рендеринга изображений может стать очень сложным. Так что если у вас есть, например, Tiled Map, которая создает десятки квадратных изображений только для местности, а затем добавляет несколько npcs и множество пуль, ваша игра, скорее всего, будет неиграемой. Вот небольшой пример, который печатает коды клавиш при нажатии клавиши / мыши и координаты мыши при ее перемещении. Также выходит из приложения, если нажата ESCAPE:

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

    @Override
    public void eventDispatched(AWTEvent event) {
        if(event instanceof KeyEvent){
            KeyEvent keyEvent = (KeyEvent) event;
            if(keyEvent.getID() == KeyEvent.KEY_PRESSED){
                System.out.println("Key pressed: " + keyEvent.getKeyCode());
                if(keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE){
                    System.exit(0);
                }
            }
        }else if(event instanceof MouseEvent){
            MouseEvent mouseEvent = (MouseEvent) event;
            if(mouseEvent.getID() == MouseEvent.MOUSE_PRESSED){
                System.out.println("Mouse pressed: " + mouseEvent.getButton());
            }else if(mouseEvent.getID() == MouseEvent.MOUSE_MOVED){
                System.out.println("Mouse moved to " + mouseEvent.getXOnScreen() + "/" + mouseEvent.getYOnScreen());
            }
        }
    }
}, AWTEvent.KEY_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK + AWTEvent.MOUSE_MOTION_EVENT_MASK);
...