Va chạm 2d nhanh, chính xác


17

Tôi đang làm việc trên một game bắn súng topdown 2d, và bây giờ cần phải vượt ra ngoài hệ thống va chạm hộp hình chữ nhật cơ bản của tôi.

Tôi có cấp độ lớn với nhiều họa tiết khác nhau, tất cả đều có hình dạng và kích cỡ khác nhau. Hoạ tiết cho các họa tiết là tất cả các tệp png vuông có nền trong suốt, vì vậy tôi cũng cần một cách để chỉ va chạm khi người chơi đi vào phần màu của kết cấu, chứ không phải nền trong suốt.

Tôi dự định xử lý va chạm như sau:

  1. Kiểm tra xem có bất kỳ họa tiết nào trong phạm vi của người chơi không
  2. Làm một thử nghiệm va chạm hộp giới hạn trực tràng
  3. Thực hiện một vụ va chạm chính xác (Nơi tôi cần giúp đỡ)

Tôi không bận tâm đến các kỹ thuật tiên tiến, vì tôi muốn thực hiện đúng với tất cả các yêu cầu của mình, nhưng tôi không chắc làm thế nào để tiếp cận điều này. Những kỹ thuật hoặc thậm chí thư viện để thử. Tôi biết rằng tôi có thể sẽ cần phải tạo và lưu trữ một số loại hình dạng đại diện chính xác cho mỗi sprite trừ nền trong suốt.

Tôi đã đọc rằng mỗi pixel là chậm, do đó, với mức độ lớn và số lượng đối tượng tôi không nghĩ rằng nó sẽ phù hợp. Tôi cũng đã xem Box2d, nhưng không thể tìm thấy nhiều tài liệu hoặc bất kỳ ví dụ nào về cách khởi động và chạy với SFML.

Câu trả lời:


18
  1. Bước một, tạo lưới và cập nhật nó cho mọi đối tượng di chuyển.
  2. Chỉ kiểm tra va chạm giữa các đối tượng trong cùng một hình vuông.
  3. Kiểm tra xem hộp giới hạn của các đối tượng giao nhau (hình chữ nhật chứa chúng).
  4. Kiểm tra va chạm hoàn hảo pixel bằng phiên bản độ phân giải thấp (xem Vật lý trò chơi).
  5. Thực hiện kiểm tra bình thường về dấu vết phác thảo như được mô tả trong Vật lý trò chơi (Q 2)

Bước 1:

Tạo một mảng lưới 2d. Mọi đối tượng đều biết nó chiếm hình vuông nào bởi vị trí x, y và chiều rộng và chiều cao của nó. Nếu một đối tượng bị di chuyển đi, nó sẽ tự xóa khỏi hình vuông cũ và cập nhật hình vuông mới mà nó chiếm giữ.

Điều này chỉ mất tổng cộng O (n) cho n đối tượng. Đối với bất kỳ đối tượng cụ thể O (1).

Bước 2:

Chạy tất cả các kiểm tra va chạm giữa các đối tượng trong cùng một hình vuông. Không cần phải chạy thử nghiệm va chạm giữa các đối tượng trong các ô vuông khác nhau. Một vật thể có thể chiếm tới bốn ô vuông nếu nó có kích thước trung bình. Điều này có nghĩa là rất ít kiểm tra.

Bước 3:

Kiểm tra giao điểm giữa các hình chữ nhật đối tượng. Nếu không có giao lộ tồn tại, dừng lại.

Bước 4:

Kiểm tra các va chạm hoàn hảo pixel giữa các đường viền của các đối tượng chỉ bên trong khu vực giao nhau. Nó phải đủ nhanh. Nếu không, hãy tạo một mảng 2d-boolean độ phân giải thấp và kiểm tra nó trước, nếu bạn thấy va chạm ở đó, bạn sẽ chỉ cần kiểm tra một phân đoạn nhỏ trong mảng 2d độ phân giải cao giúp bạn tiết kiệm thời gian quý báu.

Vui lòng đọc phần này để biết khái niệm về cách chia thế giới trò chơi của bạn thành một lưới các ô vuông:

Tạo một hệ thống phát hiện va chạm hiệu quả

Vui lòng đọc phần này để biết cách phát hiện các va chạm hoàn hảo của pixel .

Vật lý trò chơi / Phát hiện va chạm 2D AS3

Bạn có thể cải thiện hiệu suất đáng kể:

  1. Lưu phiên bản độ phân giải thấp (1/16) của phác thảo để kiểm tra trước.

  2. Chỉ kiểm tra trong khu vực mà hai giáo phái giao nhau.

  3. bằng cách chia đại cương cho các phân đoạn và chỉ kiểm tra va chạm giữa các phân đoạn trước.

Xin vui lòng cảm thấy hoan nghênh để bình luận và tôi sẽ giải thích.

kiểm tra trong khu vực ngã tư


1
Như Arthur đã nói, thay thế các bước 1. và 2. của bạn bằng lưới và để phát hiện va chạm chính xác, Bạn có thể sử dụng phiên bản độ phân giải thấp của hình ảnh.
Markus von Broady

1
Và nếu bạn thực sự cần, bạn cũng có thể sử dụng một kỹ thuật tương tự với câu trả lời của tôi ở đây: gamedev.stackexchange.com/questions/38481/ Kẻ
Markus von Broady

Markus chỉ ra một ý tưởng tốt. Bạn nên sử dụng mảng 2d-boolean hoặc mảng 1d được coi là 2d và bạn có thể lưu 1/2 1/4 1/8 phiên bản độ phân giải thấp của mảng đó để tăng tốc mọi thứ. Điều này có lẽ sẽ không cần thiết vì tính toán trên mảng 2d-boolean rất nhanh. Nó vẫn là một công cụ hữu ích để có.
sói

Nếu người chơi hoàn toàn được chứa bên trong một hình vuông trên lưới, bạn chỉ có thể kiểm tra đối với các đối tượng trong hình vuông đó. Người chơi có thể ở bốn ô vuông liền kề cùng một lúc. Đó có phải là ý bạn không? Nếu bạn có nghĩa là giao điểm giữa các hình chữ nhật, vâng, bạn chỉ cần kiểm tra va chạm nếu chúng giao nhau.
sói

1
Tôi hy vọng bản cập nhật sẽ giúp mọi thứ rõ ràng hơn. Khi bạn có một số mã được viết, bạn có thể đăng nó trong phần đánh giá mã và liên kết với chúng tôi để nhận xét. codereview.stackexchange.com
wolfdawn
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.