为什么我的 Java 游戏在我添加游戏循环时崩溃了?
Why is my Java game crashing when I add a game loop?
我最近开始尝试学习 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
class,其中运行是一个GamePanel
class作为main(String args) {}
功能。这个问题可能与我在 Main
class 而不是 GamePanel
class 中使用 run
方法有关。
我究竟做错了什么?非常感谢任何帮助!
我认为问题在于你有一个无限循环。当您的循环条件始终保持为真时,就会发生这种情况。 while(True)
。您要么需要实现一个 break;
语句来终止循环,要么在 while 循环中使用一个条件,该条件将 运行 循环直到满足特定条件 while(some-condition == true)
。希望这会有所帮助。
您的 while
循环将永远不会退出,因此您的程序永远不会重新绘制等。
但是,对于这样的游戏循环,您确实想要一个无限循环---您只想运行它在不同的线程中。这样,您的程序的其余部分就不会被无限循环阻塞,但是您仍然可以 运行 您的游戏循环任务。
为此,我们创建了一个新线程,运行 我们的循环在那里。另请注意,在每个循环之后我们会睡一会儿(理想情况下,您希望使用时间增量等来执行此操作,这只是一个示例)---这意味着我们限制了每秒的帧数,这意味着我们不会无缘无故地使处理器过度工作。
Thread t = new Thread(new Runnable(){
public void run() {
while (true) {
// your update logic here
try {
Thread.sleep(16);
}
catch(InterruptedException) {}
}
}
});
t.start();
我最近开始尝试学习 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
class,其中运行是一个GamePanel
class作为main(String args) {}
功能。这个问题可能与我在 Main
class 而不是 GamePanel
class 中使用 run
方法有关。
我究竟做错了什么?非常感谢任何帮助!
我认为问题在于你有一个无限循环。当您的循环条件始终保持为真时,就会发生这种情况。 while(True)
。您要么需要实现一个 break;
语句来终止循环,要么在 while 循环中使用一个条件,该条件将 运行 循环直到满足特定条件 while(some-condition == true)
。希望这会有所帮助。
您的 while
循环将永远不会退出,因此您的程序永远不会重新绘制等。
但是,对于这样的游戏循环,您确实想要一个无限循环---您只想运行它在不同的线程中。这样,您的程序的其余部分就不会被无限循环阻塞,但是您仍然可以 运行 您的游戏循环任务。
为此,我们创建了一个新线程,运行 我们的循环在那里。另请注意,在每个循环之后我们会睡一会儿(理想情况下,您希望使用时间增量等来执行此操作,这只是一个示例)---这意味着我们限制了每秒的帧数,这意味着我们不会无缘无故地使处理器过度工作。
Thread t = new Thread(new Runnable(){
public void run() {
while (true) {
// your update logic here
try {
Thread.sleep(16);
}
catch(InterruptedException) {}
}
}
});
t.start();