重置游戏循环/重启游戏java swing

时间:2018-02-26 14:36:04

标签: java swing game-loop

我正在开发Java Snake游戏。大多数基本功能都已完成,我试图添加一个重启功能,当你在游戏结束时按ENTER键时会触发。所有逻辑semms工作,蛇重置开始位置,苹果获得新的随机位置等。但由于某种原因我的JPanels将不会重绘。你们可以看看你是否能弄明白我做错了什么。

我通过游戏循环,重置功能等从我的代码中创建了快照。如果您需要更多功能,请告诉我。

/*
     * Main class, game loop, keyListener etc
     */

    /*
     * Here is my run method with game loop when gameOver, snake will no longer
     * update.
     * 
     */
    @Override
    public void run() {
        // game loop
        while (running) {
            if (!gameOver) {                
                update();
            }

            MainFrame.paint();

            try {
                Thread.sleep(60);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

/*
 * KeyListener, when ENTER is pressed call resetGame() method.
 */
if(key.getKeyCode()==KeyEvent.VK_ENTER && gameOver) {
    resetGame();
}


    /*
     * resetGame method where I reset variables, create new default snake, 
     * clear JPanels etc.
     */
    public void resetGame() {
        score = 0;
        snake.clear(); // clear arraylist

        // .removAll() on both JPanels
        MainFrame.clear();

        // fields
        gameOver = false;
        newGame = true;

        direction = Direction.RIGHT;

        // create default snake
        snake = new ArrayList<Point>();
        size = 5;
        for (int i = 0; i < size; i++) {
            snake.add(new Point((size - i - 1) * MainFrame.getTileSize(), 0));
        }
        System.out.println(snake);

        // create apple and set to random location
        apple = randomApple();
    }

    /*
     * MainFrame extends JFrame  
     * methods for repainting and clearing JPanels
     */

    public static void paint() {

        gamePanel.repaint();
        sideHud.repaint();
    }

    public static void clear() {
        gamePanel.removeAll();
        sideHud.removeAll();

        paint();
    }

我的JPanels非常基础。我只是使用Graphics2D对象在paintComponent方法中绘制所有内容。

这是我最近的解决方案(不起作用)。我也试过,离开游戏循环,然后再次在resetGame()方法中调用run(),我尝试在按下ENTER时创建一个新的Main对象,但没有一个工作。

提前致谢。

1 个答案:

答案 0 :(得分:0)

首先通过if检查游戏是否结束,然后创建一个在游戏结束时设置为true的布尔值。当布尔值变为true时,创建一个被调用的方法,该方法将重置游戏方法中的所有变量以及与游戏相关的任何其他变量。然后调用游戏方法(无论什么触发你的游戏工作)。你的游戏Voila重新帮助了希望。