Làm cách nào để xử lý phát hiện va chạm để các vật thể nhanh không được phép xuyên qua tường?


14

Tôi đang tạo một game bắn súng sidecrolling 2d và tôi gặp một chút rắc rối với việc phát hiện va chạm cho đạn. Tất cả mọi thứ bao gồm các viên đạn là các đối tượng với các đa giác / phương thức cập nhật riêng của chúng.

Vấn đề là đạn đi nhanh, và ở tốc độ 60 khung hình mỗi giây (trò chơi chạy ở đâu), một viên đạn thường sẽ trượt qua tường - vì nó di chuyển nhiều hơn chiều rộng của bức tường trong khoảng thời gian cập nhật - và tiếp tục hạnh phúc trên con đường của nó vì đa giác sẽ không bao giờ thực sự trùng lặp.

Những gì tôi có thể làm gì về điều này? Điều duy nhất tôi có thể nghĩ ra là vẽ một đường thẳng từ vị trí cũ sang vị trí mới và thực hiện phát hiện va chạm trên đó, nhưng vẽ đường thẳng để phát hiện va chạm được khuyến nghị đối với tài liệu slick2d. Làm sao tôi có thể giải quyết việc này?


Không phải là một câu trả lời đầy đủ, vì vậy một nhận xét. Tôi sẽ không bao giờ khuyên bạn nên vẽ đồ họa một đường nhưng về mặt toán học bạn có thể làm điều này, nó chỉ là một giao điểm của mặt phẳng tia đơn giản để xem có xảy ra va chạm hay không. Sau đó, bạn có thể thực hiện phát hiện bước cố định nhỏ hơn để có được thời điểm chính xác (và tất cả thông tin đi kèm với nó) khi xảy ra va chạm với việc phải chạy với tốc độ cao hơn liên tục như được đề xuất trong câu trả lời. Làm một kiểm tra ít tốn kém hơn và sau đó dành thời gian để có được câu trả lời chính xác như bạn cần.
James

Câu trả lời:


9

Các cách tiếp cận tiêu chuẩn là (chọn một):

  1. Tăng chiều rộng ranh giới VÀ / HOẶC giảm tốc độ tối đa của viên đạn của bạn để nó không bao giờ có thể nhảy qua tường trong một bản cập nhật duy nhất (yêu cầu một chút Pythagoras để tìm ra khoảng cách tối đa / độ rộng ranh giới tối thiểu);
  2. Thực hiện phát hiện va chạm liên tục (CCD), thường bằng cách chiếu tia để phát hiện va chạm với bề mặt tuyến tính (2) hoặc phẳng (3D) trước vật thể chuyển động. Điều này là đắt hơn, nhưng là một giải pháp tròn trịa hơn. Raycasting đối với các đường 2D là khá cơ bản, nhưng bạn cần xác định tất cả các ranh giới của mình là đa giác cạnh thẳng trong trường hợp này.

Đối với vấn đề đó, thay vào đó, bạn có thể mô hình hóa viên đạn của mình dưới dạng tia - nếu điều đó phù hợp với giao diện và cảm giác của trò chơi của bạn, như trong left4kdead . Bằng cách đó, bạn không cần phải ước chừng đạn là tia, vì chúng đã là tia. Từ quan điểm về ngoại hình, điều này có thể trông ổn nếu bạn vẽ đường thẳng với điểm sáng hơn ở đầu đạn hoặc chỉ vẽ đường kẻ dưới dạng độ dốc từ sáng (đầu đạn) đến tối (đầu đuôi), tạo cho nó một diện mạo chuyển động.

Tôi đồng ý rằng trong hầu hết các trường hợp, sử dụng đồ họa để phát hiện va chạm là một chút sai lầm, tuy nhiên phát hiện va chạm hoàn hảo pixel là chính xác và là một kỹ thuật được chấp nhận. Tôi đoán tất cả phụ thuộc vào những gì bạn muốn đạt được, và nhanh như thế nào. Nếu bạn không cần một trò chơi rất nhanh với nhiều cơ thể + hành động, hãy tham gia. Khác tốt hơn để sử dụng một trong những cách tiếp cận tôi đã nêu ở trên.


