Tôi đang làm việc trong một trò chơi mà người chơi có thể nhặt các vật bằng cách sử dụng một cái gì đó như chùm máy kéo và mang chúng đi khắp nơi.
Thu hút đối tượng về phía tâm của chùm tia không khó. Nhưng một khi đối tượng đủ gần trung tâm, tôi cần giữ nó ở đó trong khi người chơi di chuyển, đó là điều tôi đang gặp vấn đề. Tôi có thể nghĩ ra hai cách để làm điều đó và cả hai đều có vấn đề:
Cập nhật vị trí của đối tượng bất cứ khi nào vị trí người chơi thay đổi, giữ cho nó tập trung vào chùm tia.
Cập nhật vận tốc của vật thể để hướng thẳng vào tâm của chùm tia, càng đi xa, vận tốc càng nhiều.
Di chuyển và xoay chỉ hoạt động tốt với cả hai phương pháp, nhưng vật lý bị sai khi vật mang theo va chạm với các vật khác:
Với cách tiếp cận đầu tiên, vật lý hoàn toàn bị bỏ qua. Các đối tượng mang theo chỉ cần đẩy bất cứ điều gì ra khỏi đường đi. Đó là bởi vì thay đổi vị trí chỉ được cho là được thực hiện như một phần của vật lý thế giới, dựa trên vận tốc.
Với cách tiếp cận thứ hai, vật lý về cơ bản hành xử theo cách họ nên, nhưng phản ứng thái quá. Vấn đề là: Để giữ vật mang ở trung tâm của chùm tia ngay cả khi quay và di chuyển, tôi cần sử dụng các giá trị vận tốc cao. Vì vậy, một khi vật mang theo chạm vào một vật khác, nó sẽ nhận được quá nhiều vận tốc từ vụ va chạm.
Làm thế nào tôi có thể thực hiện điều này đúng? Dự đoán tốt nhất của tôi ngay bây giờ là đi theo cách tiếp cận thứ hai và thêm xử lý đặc biệt cho các vật mang theo vào vật lý thế giới, giảm vận tốc xuống các giá trị lành mạnh cho va chạm hoặc khi người chơi ngừng mang chúng. Nhưng đó có vẻ là một cách giải quyết không phù hợp.
Chỉnh sửa: Thêm một số mã giả để minh họa cách thức hoạt động của nó ngay bây giờ (đó là cách tiếp cận thứ hai ở trên)
void attract_object(object, ticks) {
Vector distance = beam_center - object.center;
// If the object is not close to the beam center, attract it slowly
if (magnitude(distance) > 10) {
object.velocity += distance.normalized() * ticks * 0.1;
return;
}
// Here comes the part we're talking about. That magic 0.5 is just high enough
// that the object isn't lost while moving around. But it's still so high that
// other objects are repelled with way too much force.
object.velocity = distance * ticks * 0.5;
}
Từ những gì tôi thấy, điều này xảy ra khi đối tượng mang theo đẩy một đối tượng khác đi:
- Vật mang theo va chạm với vật khác
- Vận tốc của các vật thể được phân phối hợp lý, do đó vật mang theo bị đẩy ra khỏi tâm chùm trong quá trình
- Đoạn mã trên làm cho vật được mang trở về trung tâm của chùm tia, với vận tốc lớn đến mức nó sẽ nhanh chóng quay trở lại đó
- Khi vật mang theo di chuyển về phía trung tâm của chùm tia, một nửa vận tốc cao của nó được truyền sang vật khác, đẩy lùi nó dữ dội. Vì vận tốc ban đầu của vật mang có vẻ là lành mạnh, tôi có thể tưởng tượng rằng các bước 2 đến 4 được lặp lại nhiều lần, tạo nên một vận tốc cao như vậy.
Đó dường như là nguyên nhân. Tôi không thể nghĩ ra một cách hay để sửa nó :(