簡體   English   中英

Java游戲循環的奇怪行為

[英]Strange behavior of java 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()郊游中添加“更新”和在paintComponent()郊游中添加一個“重新繪畫”時,我得到以下結果:

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);
}

您以秒為單位計算等待時間。 (納秒/ 100萬)

睡眠參數應以毫秒為單位。 因此更改此行:

wait = (TARGET_TIME - elapsed) / 1000;

我測試了您的源代碼,並且“更新”,“重新繪制”是一個接一個的。 問題與您的update()方法有關。 也許遞歸,也許循環。

假設gamePanel是Swing組件,您可能會觀察到repaint()實際上沒有調用JComponent.paintComponent()。 它所做的一切本質上是使組件的圖形無效,並告訴Swing在將來的某個時間點在Swing線程上重新繪制組件。

多次調用repaint()不一定會導致多次調用paintComponent()-多余的重新繪制請求被折疊為一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM