Как реализовать KeyListener для объекта в JFrame? - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь сделать Frogger в java для школьного проекта, но у меня много трудностей с настройкой KeyListener для реального персонажа лягушки.

Я пытался настроить привязки клавиш, запросить фокусировку для JPanel и JFrame, перемещаться туда, где инициируется персонаж, но, похоже, ничего не получалось. Это остатки моих попыток.

Это программа, которая запускает мою игру.

import javax.swing.*;

public class Frogger
{
 JFrame frame = new JFrame("Frogger");
 CPT c = new CPT();
 public Frogger()
 {
  frame.setBounds(0,0,700,500);
  frame.setResizable(false);
  frame.setVisible(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.add(c);
 }

 public static void main(String[] args){
   new Frogger();
 }

}

Основная игра

public CPT() {

    setLayout(new BorderLayout());
    label = new JLabel("Frogger");
    frame1 = new JFrame("Main");
    label.setFont(new Font("Serif", Font.BOLD,50));
    label.setBounds(275,10,250,250);
    button1 = new JButton("PLAY");
    button1.setBounds(300,350,100,50);
    button1.setOpaque(false);
    button1.setVisible(true);
    this.setOpaque(false);
    this.setLayout(null);
    this.add(label);


    button1.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setVisible(true);
        frame1.setSize(700,500);
        frame1.setResizable(false);
        frame1.setFocusable(false);
        button1.setVisible(false);
        frame1.add(new TrainCanvas());
        frame1.add(p1);
        p1.requestFocus();
      } 
    });
    this.add(button1); }

Это класс TrainCanvas, который рисует машины в играх, а также лягушку

  class TrainCanvas extends JComponent
 {
    private int lastX = 0;
    private int lastX_1 = 0;
    private int lastX_2 = 0;


    public TrainCanvas() {
      Thread animationThread = new Thread(new Runnable() {
        public void run() {
          while (true) {
            repaint();
            try {Thread.sleep(10);} catch (Exception ex) {}
          }
        }
      });

      animationThread.start();
    }

    public void paintComponent(Graphics g) {
      Graphics2D gg = (Graphics2D) g;

      //Draws Train 1
      int w = getWidth();
      int h = getHeight();

      int trainW_1 = 100;
      int trainH_1 = 5;
      int trainSpeed_1 = 3;

      int x = lastX + trainSpeed_1;

      if (x > w + trainW_1) {
        x = -trainW_1;
      }

      gg.setColor(Color.BLACK);
      gg.fillRect(x, h/2 + trainH_1, trainW_1, trainH_1);
      lastX = x;
      Graphics2D g3 = (Graphics2D) g;
      frog = new Rectangle(f_x,f_y,25,25);
      g3.fill(frog);
      g3.setColor(Color.GREEN);
   }
}

Наконец, слушатель клавиш

    public void keyPressed(KeyEvent e)
    {
      if(e.getKeyCode()== KeyEvent.VK_UP)
      {
        CPT.f_y -= 100;
        repaint();
      }
      else if(e.getKeyCode()== KeyEvent.VK_RIGHT)
      {
        CPT.f_x += 100;
        repaint();
      }
      else if(e.getKeyCode() == KeyEvent.VK_LEFT)
      {
        CPT.f_x -= 100;
        repaint();
      }
      else if(e.getKeyCode()==KeyEvent.VK_DOWN)
      {
        CPT.f_y += 100;
        repaint();
      }
      else {}
    }
    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {} 
}

Программа работает отлично, без каких-либо ошибок, что создает проблемы. Всякий раз, когда он попадает в главное окно игры, кажется, что ни одна из клавиш не работает.

...