首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFrame跳过一些重画图()调用

JFrame跳过一些重画图()调用
EN

Stack Overflow用户
提问于 2015-06-29 19:14:15
回答 2查看 370关注 0票数 1

我在做蛇游戏,我遇到了一个错误。

我尝试了两个不同的循环:thread.sleepTimer.schedule

我也遇到了同样的问题。

它将工作良好,但在随机间隔,它将开始跳过每其他帧6-10帧。

如果我不清楚,1帧是

代码语言:javascript
复制
@Override public void paintComponent(Graphics G){...}

被召唤。(我也试过油漆)

这已经发生在其他一些游戏中,但不是全部。我能做些什么来解决这个问题?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-29 19:54:26

我找到了我需要做的。我不得不在重新油漆()之后添加一个revaidate()。

票数 1
EN

Stack Overflow用户

发布于 2015-06-29 20:00:36

同样,在checkKillCollisions中,您必须在找到失败条件后立即中断循环。

另外,如果游戏结束,它会继续显示错误messageDialog,我没有end.So,我创建了一个标志gameOver来检查游戏是否在Snake类中结束

代码语言:javascript
复制
 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
}

我修改了循环类,使其在gameOver标志设置为true后立即停止运行

代码语言:javascript
复制
 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();
    }
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31123715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档