我正在尝试制作一个动画,就像曲棍球碟慢慢移动,速度一点一点地降低。
所以我试着这样做:
for(Disc d : panel.getDiscs()
{
if(d.getLaunch() <= 70) move(d);
}
并且:
private void move(Disc d)
{
Point p = d.getLocation();
Point speed = d.getSpeed();
Dimension size = d.getSize();
int vx = speed.x;
int vy = speed.y;
int x = p.x;
int y = p.y;
if (x + vx < 0 || x + size.width + vx > panel.getWidth()) {
vx *= -1;
}
if (y + vy < 0 || y + size.height + vy > panel.getHeight()) {
vy *= -1;
}
x += vx;
y += vy;
d.setSpeed(new Point(vx, vy));
d.setLocation(new Point(x, y));
try
{
Thread.sleep(d.getLaunch());
} catch (InterruptedException e)
{
e.printStackTrace();
}
if(d.getCoeff() < 5) d.setCoeff(d.getCoeff()+1);
else { d.setLaunch(d.getLaunch()+1); d.setCoeff(0); }
}
我在这里要做的是增加一个从20开始并一直运行到70的值(启动),然后我在每个Thread.sleep(launch);
中使用这个值。
我只在先前显示5帧(coeff)时增加此值。
问题如下:当我尝试使用太小的值时,光盘太快并且太早停止运行。当我尝试使用更高的值时,光盘速度看起来不错,但最后的动画不是很平滑......我该怎么办?
答案 0 :(得分:3)
你最应该做的是什么,以及哪些会改善动画的流畅度,不是使用sleep
作为动画节奏的方法。这阻挡了负责绘制冰球的线程。你需要的是一个SwingTimer
,它被适当地安排来执行动画。给它一个稳定的射击速度,并通过你应用的位置增量来控制速度。
答案 1 :(得分:1)
我建议不要使用Thread.sleep,而是实现一个游戏循环,它经常被定时器调用,然后只是慢慢降低每个循环的速度。
答案 2 :(得分:1)
您的方法似乎无效。显示光盘并确定它的位置是两回事。我认为:
答案 3 :(得分:1)
您应该使用时间增量来计算每次迭代中移动的距离(记住:dx = v*dt
),这样您的动画速度就会与更新速率无关。
然后你可以使用已经提到的任何其他技巧(比如一个计时器)来使它更稳定。