为什么添加游戏循环时Java游戏会崩溃?

我最近开始尝试学习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) {}函数。该问题可能与以下事实有关:即时消息是在run类而不是Main类中使用GamePanel方法。 我究竟做错了什么?非常感谢您的帮助!

yamating 回答:为什么添加游戏循环时Java游戏会崩溃?

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

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

为此,我们创建一个新线程,然后在其中运行循环。还要注意,在每个循环之后,我们会睡一会儿(理想情况下,您希望使用时间增量等,这只是一个例子)---这意味着我们限制了每秒的帧数,这意味着我们没有充分的理由就不会使处理器超负荷工作。

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

            // your update logic here

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

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

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

本文链接:https://www.f2er.com/1294667.html

大家都在问