当我添加游戏循环时,为啥我的 Java 游戏会崩溃?

Posted

技术标签:

【中文标题】当我添加游戏循环时,为啥我的 Java 游戏会崩溃?【英文标题】:Why is my Java game crashing when I add a game loop?当我添加游戏循环时,为什么我的 Java 游戏会崩溃? 【发布时间】:2020-11-02 02:04:26 【问题描述】:

我最近开始尝试学习java。我想也许制作小游戏是熟悉 java 的最好方法,所以这就是我正在做的事情。所以,我开始了我的第一场比赛,看起来不错。这只是一个以玩家为中心的网格。一旦我尝试添加玩家移动,我意识到我需要一个游戏循环来检查按键。这就是我尝试过的。我只能说我以前从未制作过游戏循环,所以这是我尝试的:

public static void main(String[] args) 
    GamePanel panel = new GamePanel();
    
    SwingUtilities.invokeLater(new Runnable() 
        public void run() 
            createGui();
            
            double ns = 1000000000.0 / 60.0;
            double delta = 0;

            long lastTime = System.nanoTime();
            long timer = System.currentTimeMillis();

            while (true) 
                long now = System.nanoTime();
                delta += (now - lastTime) / ns;
                lastTime = now;

                while (delta >= 1) 
                    panel.checkKeys();
                    delta--;
                
            
        
    );

问题出在这里...当我运行它时,我的游戏就崩溃了。它甚至不让我退出游戏。到底是怎么回事?以防万一,我将展示更多GamePanel 代码(如果您需要更多代码,请告诉我)。

public GamePanel() 
    setLayout(new GridLayout(tiles_count, tiles_count));
    setBackground(Color.gray);
    setFocusable(true);
    addKeyListener(this);
    
    tile_size = 40;


@Override
public void keyPressed(KeyEvent e) 
    if(e.getKeyCode() == KeyEvent.VK_A) 
        System.out.println("A PRESSED");
        player.x += 40;
        left = true;
    


@Override
public void keyReleased(KeyEvent e) 
    if(e.getKeyCode() == KeyEvent.VK_A) 
        System.out.println("A RELEASED");
        left = false;
    


@Override
public void keyTyped(KeyEvent e) 
    


public void checkKeys() 
    if(left) 
        System.out.println("LEFT");
     else 
        System.out.println("!LEFT");
    

游戏结构是这样的:我有一个Main 类,它运行一个GamePanel 类作为main(String args) 函数。这个问题可能与我在Main 类而不是GamePanel 类中使用run 方法有关。 我究竟做错了什么?非常感谢任何帮助!

【问题讨论】:

你有剩下的 Swing 代码吗?我没有看到你初始化和运行 swing 代码库的任何地方。 【参考方案1】:

您的while 循环将永远不会退出,因此您的程序永远不会重新绘制等。

但是,对于这样的游戏循环,您确实想要一个无限循环 --- 您只想在不同的线程中运行它。这样,您的程序的其余部分就不会被无限循环阻塞,但是您仍然可以运行您的游戏循环任务。

为此,我们创建一个新线程,并在其中运行我们的循环。另请注意,在每个循环之后,我们会休眠一段时间(理想情况下,您希望使用时间增量等来执行此操作,这只是一个示例)——这意味着我们限制了每秒的帧数,这意味着我们不会无缘无故地过度使用处理器。

Thread t = new Thread(new Runnable()
    public void run() 
        while (true) 

            // your update logic here

            try 
                Thread.sleep(16);
            
            catch(InterruptedException) 
        
    
);
t.start();

【讨论】:

很高兴我能帮上忙 :)【参考方案2】:

我认为问题在于您有一个无限循环。当您的循环的条件始终保持为真时,就会发生这种情况。 while(True)。您要么需要实现一个break; 语句来终止循环,要么在while 循环中使用一个条件来运行循环,直到满足某个条件while(some-condition == true)。希望这会有所帮助。

https://codesnippets.fandom.com/wiki/Infinite_Loop

【讨论】:

以上是关于当我添加游戏循环时,为啥我的 Java 游戏会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

有人能告诉我为啥当我的游戏中的相机移动时一切都会振动吗?

当我将 ImageView 添加到 CardView 或 Fragment 时,为啥我的应用程序会崩溃?

应用程序崩溃。为啥?

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

当我按下一个按钮时我的游戏崩溃了(以 NSException 类型的未捕获异常终止)

Java应用程序中的SQLite崩溃(在线游戏)