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

アニメーションの速度が更新レートに依存しないように、時間デルタを使用して各反復で移動した距離を計算する必要があります (覚えておいてください: )。dx = v*dt

次に、既に述べた他のヒント (タイマーなど) を使用して、より安定させることができます。

于 2013-02-06T14:09:15.527 に答える
1

あなたのアプローチは無効のようです。ディスクを表示することと、その位置を決定することは 2 つの異なることです。私はそれを考えます:

  • 1 つのスレッドで、定期的に (1 秒間に 100 回?) ディスクの位置を計算する必要があります。
  • 1 秒あたり数回、ディスクの速度を下げる必要があります (この速度の低下は、ループが実行された回数ではなく、System.currentTimeMIlliseconds() に基づいています)。
  • 毎秒 30 ~ 60 回、ディスクの位置を描画します
于 2013-02-06T14:04:46.400 に答える