KeyListeners не работают

Я создаю игру flappy bird, используя eclipse, и мои привязки клавиш для перемещения вверх или вниз не имеют никакого эффекта, и птица просто плюхается на нижнюю часть JFrame. Мне нужна помощь, если синтаксис правильный или нет, я даже добавил addKeyListener (this); В JFrame появляется овал, но это все, и он просто опускается на дно

    public FlappyBird() {
        // Creating the parameters of the size of the frame with a set size
        Dimension d = new Dimension(FlappyBird.WIDTH, FlappyBird.HEIGHT);
        setSize(d);

    // The initial positions for the setting and birdie
        setting = new Setting(100); 
        birdie = new Bird(20,FlappyBird.HEIGHT/2,setting.pipes);
        addKeyListener(this);
        requestFocus();
    }


    private void updateGame() {
        // TODO Auto-generated method stub
        setting.updateGame();
        birdie.updateGame();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            birdie.isPressed = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
        if (e.getKeyCode() == KeyEvent.VK_SPACE          ) {
            birdie.isPressed = false;
        }
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
}
 The second class is



public class Bird extends Rectangle {


    /**
     * 
     */
    // No idea what this does
    private static final long serialVersionUID = 1L;
    // Speed of the birdie
    private int speed = 4;
    // Checking if a certain key is pressed or not
    public boolean isPressed = false;
    private ArrayList <Rectangle> pipes;
    public Bird(int x, int y, ArrayList <Rectangle> pipes) {
        setBounds(x,y,32,32);
        this.pipes = pipes;
    }

    public void updateGame() {
        if (isPressed) {
            y-=speed;
        }
        else {
            y+=speed;
        }
        // If the birdie touches the pipes the window will close
        for (int k = 0; k < pipes.size(); k++) {
            if (this.intersects(pipes.get(k))) {
            System.exit(1);
        }
        }
    }
    public void renderGame(Graphics g) {
        g.setColor(Color.RED);
        g.fillOval(x, y, width, height);

    }

}

Ах, KeyListener, бедная, непонятая и ненадежная душа. Поймите, любой ответ, который не предлагает вам использовать вместо этого API привязки клавиш, является ненадежным взломом.

MadProgrammer 31.05.2018 08:48

Вы знаете, почему KeyListener с KeyEvent не работает?

Mason 31.05.2018 08:50

Десятки, выберите один. Чтобы компонент получал ключевые события, он должен быть фокусируемым И иметь фокус клавиатуры. Вы запрашиваете фокус в своем конструкторе, это говорит о том, что компонент еще не прикреплен к собственному одноранговому узлу, поэтому он может получить фокус. requestFocus тоже ненадежен. Как я уже сказал, я могу сказать 100 хаков, которые "могут" работать "иногда", но я могу сказать одно решение, которое будет работать все время - привязки клавиш

MadProgrammer 31.05.2018 08:53

Есть ли способ заставить его работать с помощью KeyListeners и KeyEvents?

Mason 31.05.2018 08:55

Не надежным способом - я не «нажимаю» на привязки клавиш, потому что они «личные» фавориты, я «предлагаю» их, потому что они работают надежно и предназначены для решения этой самой проблемы - пожалуйста, простите меня, но это Тип вопроса задают 2 или 3 раза в день - повторяющийся совет: используйте API привязки клавиш - это то, для чего

MadProgrammer 31.05.2018 08:57

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

Mason 31.05.2018 08:57

Ну, это пример и Другой и Другой, и я сослался на учебники в первом комментарии

MadProgrammer 31.05.2018 08:59

спасибо, кстати, может мой код не работает из-за того, что я не писал сканер для клавиатуры?

Mason 31.05.2018 09:01

Сканер предназначен для ввода с консоли, здесь он вам не поможет

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

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