JFrame 跳过一些 repaint() 调用

JFrame skipping some repaint() calls

我正在制作贪吃蛇游戏,遇到错误。
我尝试了两种不同的循环:thread.sleepTimer.schedule.
我也遇到了同样的问题。
它会工作正常,但在随机间隔,它会开始每隔一帧跳过 6-10 帧。
如果我不清楚,1 帧是

@Override public void paintComponent(Graphics G){...}

正在打电话。 (我也试过画)
这发生在我创建的其他一些游戏中,但不是全部。我能做些什么来修复它?

这是代码的完整副本: https://github.com/jnmcd/Snake/blob/master/Code.java

编辑:我做了一些调试。看来这不是油漆的问题。 JPanel 并不总是更新。我能做些什么来修复它?

我找到了我需要做的事情。我必须在 repaint() 之后添加一个 revaidate()。

此外,在 checkKillCollisions 中,您必须在找到失败条件后立即打破循环。

此外,如果游戏结束,它会继续显示错误消息[对话框],我没有 end.So 我已经创建了一个标志 gameOver 来检查游戏是否结束 Snake Class

 static Boolean gameOver = false;//Defined in Snake Class


 public void checkKillCollisions() {
    boolean lose = false;
    for (int i = 1; i < Snake.segments.size(); i++) {
        if (Snake.segments.get(i).x == x && Snake.segments.get(i).y == y) {
            lose = true;
            break;//Have to do this
        }
    }
    if (x >= 60 || x < 0 || y >= 60 || y < 0) {
        lose = true;
    }
    if (lose) {
        Snake.window.popUp("You Lose");
    }
    Snake.gameOver = lose;//Will set the gameOVer flag in Snake class
}

并且我修改了循环 class 以在 gameOver 标志设置为 true 后立即停止 运行

 class Loop extends TimerTask {

@Override
public void run() {
    if (!Snake.gameOver) {
        Snake.updates();
        Snake.window.render();
    } else {
        System.out.println("Game Over");
        cancel();
        Snake.window.dispose();
    }
}
}