Я буду використовувати лінійні структури алгебри, оскільки так простіше описати операції. Якщо ви не знаєте, як реалізувати ці векторні операції, я коротко поясню наприкінці.
Тож скажімо, що ви починаєте з цих значень: 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;
}
}
Швидкий довідник векторних операцій
Представництво
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;
}
}