Tuyên bố từ chối trách nhiệm: Có lẽ có những cách khác, và tốt hơn để làm điều này. Dù bằng cách nào tôi cũng sẽ chia sẻ và mô tả cách tôi tiếp cận vấn đề này một thời gian trước, cuối cùng tôi đã làm việc tốt.
Tôi đã thực hiện một trò chơi ô tô từ trên xuống 2D vài năm trước cho một dự án đại học và nếu tôi nhớ chính xác, tôi đã sử dụng bài viết này như một điểm khởi đầu, mặc dù cuối cùng tôi đã đơn giản hóa nó rất nhiều, và đã bỏ tất cả điều đó " bánh xe "mô hình công cụ ủng hộ một cơ thể duy nhất cho chiếc xe. Tuy nhiên, những gì tôi đã sử dụng là một cái gì đó tương tự như KillOrthogonalVelocity
phương pháp mà bạn có thể tìm thấy ở đó, để quan tâm đến việc áp dụng ma sát bên.
Vì vậy, đây là một video nhỏ về những gì nó bật ra. Có một lượng ma sát nhất định được áp dụng, điều này cũng phụ thuộc vào việc tôi có sử dụng nút phanh tay hay không và chiếc xe tôi sử dụng cho video cũng trôi đi đáng kể so với những chiếc khác. Điều này đã được kiểm soát mặc dù. Nó cũng có một chiếc xe tải với chuyển động ngang không và điều khiển rất cứng.
Tôi chưa bao giờ hoàn toàn hài lòng với kết quả, nhưng nó là đủ cho nhu cầu của tôi. Hãy nhớ rằng tôi đã không dựa trên bất kỳ vật lý nào của tôi về chuyển động của xe thật hay bất cứ thứ gì. Tôi chỉ chỉnh sửa và thử mọi thứ cho đến khi cảm thấy đúng.
Ma sát bên
Vì vậy, để cung cấp một vài chi tiết về việc triển khai, về cơ bản, khi tôi điều chỉnh phương pháp đó cho dự án của mình, tôi đã thêm một biến cho phép tôi kiểm soát chính xác bao nhiêu vận tốc bên tôi sẽ giết, như một giá trị từ 0 đến 1. Điều này cho phép tôi tinh chỉnh việc xử lý chiếc xe và nó có thể trôi bao nhiêu. Đây là phương pháp được dịch sang XNA và được đơn giản hóa:
public static void KillOrthogonalVelocity(Car car, float drift = 0f)
{
Vector2 forwardVelocity = car.Forward * Vector2.Dot(car.Velocity, car.Forward);
Vector2 rightVelocity = car.Right * Vector2.Dot(car.Velocity, car.Right);
car.Velocity = forwardVelocity + rightVelocity * drift;
}
Như bạn có thể thấy tôi đang sử dụng vectơ và đại số tuyến tính, chứ không phải lượng giác, vì vậy bạn sẽ phải điều chỉnh nó theo nhu cầu của mình. Cả hai car.Forward
và car.Right
là các vectơ chuẩn hóa chỉ theo hướng cụ thể đó.
Van tiết lưu, phanh, lái
Ngoài ra, phần duy nhất khác có liên quan là cách tôi áp dụng các lực vào chiếc xe để khiến nó di chuyển và bẻ lái:
- Tăng tốc và phanh rất đơn giản. Chỉ là vấn đề áp dụng một lực theo hướng chiếc xe hiện đang đối mặt, hoặc nghịch đảo của nó.
Mặt khác chỉ đạo có một vài thủ thuật. Chỉ đạo đã được thực hiện bằng cách áp dụng một mô-men xoắn cho xe (Tôi đã sử dụng Box2D vì vậy đây là một cuộc gọi phương thức đơn giản), nhưng sức mạnh của mô-men xoắn đó phụ thuộc vào một số yếu tố, đặc biệt:
- Khi phá vỡ, tôi tăng 25% mô-men xoắn để có thể thực hiện những cú ngoặt sắc nét hơn.
if(braking || handbraking) torque *= 1.25
- Khi đi ngược lại, tôi cũng đảo ngược mô-men xoắn để có được các điều khiển chính xác.
if(reverse) torque *= -1
- Cuối cùng, nếu chiếc xe đang đi dưới một ngưỡng tốc độ nhất định, tôi đã khiến nó lái ít hơn bình thường.
if(speed < 2.0f) torque *= (speed / 4.0f)
Sau đó, chỉ cần gọi KillOrthogonalVelocity()
phương thức để điều chỉnh vận tốc cuối cùng và làm cho nó hoạt động ít hơn như một con tàu vũ trụ và giống như một chiếc xe hơi.