Java游戏循环的奇怪行为

时间:2013-09-03 17:36:43

标签: java swing repaint game-loop

我在java中有一个简单的游戏循环:

public void run(){
    while(running){
        start = System.nanoTime();
        gamePanel.update();
        gamePanel.repaint();
        elapsed = System.nanoTime() - start;
        wait = (TARGET_TIME - elapsed) / 1000000;
        if(wait < 0){wait = TARGET_TIME;}
        try {Thread.sleep(wait);}catch(Exception e) {e.printStackTrace();}
    }
}

现在的问题:当我在update()outing“update”中添加一个sysout,并在paintComponent()outing“重新绘制”中添加一个sysout时,我得到以下结果:

updating
updating
updating
updating
updating
(x1000 and more)
repainting

因此,当我重画一次时,游戏正在更新1000次。这是正常的吗?我认为它的abit奇怪,不是吗?例如,可以与玩家做1000步,直到游戏画它... 这意味着,update()方法不会等待重绘完成?为什么呢?

谢谢!

编辑:这里是更新代码:

public void update(){
    if(moveUp){
        changeMapY(map, -map.getSpeed());
    }
    if(moveDown){
        changeMapY(map, map.getSpeed());
    }
    if(moveRight){
        changeMapX(map, map.getSpeed());
    }
    if(moveLeft){
        changeMapX(map, -map.getSpeed());
    }
}

编辑2:这就是changeMap的作用:(也许这就是问题?)

public void changeMapX(Map map, int amount){
    for(int i = 0; i < blocks.length; i++){
        for(int j = 0; j < blocks[0].length; j++){
            blocks[i][j].addX(amount);
        }
    }
    map.addOffsetx(amount);
}

public void changeMapY(Map map, int amount){
    for(int i = 0; i < blocks.length; i++){
        for(int j = 0; j < blocks[0].length; j++){
            blocks[i][j].addY(amount);
        }
    }
    map.addOffsety(amount);
}

3 个答案:

答案 0 :(得分:0)

你计算等待的秒数。 (纳秒/ 100万)

睡眠参数应以毫秒为单位。所以改变这一行:

wait = (TARGET_TIME - elapsed) / 1000;

答案 1 :(得分:0)

我测试了你的源代码和“更新”,“重新绘制”是一个接一个。该问题与您的update()方法有关。也许是递归,也许是循环。

答案 2 :(得分:0)

假设gamePanel是一个Swing组件,你可能观察到的是repaint()实际上并没有调用JComponent.paintComponent()。它所做的一切基本上使组件的图形无效,并告诉Swing在未来的Swing线程上重新绘制组件。

对repaint()的多次调用不一定会导致多次调用paintComponent() - 冗余重绘请求会折叠成一个。