İşlemleri bu şekilde tanımlamak daha kolay olduğu için bazı lineer cebir yapılarını kullanacağım. Bu vektör işlemlerini nasıl uygulayacağınızı bilmiyorsanız, sonunda hızlı bir açıklama yapacağım.
Diyelim ki bu değerlerle başlıyorsunuz: startve endhareketin bitiş noktalarını işaretleyin, speedsaniyede kaç piksel hareket etmesi gerektiğini ve elapsednesnenizin konumunu güncelleme hızıdır (bazı motorlar zaten sizin için bu değeri sağlar) ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
Hesaplamak isteyeceğiniz ilk şey, her iki nokta arasındaki mesafedir ve baştan sona yönü içeren normalleştirilmiş bir vektördür. Ayrıca, nesne konumunu startnoktaya "tutturmalısınız" . Bu adım başlangıçta sadece bir kez yapılır:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
Daha sonra güncelleme yönteminizde direction, speedve öğesinin çarpımını ekleyerek nesneyi taşırsınız elapsed. Bundan sonra, hareketin bittiğini kontrol etmek için, başlangıç noktası ile nesnenin mevcut konumu arasındaki mesafenin hesapladığınız başlangıç mesafesinden daha büyük olup olmadığını görürsünüz. Bu doğruysa, nesnenin konumunu bitiş noktasına yaslar ve nesneyi hareket ettirmeyi durdururuz:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
Hızlı Vektör İşlemleri Referansı
temsil
Vector2 A = float aX, aY;
Toplam / Çıkarma
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
Skaler ile çarp (float)
A*float = a.x*float; a.y*float;
Uzunluk / Mesafe
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
Normale
normalize(A) = a.X/length(A); a.Y/length(A);
VectorKullanabileceğiniz bir sınıfınız yoksa, yukarıdaki kodu normal işlemlere dönüştürmek için yeterli olmalıdır .
Dönüşüm Örneği
// 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;
}
}