0

我在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() 郊游“更新”中添加一个 sysout 并在 paintComponent() 郊游“重绘”中添加一个 sysout 时,我得到以下结果:

updating
updating
updating
updating
updating
(x1000 and more)
repainting

因此,当我重画一次时,游戏会更新 1000 次甚至更多次。正常吗?我觉得它有点奇怪,不是吗?例如可以和玩家一起做 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);
}
4

3 回答 3

0

您以秒为单位计算等待。(纳秒 / 100 万)

sleep 的参数应该以毫秒为单位。所以改变这一行:

wait = (TARGET_TIME - elapsed) / 1000;
于 2013-09-03T17:44:26.413 回答
0

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

于 2013-09-03T17:50:17.797 回答
0

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

多次调用 repaint() 不一定会导致多次调用 paintComponent() - 多余的重绘请求被合并为一个。

于 2013-09-04T22:03:56.250 回答