JFrame跳过一些repaint()调用

时间:2015-06-29 19:14:16

标签: java jframe

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

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

被召唤。 (我也尝试过油漆)
这种情况发生在我创造的其他一些游戏中,但不是全部。我该怎么做才能解决它?

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

编辑:我做了一些调试。它似乎不是油漆的问题。 JPanel并不总是更新。我该怎么做才能解决它?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

同样在checkKillCollisions中,你必须在找到失败状态后立即打破循环。

此外,如果游戏结束,它会一直显示错误消息[对话框],但我没有结束。所以我创建了一个标记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
}

我已经修改了Loop类,以便在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();
    }
}
}