そのように操作を説明する方が簡単なので、線形代数構造を使用します。これらのベクトル演算の実装方法がわからない場合は、最後に簡単に説明します。
これらの値から始めてみましょう:動きの終点start
をend
マークし、speed
秒単位で移動するピクセルelapsed
数であり、オブジェクトの位置を更新するレートです(一部のエンジンは既にその値を提供しています) ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
最初に計算するのは、両方のポイント間の距離と、開始から終了までの方向を含む正規化されたベクトルです。また、オブジェクトの位置をstart
ポイントに「スナップ」する必要があります。このステップは最初に一度だけ行われます:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
次に、更新メソッドでdirection
、speed
との乗算elapsed
をその位置に追加してオブジェクトを移動します。その後、動きが終わったかどうかを確認するために、開始点とオブジェクトの現在位置の間の距離が、計算した初期距離よりも大きいかどうかを確認します。それが当てはまる場合、オブジェクトの位置を終点にスナップし、オブジェクトの移動を停止します。
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
クイックベクトル操作リファレンス
表現
Vector2 A = float aX, aY;
合計/減算
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
スカラーで乗算(フロート)
A*float = a.x*float; a.y*float;
長さ/距離
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
ノーマライズ
normalize(A) = a.X/length(A); a.Y/length(A);
Vector
クラスを使用できない場合は、上記のコードを通常の操作に変換するのに十分なはずです。
変換の例
// Your Variables
float startX, startY, endX, endY;
float speed = 100;
float elapsed = 0.01f;
// On starting movement
float distance = Math.sqrt(Math.pow(endX-startX,2)+Math.pow(endY-startY,2));
float directionX = (endX-startX) / distance;
float directionY = (endY-startY) / distance;
object.X = startX;
object.Y = startY;
moving = true;
// On update
if(moving == true)
{
object.X += directionX * speed * elapsed;
object.Y += directionY * speed * elapsed;
if(Math.sqrt(Math.pow(object.X-startX,2)+Math.pow(object.Y-startY,2)) >= distance)
{
object.X = endX;
object.Y = endY;
moving = false;
}
}