【发布时间】:2014-02-18 16:47:56
【问题描述】:
我想使用 java swing 制作动画。我有一个 for 循环,可以稍微改变图像的位置。我的问题是我怎样才能让每个循环执行花费指定的时间?。
这是我所做的,但我不知道如何使用wait(),也不知道有没有更好的方法。
// inside of a MyJPanel class extending JPanel
for (int i = 0; i < FJframe.FRAMES; i++){
long start = System.currentTimeMillis();
animationFrame = i;
this.repaint();
long end = System.currentTimeMillis();
long remainder = (end - start);
System.out.println(remainder);
try {
this.wait(200 - remainder);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
编辑
这里是我覆盖的 Jpanel PaintComponent():
//一些绘图
drawChanges(g, getDelta(), animationFrame, FJPanle.FRAMES);
在drawChanges(Graphics g, ArrayList deltas, int frame, int frames)里面:
// a switch_case with cases similar to this one.
case AGENT_ATTACK:
// tu phase badi animation e kill
//drawImage(g2d, map[delta.getCell().x][delta.getCell().y], attacker);
source = map[delta.getSource().x][delta.getSource().y];
dest = map[delta.getDestination().x][delta.getDestination().y];
distanceX = dest.getCenter().x -
source.getCenter().x;
distanceY = dest.getCenter().y -
source.getCenter().y;
if (counter < frames / 2){
g2d.drawImage(ImageHolder.attacker, source.getBounds().x + (int)(((float)counter/frames) * distanceX),
source.getBounds().y + (int)(((float)counter/frames) * distanceY),
null);
}
else{
g2d.drawImage(ImageHolder.attacker, dest.getBounds().x - (int)(((float)counter/frames) * distanceX),
dest.getBounds().y - (int)(((float)counter/frames) * distanceY),
null);
}
break;
例如,我希望每个循环需要 200 毫秒。我怎样才能做到这一点?
【问题讨论】:
-
使用等待会暂停你的线程。在循环中使用 Timer 可能会更好。
-
如果您的
remainder大于200,您将获得IllegalArgumentException。 -
虽然还有其他替代方案(如 Timer)可能更适合某些应用案例,以及一些应该修复的细节(如上面提到的 gla3dr),但这并没有错代码一般。你的问题是什么?编辑:好吧,也许使用
Thread#sleep(...)而不是this#wait(...) -
@gla3dr:是的,没错,但我不知道有什么更好的方法。也许你可以指导我。
-
@Marco13:我正在编写一个简单游戏的图形部分,我想用动画来展示单位运动。所以我需要每隔(例如)十分之一秒重新绘制一次更改。