Cảm ơn câu trả lời tuyệt vời - lý tưởng là tôi muốn nó được nhịp độ nhanh với nhiều cơ thể chuyển động. Lý do tôi coi viên đạn là vật thể vật lý để chúng bị ảnh hưởng bởi trọng lực như mọi thứ khác (vì vậy hơi cúi xuống, tùy thuộc vào tốc độ của viên đạn, v.v.). Đây không phải là một cách tốt để làm điều đó? Đây là trò chơi đầu tiên của tôi, vì vậy tôi vẫn đang tìm kiếm những thực tiễn tốt nhất. Tôi cũng có thể sử dụng một phương trình parabol, nhưng tôi không chắc mình đã thiết lập các hệ số liên quan đến tốc độ / góc ngắm của viên đạn như thế nào
Mala

3
Nghe có vẻ như quá nhiều chi tiết cho đạn. Trong cuộc sống thực, khi bạn bắn một viên đạn, bạn khó có thể tìm thấy con sên đó do lực ricochet, không thể đoán trước được góc độ richochet, v.v. Hoặc nếu không, nó chỉ đi vào một cơ thể và ở đó (cây, người). Tôi sẽ chỉ để chúng biến mất hoặc ricochet và sau đó biến mất ngay sau đó. Tập trung vào lối chơi cốt lõi của bạn, đừng quá lo lắng về những chi tiết nhỏ này. Chủ nghĩa hiện thực tập trung tốt nhất vào những điều quan trọng.
Kỹ sư

Vâng, tôi cho rằng tôi chỉ có thể sử dụng các đường thẳng cho đạn và có thể tìm cách làm cho chúng cong xuống một chút sau đó, nếu nó có vẻ quan trọng.
Mala

2
Nếu tốc độ của viên đạn không quá cao (tức là không nhanh đến mức bạn không thể nhìn thấy chúng di chuyển trên màn hình), thì bạn có thể chỉ cần áp dụng lực hấp dẫn vào vận tốc của chúng trong khi vẫn mô hình hóa phát hiện va chạm của chúng bằng các tia đơn giản. Người dùng sẽ không nhận thấy rằng viên đạn đang di chuyển như một chuỗi các đường thẳng nữa mà anh ta sẽ nhận thấy tất cả các đối tượng khác của bạn cũng đang làm như vậy. Đối với các vệt đạn, việc tính toán và vẽ một vệt cong (spline) không khó và sẽ làm tăng ảo giác về một đường cong trơn tru theo quỹ đạo của viên đạn.
Sean Middleditch

3

Nếu bạn muốn viên đạn của mình hoạt động giống như các vật thể thực tế (ví dụ: viên đạn của bạn giống như mũi tên hoặc đá từ máy phóng hơn là súng bắn), thì bạn cũng có thể thử tăng tần suất cập nhật vật lý của mình.

Vì vậy, trong khi trò chơi của bạn có thể chạy với 60 khung hình mỗi giây, mô phỏng vật lý của bạn có thể chạy ở 120 cập nhật mỗi giây (đây là bản sửa lỗi phổ biến của bạn giải thích một thiết lập vật lý tốt có thể chạy ở tốc độ khác với vòng lặp kết xuất).

Tất nhiên, việc tăng khoảng thời gian cập nhật trên động cơ vật lý sẽ tạo ra tải lớn hơn cho CPU. Vì vậy, cách tiếp cận này chỉ hợp lý nếu các viên đạn của bạn không di chuyển rất nhanh (mà tôi đã giả sử vì bạn có thể nói rằng các viên đạn của bạn đang di chuyển theo hình vòng cung).


Cảm ơn! Tôi đang thực hiện điều này một cách hiệu quả (cũng như sử dụng các viên đạn hình đường thẳng) và tôi hy vọng nó khả thi khi trò chơi trở nên phức tạp hơn
Mala
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.