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