Làm cách nào để tìm điểm tác động với phát hiện va chạm 2D trên pixel?


7

Tôi đang tạo một platformer và đã triển khai phát hiện va chạm trên mỗi pixel. Tuy nhiên, điều này đã gây ra 2 trở ngại mà tôi chưa tìm ra. Trở ngại đầu tiên, mà câu hỏi này là, là tôi không biết cách tìm ra điểm tác động một cách hiệu quả (vấn đề khác của tôi có lẽ sẽ là một câu hỏi khác trên StackExchange này).

Tôi có nhân vật của mình rơi hoặc nhảy với tốc độ nhất định bằng pixel. Nghĩa là, mỗi khung hình nhân vật có thể rơi 4 pixel hoặc nhảy 4 pixel chẳng hạn. Nếu nhân vật ngã và giao nhau với một đối tượng thì nhân vật sẽ đáp xuống đối tượng đó (và ngược lại, nếu họ nhảy và đánh một đối tượng thì họ sẽ bắt đầu ngã lại). Tuy nhiên, nếu, chẳng hạn, một ký tự rơi 4 pixel và điều này đặt chúng 3 pixel vào một đối tượng, chúng sẽ ngừng rơi nhưng sẽ không ở vị trí thích hợp. Nhân vật sẽ xuất hiện dừng lại ở điểm ảnh hưởng đầu tiên.

Vì vậy, làm thế nào tôi có thể tìm thấy điểm tác động một cách hiệu quả? Tôi chỉ có một ý tưởng mơ hồ là chỉ so sánh các pixel phác thảo, kiểm tra sự va chạm và tăng chúng lên hoặc xuống cho đến khi có một vụ va chạm, nhưng có vẻ như nó có thể phức tạp để tháo gỡ.

Nếu bạn muốn biết nền tảng này, tôi đang phát triển bằng XNA cho Windows Phone 7.


3
Liên quan, dupe có thể xảy ra (về mặt câu trả lời): gamedev.stackexchange.com/questions/2942/ ích
Tetrad

@Tetrad, cảm ơn. Tôi hy vọng bạn có thể hiểu lý do tại sao tôi không nghĩ đến việc tìm kiếm một câu hỏi về va chạm địa hình và tên lửa: P Nó không hoàn toàn là trò chơi tôi đang phát triển
Bob

Bạn đã xem xét vật lý Box2D chưa?
dùng712092

Bạn có thể gặp vấn đề được gọi là đường hầm .
dùng712092

Nếu bạn chưa có, hãy thêm quét Quét vào các truy vấn tìm kiếm của bạn. Các thuật toán phát hiện va chạm động thường sử dụng tham số quét để có được điểm va chạm sớm nhất.
sam hocevar

Câu trả lời:


5

Tôi đã đọc một bài viết thực sự hay trước đó mô tả cách phát hiện va chạm được thực hiện trong các trò chơi Sonic trước đó.

Bài viết đó sẽ là một tài liệu tham khảo tuyệt vời cho chủ đề này, nhưng tôi dường như không thể tìm thấy nó vào lúc này. Nếu tôi làm, tôi sẽ cập nhật bài viết của mình. Trong khi đó tôi sẽ cố gắng lấy nó từ bộ nhớ!

Tôi tin rằng kỹ thuật này rất thú vị và có thể giải quyết các vấn đề của bạn, mà không cần phải thay đổi thành một công cụ vật lý cũng như không để hoàn toàn va chạm trên mỗi pixel.

Về cơ bản những gì bài viết mô tả là một công cụ platformer dựa trên gạch trong đó mỗi loại gạch có dữ liệu va chạm trên mỗi pixel như thế này:

Ngói

Nhưng nhân vật của bạn chỉ có một số điểm tiếp xúc hạn chế. Ví dụ trong bài viết tôi nhớ rằng chỉ có 3 pixel ở gần đầu âm thanh (một ở bên trái của sprite, một ở giữa và một ở bên phải) sẽ được sử dụng để phát hiện va chạm khi nhảy, 3 pixel gần chân của âm thanh phát hiện va chạm với sàn và 2 ở gần giữa mỗi bên để phát hiện va chạm với tường.

Tôi sẽ chỉ làm một cách nhanh chóng những gì tôi nhớ lại. Một cái gì đó như (không dựa vào độ chính xác của vị trí pixel của tôi, tôi chỉ tạo ra chúng):

Âm thanh

Bằng cách này, bạn chỉ cần kiểm tra va chạm bằng cách sử dụng các điểm riêng lẻ này (những điểm phụ thuộc vào tình huống, chẳng hạn như nhảy hoặc ngã) và trong trường hợp va chạm, bạn chỉ cần điều chỉnh sprite dựa trên các điểm đó. Chẳng hạn, nếu một trong những điểm trên va chạm với một số pixel bị chặn trong ô trần, bạn chỉ cần đưa sprite xuống cho đến khi điểm đó không còn va chạm.

Biên tập

Mặc dù đây vẫn không phải là liên kết mà tôi đã đọc ban đầu, nó cũng đề cập đến các điểm va chạm (được đặt tên là cảm biến ) và sẽ cung cấp rất nhiều thông tin. Đọc các phần khác của hướng dẫn quá!

http://info.sonicretro.org/SPG:Solid_Tiles


Điều đó khiến tôi nhớ khi tôi còn nhỏ, như 8 tuổi và làm một số trò chơi với Đa phương tiện Fusion. Chúng tôi thường sử dụng các "cảm biến" này như một số thanh bên dưới, lên và theo ký tự. và nó quản lý mọi thứ rất tốt!
Gustavo Maciel

2

Trước hết, tôi sẽ không phát hiện va chạm hoàn hảo pixel trong trò chơi nền tảng 2D trên thiết bị di động vì lý do hiệu suất rõ ràng. Các loại kiểm tra này rất nặng về CPU và trừ khi bạn thực hiện kiểm tra rộng để lọc các đối tượng tách biệt, chắc chắn nó sẽ ảnh hưởng tiêu cực đến trò chơi của bạn.

Tôi sẽ sử dụng các hộp và / hoặc hình cầu giới hạn (tùy thuộc vào hình dạng thực thể của bạn). Chất lượng phát hiện sẽ đủ tốt. Bạn thậm chí có thể sử dụng nhiều hơn một hình dạng để mô hình hóa một thực thể. Các thử nghiệm giữa các hình dạng này rất dễ dàng và bạn có thể biết các điểm tác động và cố định vị trí của các thực thể.

Nhưng, nếu bạn không muốn tự mình thực hiện mọi thứ, bạn có thể muốn sử dụng Box2DX (cổng C # của Box2D) và chỉ sử dụng phần phát hiện va chạm của thư viện.


Cảm ơn vì liên kết đến Box2D, tôi sẽ xem xét nó. Về hiệu suất, các họa tiết của tôi rất nhỏ và "trường học cũ", nhưng được thu nhỏ lại để không có quá nhiều pixel để kiểm tra. Trước tiên tôi cũng kiểm tra các hình chữ nhật giới hạn và chỉ thực hiện trên mỗi pixel nếu các giới hạn giao nhau. Tôi thực hiện trên mỗi pixel vì các pixel quá lớn (được tăng tỷ lệ) nên nó sẽ tắt nếu chúng không tương tác đúng.
Bob
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.