Tôi sẽ sử dụng một số cấu trúc đại số tuyến tính vì việc mô tả các hoạt động theo cách đó dễ dàng hơn. Trong trường hợp bạn không biết cách thực hiện các thao tác vectơ này, tôi sẽ giải thích nhanh vào cuối.
Vì vậy, giả sử bạn bắt đầu với các giá trị này: start
và end
đánh dấu điểm kết thúc của chuyển động, speed
là nó sẽ di chuyển bao nhiêu pixel trong giây và elapsed
là tốc độ bạn sẽ cập nhật vị trí đối tượng của mình (một số công cụ đã cung cấp giá trị đó cho bạn ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
Điều đầu tiên bạn sẽ muốn tính toán là khoảng cách giữa cả hai điểm và một vectơ chuẩn hóa chứa hướng từ đầu đến cuối. Ngoài ra, bạn nên "chụp" vị trí đối tượng vào start
điểm. Bước này chỉ được thực hiện một lần, khi bắt đầu:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
Sau đó, trên phương pháp cập nhật của bạn, bạn di chuyển các đối tượng bằng cách thêm một phép nhân của direction
, speed
và elapsed
vị trí của nó. Sau đó, để kiểm tra xem chuyển động đã kết thúc chưa, bạn xem khoảng cách giữa điểm bắt đầu và vị trí hiện tại của đối tượng có lớn hơn khoảng cách ban đầu bạn đã tính không. Nếu đó là sự thật, chúng tôi sẽ đưa vị trí của đối tượng đến điểm cuối và ngừng di chuyển đối tượng:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
Tham khảo hoạt động Vector nhanh
Đại diện
Vector2 A = float aX, aY;
Tổng / trừ
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
Nhân với vô hướng (float)
A*float = a.x*float; a.y*float;
Chiều dài / khoảng cách
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
Bình thường hóa
normalize(A) = a.X/length(A); a.Y/length(A);
Điều đó là đủ để chuyển đổi mã trên thành các hoạt động thông thường nếu bạn không có Vector
sẵn một lớp học.
Ví dụ về chuyển đổ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;
}
}