Функция Keylistener не работает, и когда я нажимаю клавиши со стрелками, ничего не происходит.
Этот файл является BrickBreaker.java, главный файл.
import javax.swing.JFrame; /*necessary to add a obj in which game will run.*/ public class BrickBreaker { public static void main(String[] args) { JFrame obj=new JFrame(); GamePlay gp=new GamePlay(); obj.setSize(700,600); //750,560 obj.setTitle("Generic Classic BrickBreaker"); obj.setResizable(true); obj.setVisible(true); obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); obj.add(gp); } }
Ниже приведен второй файл GamePlay.java
import javax.swing.JPanel; //Lets you create GUI components like buttons,scroll bars,etc. import javax.swing.Timer; import java.awt.event.KeyListener; //detect key presses*/ import java.awt.event.ActionListener; //performing actions on objects of game*/ import java.awt.event.ActionEvent; //awt is Abstract Window Toolkit, used to develop GUI import java.awt.event.KeyEvent; import java.awt.Graphics; import java.awt.Color; public class GamePlay extends JPanel implements KeyListener, ActionListener { boolean play=true; //so that game doesn't start by itself int score=0; //the methods from KeyListener and ActionListener int totalBricks=21; //listed here are compulsory for the code to run Timer time; //Timer is a module, allows timecheck int delay=8; //speed of timer int playerX=310; //starting for slider int ballX=120; //starting X co-ord of ball int ballY=350; //starting Y co-ord of ball int ballXdir=-1; //direction of ball? int ballYdir=-2; public static void main(String[] args){} public void GamePlay() //Constructor:(Similar to a method)Block of code, that's called when an { //instance of the method is created. this.addKeyListener(this); //to work with KL, need this statement setFocusable(true); //allows object to be focused. setFocusTraversalKeysEnabled(false); //allows keys to be used time = new Timer(delay, this); //initialize timer time.start(); } public void paint(Graphics g) { //background details g.setColor(Color.black); g.fillRect(1,1,692,592); //borders g.setColor(Color.blue); g.fillRect(0,0,3,592); g.fillRect(0,0,692,3); g.fillRect(691,0,3,592); //user bar g.setColor(Color.blue); g.fillRect(playerX,550,100,8); //ball g.setColor(Color.green); g.fillOval(ballX,ballY,10,10); g.dispose(); } @Override public void actionPerformed(ActionEvent e){ //method from ActionListener time.start(); } @Override public void keyTyped(KeyEvent e){ //method from KeyListener repaint(); } @Override public void keyReleased(KeyEvent e){} //method from KeyListener @Override public void keyPressed(KeyEvent e) //method from KeyListener { if(e.getKeyCode() == KeyEvent.VK_RIGHT) { if(playerX>=600) { playerX=600; } else { moveRight(); } } if(e.getKeyCode() == KeyEvent.VK_LEFT) { if(playerX<10) { playerX=10; } else { moveLeft(); } } repaint(); } public void moveRight() { play = true; //need to change as it was set to false initially playerX+=100; //when right key is pressed, move 20 pixels to the right } public void moveLeft() { play = true; //need to change as it was set to false initially playerX-=100; //when right key is pressed, move 20 pixels to the right } }
Что я уже пробовал:
Я перепробовал множество комбинаций и различных вариантов размещения моей функции repaint (). Я также попытался внести изменения в time.start() или таймер в целом. Я подумал, что, возможно, это и было причиной проблемы. Это игра BrickBreaker, я изучаю Java. Ползунок не двигается, когда я нажимаю клавиши со стрелками, и я, кажется, не могу понять, что не так. Я также проверил, обновляю ли я переменные записи, и думаю, что да. Пожалуйста, помогите мне, это сводит меня с ума.
Richard MacCutchan
Пожалуйста, отредактируйте свой вопрос и объясните, в чем проблема. И пожалуйста, не кричите, т. е. печатайте заглавными буквами, так как это считается грубостью.
Member 13474025
Мне очень жаль :) Я исправил то, что я пробовал часть, не могли бы вы помочь мне, пожалуйста?
Richard MacCutchan
В вашем коде чего - то не хватает- он никогда не запускается.
Member 13474025
У меня уже было это в моем коде, то, что я думаю, вы имеете в виду .. Я упомянул, что у меня есть JFrame. Я просто добавил его сюда. Будьте добры, взгляните.
Richard MacCutchan
Ладно, я не совсем понимаю, что происходит, но ни одно из ваших ключевых событий обработки не срабатывает. Взгляните на пример кода по адресу Пример Кода Java Tutorials[^] чтобы увидеть, что вы можете делать по-другому.
Member 13474025
Ладно, я обязательно посмотрю. Но, пожалуйста, позвольте мне немного объяснить эту вещь.
Всякий раз, когда я нажимаю клавишу, ползунок должен двигаться, шарик должен двигаться. Поэтому холст нужно перекрасить, чтобы показать движение. Проблема с моим кодом заключается в том, что либо холст не перекрашивается, потому что я неоднократно вызываю свою функцию repaint() в неправильном положении, либо мои ключи не улавливаются моим Java-кодом.
В последнем случае я не совсем понимаю, почему это происходит.
Кроме того, изменения координат, которые я делаю, не настолько малы, чтобы даже если доска движется, я не мог бы ее увидеть.
Richard MacCutchan
Я знаю, что должен делать код, и, насколько это возможно, он выглядит логически правильным. Единственная проблема заключается в том, что ваши события keylistener не принимаются в вашей программе. Это должно быть как-то связано с тем, как вы создали свой JFrame, но я не эксперт в программировании JAVA GUI, поэтому не могу понять, что не так. Я добавил несколько операторов печати, чтобы проверить его, и единственный, который вышел, был из вашего метода рисования.
Member 13474025
Так что же, по-вашему, происходит не так? Какие выводы вы могли бы сделать из печатных заявлений и их результатов?
Кроме того, если вы знаете кого-то, потому что я новичок на этом сайте, не могли бы вы порекомендовать кому-то взглянуть на эту проблему?
Richard MacCutchan
Я уже объяснял, что не уверен, что это неправильно. Но очевидно, что что-то в структуре вашего кода препятствует отправке ключевых событий вашим обработчикам событий. Вам нужно перейти к документации и изучить правила, а также некоторые примеры кода.
У нас нет группы экспертов, к которым вы можете обратиться для исправления вашего кода. Каждый здесь предлагает свою помощь в свое время и бесплатно для вас, и никаких гарантий обслуживания не дается. Если никто не приходит с решением, то вы должны попробовать другие вещи сами.
ThilinaMD
Вместо VK_RIGHT и VK_LEFT попробуйте использовать фактический код ключа 39 и 37. evt.getKeyEvent==39