我在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);
}
答案 0 :(得分:0)
你计算等待的秒数。 (纳秒/ 100万)
睡眠参数应以毫秒为单位。所以改变这一行:
wait = (TARGET_TIME - elapsed) / 1000;
答案 1 :(得分:0)
我测试了你的源代码和“更新”,“重新绘制”是一个接一个。该问题与您的update()
方法有关。也许是递归,也许是循环。
答案 2 :(得分:0)
假设gamePanel是一个Swing组件,你可能观察到的是repaint()实际上并没有调用JComponent.paintComponent()。它所做的一切基本上使组件的图形无效,并告诉Swing在未来的Swing线程上重新绘制组件。
对repaint()的多次调用不一定会导致多次调用paintComponent() - 冗余重绘请求会折叠成一个。