Saya akan menggunakan beberapa struktur aljabar linier karena lebih mudah menggambarkan operasi seperti itu. Jika Anda tidak tahu bagaimana menerapkan operasi vektor ini, saya akan memberikan penjelasan singkat di bagian akhir.
Jadi katakanlah Anda mulai dengan nilai-nilai ini: start
dan end
tandai titik akhir gerakan, speed
adalah berapa banyak piksel yang harusnya bergerak dengan detik, dan elapsed
adalah tingkat di mana Anda akan memperbarui posisi objek Anda (beberapa mesin sudah memberikan nilai itu untuk Anda ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
Hal pertama yang ingin Anda hitung adalah jarak antara kedua titik, dan vektor yang dinormalisasi yang berisi arah dari awal hingga akhir. Juga, Anda harus "mematahkan" posisi objek ke start
titik. Langkah ini dilakukan hanya sekali, pada awalnya:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
Kemudian pada metode pembaruan Anda, Anda memindahkan objek dengan menambahkan perkalian direction
, speed
dan elapsed
ke posisinya. Setelah itu, untuk memeriksa apakah gerakan sudah berakhir, Anda melihat apakah jarak antara titik awal dan posisi objek saat ini lebih besar dari jarak awal yang Anda hitung. Jika itu benar, kami pasang posisi objek ke titik akhir, dan berhenti memindahkan objek:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
Referensi Operasi Vektor Cepat
Perwakilan
Vector2 A = float aX, aY;
Jumlah / Kurangi
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
Kalikan dengan Scalar (float)
A*float = a.x*float; a.y*float;
Panjang / Jarak
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
Normalisasi
normalize(A) = a.X/length(A); a.Y/length(A);
Itu seharusnya cukup untuk mengubah kode di atas menjadi operasi reguler jika Anda tidak memiliki Vector
kelas yang tersedia untuk Anda.
Contoh Konversi
// 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;
}
}