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

Posted

技术标签:

【中文标题】重置游戏循环/重新启动游戏 java swing【英文标题】:Reset game loop / restart game java swing 【发布时间】:2018-02-26 14:36:04 【问题描述】:

我正在开发一个 Java Snake 游戏。大多数基本功能都已完成,我正在尝试添加一个重新启动功能,当您在游戏结束时按 ENTER 时将触发该功能。所有逻辑都正常工作,蛇重置到起始位置,苹果获得新的随机位置等。但由于某种原因,我的 JPanel 不会重新绘制。你们能不能看看我做错了什么。

我已经使用游戏循环、重置功能等从我的代码中制作了快照。如果您需要更多信息,请告诉我。

/*
     * 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();
    

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

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

提前致谢。

【问题讨论】:

If() 是您声明的方法吗?因为Java关键字if是区分大小写的。 是的,很抱歉。我在这里添加了 if 语句,只是为了澄清。但我不小心输入了大写的 i。 I have also tried... - 你做错了什么。我们无法根据提供的代码告诉您问题所在。我建议您需要一个简单的方法,例如:playGame()。可以在您第一次玩游戏以及想要开始另一个游戏时调用此方法。此方法将负责设置游戏的属性,然后启动 Thead 玩游戏。因此,除了蛇和苹果的位置之外,还需要重置“running”和“gameOver”等变量。 代码太不完整,无法回答... MainFrame.paint() 是做什么的?清除()?等等。面板在哪里创建/重新创建,等等。 【参考方案1】:

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

【讨论】:

以上是关于重置游戏循环/重新启动游戏 java swing的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing 2D 面板数组不使用 Swing 计时器重新绘制

《游戏学习》Java版仿windows扫雷小游戏源码

《游戏学习》Java版仿windows扫雷小游戏源码

如何在游戏循环中使用 repaint() 方法

java猜数字游戏代码

如何重新启动应用程序的更新循环