JFrame 跳过一些 repaint() 调用
JFrame skipping some repaint() calls
我正在制作贪吃蛇游戏,遇到错误。
我尝试了两种不同的循环:thread.sleep
和 Timer.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();
}
}
}
我正在制作贪吃蛇游戏,遇到错误。
我尝试了两种不同的循环:thread.sleep
和 Timer.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();
}
}
}