繁体   English   中英

Java:卡住了暂停功能

[英]Java: Stuck making a pause function

我是Java的新手,并且正在尝试创建类似pong的游戏。 我创建了一个暂停功能,当玩家按下空格键时,该功能可以阻止游戏运行。 我非常坚持到底该怎么做。 现在,当我击中太空时,球停了下来,但是当我暂停时,球变得比以前快得多。 我也很确定这种方式是行不通的。 任何有关如何执行此操作的帮助将不胜感激。

这是我的图形课

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();
            }
        }
    }

}

我知道这段代码非常混乱,对此感到抱歉

  1. 您的gamePaused()方法不应为静态。 使它成为实例变量。
  2. 您的GetKeyStroke类不应创建新的GraphicRender对象。 而是通过构造函数参数将当前查看的GraphicRender对象传递给此类。
  3. 然后在当前查看的GraphicRender对象上调用您的pause和start方法。
  4. 为了我的钱,我将在Timer对象上有我的暂停方法调用stop() ,在我的Timer对象上有我的重启方法调用start()
  5. 为此,最好使用Key Bindings,而不要使用KeyListener。 Oracle Key Bindings教程将解释为什么会这样。

要将一个类的引用传递给另一个类,只需使用诸如构造函数参数之类的参数即可。 例如,

class MyBar {

   private MyFoo myFoo;

   public MyBar(MyFoo myFoo) {
      this.myFoo = myFoo;
   }

   public void someMethod() {
      if (!myFoo.isBazz()) {
         myFoo.setBazz(true);
      } else {
         myFoo.startBazzer();
      }
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM