Джейсон,
Замість того, щоб мати три атрибути об'єкта,
- Точка (х, у) положення
- Напрямок Vector2D (x, y)
- Внутрішня швидкість
часто поєднувати напрямок і швидкість у векторі швидкості набагато простіше. Тоді у вас є лише два атрибути,
- Точка (х, у) положення
- Швидкість вектора2D (x, y)
Позиція оновлення
Коли вам потрібно оновити позицію об’єкта, це так само просто, як:
position.x += velocity.x * Δt;
position.y += velocity.y * Δt;
де Δt
ваша дельта часу - або різниця в часі - або крок часу.
Оновлення положення та швидкості
Це також дуже легко керувати прискоренням (наприклад, від сили тяжіння). Якщо у вас вектор прискорення, ви можете оновити швидкість і положення разом так:
position.x += (velocity.x * Δt) + (0.5 * acceleration.x * Δt * Δt);
position.y += (velocity.y * Δt) + (0.5 * acceleration.y * Δt * Δt);
velocity.x += acceleration.x * Δt;
velocity.y += acceleration.y * Δt;
(Це в основному формула s = vt + ½at² з фізики 101.)
Застосування швидкості
Якщо ви хочете застосувати задану швидкість у деякому нормалізованому напрямку, ви можете встановити швидкість так:
velocity.x = normalizedDirection.x * speed;
velocity.y = normalizedDirection.y * speed;
Виведення швидкості
І якщо вам потрібно зробити зворотний - вивести швидкість і напрямок із заданого вектора швидкості - ви можете просто використовувати теорему Піфагора або .Length()
метод:
speed = velocity.Length();
І як тільки швидкість відома, нормалізований напрямок можна обчислити, поділивши швидкість на швидкість (будьте обережні, щоб уникнути ділення на нуль):
if (speed != 0) {
normalizedDirection.x = velocity.x / speed;
normalizedDirection.y = velocity.y / speed;
} else {
normalizedDirection.x = 0;
normalizedDirection.y = 0;
}