Я создаю игру 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 с KeyEvent не работает?
Десятки, выберите один. Чтобы компонент получал ключевые события, он должен быть фокусируемым И иметь фокус клавиатуры. Вы запрашиваете фокус в своем конструкторе, это говорит о том, что компонент еще не прикреплен к собственному одноранговому узлу, поэтому он может получить фокус. requestFocus тоже ненадежен. Как я уже сказал, я могу сказать 100 хаков, которые "могут" работать "иногда", но я могу сказать одно решение, которое будет работать все время - привязки клавиш
Есть ли способ заставить его работать с помощью KeyListeners и KeyEvents?
Не надежным способом - я не «нажимаю» на привязки клавиш, потому что они «личные» фавориты, я «предлагаю» их, потому что они работают надежно и предназначены для решения этой самой проблемы - пожалуйста, простите меня, но это Тип вопроса задают 2 или 3 раза в день - повторяющийся совет: используйте API привязки клавиш - это то, для чего
О, хорошо, я вижу, ты знаешь, как я могу заставить работать сочетания клавиш в этой игре, извини, я новичок и не понимаю половины того, что я делаю
Ну, это пример и Другой и Другой, и я сослался на учебники в первом комментарии
спасибо, кстати, может мой код не работает из-за того, что я не писал сканер для клавиатуры?
Сканер предназначен для ввода с консоли, здесь он вам не поможет




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