Jason,
Thay vì có ba thuộc tính đối tượng,
- Vị trí điểm (x, y)
- Hướng Vector2D (x, y)
- Tốc độ nội bộ
thường dễ dàng hơn nhiều để kết hợp hướng và tốc độ thành một vectơ vận tốc. Sau đó, bạn chỉ có hai thuộc tính,
- Vị trí điểm (x, y)
- Vận tốc của Vector2D (x, y)
Cập nhật vị trí
Khi bạn cần cập nhật vị trí của đối tượng, nó đơn giản như:
position.x += velocity.x * Δt;
position.y += velocity.y * Δt;
nơi Δt
đồng bằng thời gian của bạn - hoặc chênh lệch thời gian - hoặc bước thời gian.
Cập nhật vị trí và vận tốc
Cách này cũng rất dễ dàng để xử lý gia tốc (chẳng hạn như từ trọng lực). Nếu bạn có một vectơ gia tốc, bạn có thể cập nhật vận tốc và vị trí cùng nhau như thế này:
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;
(Về cơ bản, đây là công thức s = vt + at² từ Vật lý 101.)
Áp dụng tốc độ
Nếu bạn muốn áp dụng một tốc độ nhất định theo một số hướng chuẩn hóa, bạn có thể đặt vận tốc như thế này:
velocity.x = normalizedDirection.x * speed;
velocity.y = normalizedDirection.y * speed;
Tăng tốc
Và nếu bạn cần thực hiện ngược lại - lấy tốc độ và hướng từ một vectơ vận tốc nhất định - bạn có thể chỉ cần sử dụng định lý Pythagore hoặc .Length()
phương pháp:
speed = velocity.Length();
Và một khi tốc độ đã biết, hướng chuẩn hóa có thể được tính bằng cách chia vận tốc cho tốc độ (cẩn thận để tránh chia cho 0):
if (speed != 0) {
normalizedDirection.x = velocity.x / speed;
normalizedDirection.y = velocity.y / speed;
} else {
normalizedDirection.x = 0;
normalizedDirection.y = 0;
}