1

私は時々カメラ(目に見える画面部分)をポイントAからポイントBに移動しなければならないAndroidゲームを持っています。

明らかに、私はそのようにそれを行うことができました:

camera.setCenter(B.getX(), B.getY();

しかし、見た目は良くなく、すぐにジャンプします。達成したいのは、AからBへのスムーズな移動です。特定のゲームオブジェクトをループ更新するonUpdateメソッドにアクセスできます(特定のミリ秒で特定のことを実行できます)。

2つのポイント間をスムーズに移動できるようにするために、このようなアルゴリズムを作成する方法を実際に理解することはできません(分類すると、どの値を追加する必要があるかを計算する方法がわかりません。

camera.setCenter(camera.getX() + xValue, camera.getY() + yValue)

これらの値を計算する必要があるため、これらの2点間の距離によって異なります。

4

2 に答える 2

6

ゲームが毎秒60フレームで更新され、トランジションに2秒かかる場合は、そこに到達するまでに120フレームかかるはずです。

したがって、特定の更新で移動する必要がある量はですtotal/120

これを抽象化して、移動をキューに入れ、FPSと各更新を移動する量を計算し.setCenter、現在の位置と更新量を呼び出すメソッドに組み込むことができます。これは通常、補間と呼ばれます。移動する必要がある距離を決定するために、その絶対値を超えないようにしますcurrent - destination(どちらが他の前にあるかは問題ではないため、絶対値を使用して符号を無視します。技術的には、距離はスカラーであるのに対し、位置はベクトルです)。

したがって、セミコードで要約すると(これらの関数の実際のコントラクトはわかりません):

//given these variables already have value
double fps, currentX, destinationX, currentY, destinationY, animationLength; //animation length in seconds
...
double xValue = Math.abs(currentX - destinationX);
double yValue = Math.abs(currentY - destinationY);
...
//on each update:
double amountToMoveX = xValue / (animationLength * fps);
double amountToMoveY = yValue / (animationLength * fps);
camera.setCenter(camera.getX() + amountToMoveX, camera.getY() + amountToMoveY)

次に、いつ停止するかを追跡する必要があります。そうすれば、うまくいくはずです。

すでにこれを行う手段を備えたエンジンを使用しているかどうかはわかりません。しかし、純粋なアルゴリズムの観点からは、これが進むべき道のようです。

于 2012-08-13T18:40:24.157 に答える
0

この質問からの議論を参照してください

答えから:

length = square_root((bx --ax)^ 2 +(by --ay)^ 2)

速度X=(bx-ax)/長さ*速度

速度Y=(by --ay)/長さ*速度

ここで、xValueはvelocityXであり、Yについても同様です。

于 2012-08-13T18:41:36.777 に答える