1

私はゲームをしていて、 を使用していSurfaceViewます。ゲームでは、25 個の小さなドットが動き回っています。目標は、プレーヤーが同じ色のいくつかのドットの周りに円を描くゲームを作成することです。私の問題は、この円を描いているときに画面から指を離した後、すべてのドットが非常にゆっくりと動いていることです! この理由は、すべてのドットと一緒に常に描画されているすべての線分にあると思います。

ドットの移動速度を常に同じにすることは可能ですか? でテストしましSystemClock.Sleep(1)たが、あまり役に立ちませんでした。

// Method to draw objects
private void drawObjects(Canvas canvas) {
    SystemClock.sleep(1);
    synchronized (this) {

    // Clear screen with black color
    canvas.drawRGB(0, 0, 0);

    // Draw line
    if(startDrawLine) {
        // Set properties to Paint object
        paint.setColor(Color.WHITE);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);
        // Draw path
        path.moveTo(touchDownX, touchDownY);
        for(Point point: points) {
            path.lineTo(point.x, point.y);
            canvas.drawPath(path, paint);
        }   
        path.reset();
    }
}
    // Call method draw() in CircleManager to draw all circles in list
    circleManager.drawCirclesInList(canvas);
}
4

1 に答える 1

1

描画が遅いのは、パスにポイントが多すぎることが原因です。イベントを処理している場合Touch、短時間で数百、数千のタッチ (ポイント) が期待できます。

  1. ポイントを何らかの方法で補間する必要があります-平均を取り、同じポイントを無視してポイントを閉じるか、何か他のものを使用します。
  2. 「ドット」をアニメーション化する場合、アニメーションはハードウェア上の実際の描画速度ではなく、時間に基づいている必要があります。

アニメーションを時間に基づいて作成するには、前のフレームから経過した時間を計算し、この時間をドットの新しい位置を計算する関数で使用する必要があります。この件に関する素晴らしい記事は次のとおりです 。 http://www.koonsolo.com/news/dewitters-gameloop/

編集 - コメントへの応答:

あなたの「ドット」 (私はそれをボールと呼びます)が水平方向に( によってX)左から右へ100毎秒単位の一定の速度で移動する必要があるとします。

ゲームが25 FPSで実行されるという前提で計算を行っている場合は、各フレームにを加算するだけです。4X

このアプローチの問題点は、一定の FPS を達成するのが非常に難しいことです。 高速なハードウェアでは、FPS を制限することで滑らかさを犠牲にします。低速のハードウェアでは、一部のフレームの描画をスキップ (ドロップ) する必要があります (一定の FPS では不安定になる可能性があります)。

Android のタイマーはあまり正確ではなく、スレッド スリープ機能も不正確です。あなたの場合、一定の FPS を強制したり、現在の FPS を計算したりする代わりに、頭を包み込み、時間のコンテキストで問題を再考してみてください。

時間について考えるとき、ゲームの実行速度 (FPS 数) や以前に何が起こったかは関係ありません。

「今、この瞬間、ボールはどこにあるべきか」という質問をするだけです。

たとえば、ボールの動きX0が原点時間の原点位置を見つめていることがわかっている場合、T0現時点でのTCボール位置はX = (TC - T0) * 100

TD2 番目のアプローチは、最後のボール位置の更新から経過した時間を測定することです。次に、ボールの位置を次のように更新する必要があります。X = X + TD * 100

このアプローチに慣れると、大部分のアニメーションは非常に簡単に実装でき、非常に正確であることがわかります。

于 2013-04-30T15:04:00.893 に答える