当我添加游戏循环时,为啥我的 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 时,为啥我的应用程序会崩溃?