İş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: start
ve end
hareketin bitiş noktalarını işaretleyin, speed
saniyede kaç piksel hareket etmesi gerektiğini ve elapsed
nesnenizin 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 start
noktaya "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
, speed
ve öğ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);
Vector
Kullanabileceğ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;
}
}