2

我正在尝试创建一个像曲棍球盘一样缓慢移动并且速度逐渐降低的动画。

所以我试着这样做:

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 帧时才增加这个值(系数)。

问题如下:当我尝试使用太小的值时,光盘太快并且过早停止运行。当我尝试使用更高的值时,光盘速度看起来不错,但最后的动画不是很流畅......我该怎么办?

4

4 回答 4

3

你最应该做的,并且会提高你的动画流畅度的,不是用来sleep调整动画节奏的。这会阻塞负责绘制冰球的线程。你需要的是一个SwingTimer被适当安排来执行动画的。给它一个稳定的射击速度,并通过您应用的位置增量控制速度。

于 2013-02-06T14:03:33.027 回答
1

我建议根本不使用 Thread.sleep,而是实现一个游戏循环,该循环由计时器每隔一段时间调用一次,然后简单地缓慢降低每个循环的速度。

于 2013-02-06T14:02:21.407 回答
1

您的方法似乎无效。显示光盘和确定它的位置是两件不同的事情。我觉得:

  • 在一个线程中,您应该定期(每秒 100 次?)计算光盘的位置
  • 每秒几次,您应该降低磁盘的速度(基于 System.currentTimeMilliseconds() 的速度降低,而不是循环执行的次数)
  • 每秒30-60次绘制圆盘的位置
于 2013-02-06T14:04:46.400 回答
1

您应该使用时间增量来计算每次迭代中移动的距离(请记住dx = v*dt:),因此您的动画速度与更新率无关。

然后,您可以使用已经提到的任何其他技巧(例如计时器)使其更加稳定。

于 2013-02-06T14:09:15.527 回答