Java:暂停功能无法实现

Java:暂停功能无法实现,java,graphics,Java,Graphics,我是Java的新手,我正在尝试创建一个类似乒乓球的游戏。我创建了一个暂停功能,当玩家按下空格键时,它会停止游戏运行。我一直在想到底该怎么做。现在,当我击中空间时,球停止了,但当我取消暂停时,球变得比以前快得多。我也很确定这种方法是行不通的。任何关于如何做到这一点的帮助都将不胜感激 这是我的图形课 public class GraphicRender extends JPanel implements ActionListener { //Object for Random Ra

我是Java的新手,我正在尝试创建一个类似乒乓球的游戏。我创建了一个暂停功能,当玩家按下空格键时,它会停止游戏运行。我一直在想到底该怎么做。现在,当我击中空间时,球停止了,但当我取消暂停时,球变得比以前快得多。我也很确定这种方法是行不通的。任何关于如何做到这一点的帮助都将不胜感激

这是我的图形课

public class GraphicRender extends JPanel implements ActionListener {

    //Object for Random
    Random random = new Random();

    //Timer on 5ms clock
    Timer timer = new Timer(5, this);

    //Variables for the coordinates of the player and enemy
    public static int paddleLX = 12, paddleLY = 400, paddleLW = 5, paddleLH = 70, paddleLXV, paddleLYV;
    public static int ballX = 400, ballY = 400, ballXV, ballYV;

    public static boolean gamePaused = false;

    //Constructor to initialise objects
    public GraphicRender() {
        timer.start();

        this.setFocusable(true);
        this.requestFocusInWindow(true);

        //Adds the keyListener
        addKeyListener(new GetKeyStroke());

    }

    //Graphic rendering
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.BLACK);
        draw(g);


    }

    public void draw(Graphics g) {
        g.setColor(Color.GRAY);

        //Walls
        g.fillRect(0, 1, 8, 800);
        g.fillRect(0, 1, 800, 8);
        g.fillRect(0, 755, 800, 8);
        g.fillRect(777, 1, 8, 800);

        //Ball
        g.setColor(Color.WHITE);
        g.fillRect(ballX, ballY, 5, 5);

        //Left Paddle
        g.fillRect(paddleLX, paddleLY, paddleLW, paddleLH);


    }

    public void startBall() {
        ballXV = -1;
        ballX += ballXV;
        ballY += ballYV;
        repaint();

    }

    public void startGame() {
        gamePaused = false;
        startBall();

    }

    public static void pauseGame() {
        gamePaused = true;
    }


    public void actionPerformed(ActionEvent e) {

        if(!gamePaused) 
            startGame();
        if(gamePaused)
            pauseGame();

    }

}
这里是键绑定类

package game.util;

import game.render.GraphicRender;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class GetKeyStroke extends KeyAdapter{

    public void keyPressed(KeyEvent e) {

        GraphicRender gRndObj = new GraphicRender();

        if(e.getKeyCode() == KeyEvent.VK_SPACE) {
            if(!GraphicRender.gamePaused) {
                System.out.println("Game is not paused");
                GraphicRender.pauseGame();

            }else{
                System.out.println("Game is paused");
                gRndObj.startGame();
            }
        }
    }

}
我知道这个代码非常混乱,所以对此表示抱歉

  • 您的
    gamePaused()
    方法不应是静态的。将其设置为实例变量
  • GetKeyStroke类不应创建新的GraphicRender对象。而是通过构造函数参数将当前查看的GraphicRender对象传递到此类中
  • 然后对当前查看的GraphicRender对象调用pause和start方法
  • 为了我的钱,我会在Timer对象上调用pause方法
    stop()
    ,在Timer对象上调用restart方法
    start()
  • 最好使用键绑定,而不是键侦听器。Oracle密钥绑定教程将解释为什么会这样

  • 要将一个类的引用传递给另一个类,只需使用构造函数参数之类的参数。比如说,

    class MyBar {
    
       private MyFoo myFoo;
    
       public MyBar(MyFoo myFoo) {
          this.myFoo = myFoo;
       }
    
       public void someMethod() {
          if (!myFoo.isBazz()) {
             myFoo.setBazz(true);
          } else {
             myFoo.startBazzer();
          }
       }
    }
    

    谢谢你的意见,真的很有帮助!就像我说的,我对Java非常陌生,所以你能告诉我如何通过构造函数传入GraphicRender类,并在按键方法中使用它吗?只是把我的代码弄乱了,现在完全可以工作了。非常感谢你的帮助。