当我添加游戏循环时,为什么我的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) {}函数。这个问题可能是因为im在Main类中使用run方法而不是GamePanel类。我做错了什么?非常感谢您的帮助!

您的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

最新更新