Как переопределить Java KeyListener в окне? - PullRequest
0 голосов
/ 29 сентября 2019

Итак, я пишу простую файтинговую игру на Java, которая включает в себя как титульный экран JPanel, так и Playspace JPanel. У меня возникли некоторые проблемы с работой KeyListener Playspace после добавления титульного экрана. Я пробовал множество других предложений из других постов SO, и пока не видел ни одной работы. Ниже представлен мой конструктор Playspace с режимом int для одного или нескольких игроков, а приложение для JFrame. Следует отметить, что экраны «Заголовок» и «Воспроизведение» находятся в одном и том же кадре.

/** Constructor, sets frame and arrays up **/
    public Playspace(int mode, Application app) {

        // Sets up JPanel
        super();

        // Application variables
        this.app = app;
        HEIGHT = app.getHeight();
        WIDTH = app.getWidth();
        setLayout(null);
        setLocation(0, 0);
        setSize(WIDTH, HEIGHT);
        backgroundColor = new Color(50, 50, 60);
        backgroundColor.brighter();
        setBackground(backgroundColor);
        setVisible(true);
        setFocusable(true);
        requestFocusInWindow();
        addKeyListener(new KeyListener() {
            /** Keypress detection **/
            @Override
            public void keyPressed(KeyEvent e) {

                int i = 0;
                if (runnable[i]) {
                    // WASD Controls
                    if (e.getKeyCode() == KeyEvent.VK_A) {
                        players[i].setLeftPressed(true);
                        players[i].setDirection(-1);
                    }

                    if (e.getKeyCode() == KeyEvent.VK_D) {
                        players[i].setRightPressed(true);
                        players[i].setDirection(1);
                    }

                    if (e.getKeyCode() == KeyEvent.VK_S) {
                        players[i].setDownPressed(true);
                    }

                    if (e.getKeyCode() == KeyEvent.VK_W) {
                        players[i].setUpPressed(true);
                        players[i].setUpReleased(false);
                    }

                    if (e.getKeyCode() == KeyEvent.VK_SHIFT && e.getKeyLocation() == KeyEvent.KEY_LOCATION_LEFT
                            && players[i].isShiftReleased()) {
                        players[i].setShiftPressed(true);
                        players[i].setShiftReleased(false);
                    }
                }

                i = 1;
                if (runnable[i]) {
                    // ULDR Controls
                    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                        players[i].setLeftPressed(true);
                        players[i].setDirection(-1);
                    }

                    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                        players[i].setRightPressed(true);
                        players[i].setDirection(1);
                    }

                    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                        players[i].setDownPressed(true);
                    }

                    if (e.getKeyCode() == KeyEvent.VK_UP) {
                        players[i].setUpPressed(true);
                        players[i].setUpReleased(false);
                    }

                    if (e.getKeyCode() == KeyEvent.VK_SHIFT && e.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT
                            && players[i].isShiftReleased()) {
                        players[i].setShiftPressed(true);
                        players[i].setShiftReleased(false);
                    }
                }
            }

            /** Key Release detection **/
            @Override
            public void keyReleased(KeyEvent e) {

                if (e.getKeyCode() == KeyEvent.VK_F11) {
                    developerMode = !developerMode;
                }

                int i = 0;
                // WASD Controls
                if (e.getKeyCode() == KeyEvent.VK_A) {
                    players[i].setLeftPressed(false);
                }

                if (e.getKeyCode() == KeyEvent.VK_S) {
                    players[i].setDownPressed(false);
                }

                if (e.getKeyCode() == KeyEvent.VK_D) {
                    players[i].setRightPressed(false);
                }

                if (e.getKeyCode() == KeyEvent.VK_W) {
                    players[i].setUpPressed(false);
                    players[i].setUpReleased(true);
                }
                if (e.getKeyCode() == KeyEvent.VK_SHIFT && e.getKeyLocation() == KeyEvent.KEY_LOCATION_LEFT) {
                    players[i].setShiftPressed(false);
                    players[i].setShiftReleased(true);
                }

                i = 1;
                // ULDR Controls
                if (e.getKeyCode() == KeyEvent.VK_UP) {
                    players[i].setUpPressed(false);
                    players[i].setUpReleased(true);
                }

                if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    players[i].setDownPressed(false);
                }

                if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                    players[i].setLeftPressed(false);
                }

                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    players[i].setRightPressed(false);
                }

                if (e.getKeyCode() == KeyEvent.VK_SHIFT && e.getKeyLocation() == KeyEvent.KEY_LOCATION_RIGHT) {
                    players[i].setShiftPressed(false);
                    players[i].setShiftReleased(true);
                }
            }

            /** We need this, but would rather forget it... **/
            @Override
            public void keyTyped(KeyEvent e) {
            }
        });
        setVisible(true);

** Это продолжается с этого момента, но это настройка полностью

Благодаря всему этомуможет предоставить справку

Еще одно примечание. Я попытался добавить некоторые операторы печати в KeyListener, но безрезультатно, что слушатель никогда не вызывается.

...