ฉันจะใช้โครงสร้างพีชคณิตเชิงเส้นเนื่องจากง่ายต่อการอธิบายการดำเนินการในลักษณะนั้น ในกรณีที่คุณไม่ทราบวิธีการใช้การดำเนินการเวกเตอร์เหล่านี้ฉันจะให้คำอธิบายอย่างรวดเร็วในตอนท้าย
สมมติว่าคุณเริ่มต้นด้วยค่าเหล่านี้: 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;
}
}
การอ้างอิงการดำเนินการ Vector ด่วน
การแสดง
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;
}
}