Làm cách nào tôi có thể phát hiện trình phát bị nghiền nát trong nền tảng 2D?


19

Tôi đang kiểm tra va chạm cho một nhân vật platformer như trong # 1. Các chấm màu đỏ là các pixel được kiểm tra và các đường màu xám biểu thị các trục mà chúng liên quan đến. Tôi thích kết quả tôi nhận được từ việc kiểm tra va chạm theo cách này (so với hộp giới hạn). Mọi thứ hoạt động chính xác như tôi muốn ngoại trừ một vấn đề: phát hiện lòng.

Trong các hình ảnh sau đây, hộp màu xanh nhạt đại diện cho mặt đất, hộp màu cam là một vật thể và mũi tên chỉ hướng di chuyển.

Giải pháp đơn giản để phát hiện khi người chơi bị nghiền nát là xem các điểm va chạm ở hai phía đối diện có kích hoạt hay không. Nếu có, người chơi đang bị nghiền nát. Trong # 2, bạn có thể thấy một kịch bản nghiền bình thường. Người chơi được nối đất và các điểm va chạm trên cùng đang giao nhau với vật rơi. Điều này gây ra một lòng.

# 3, 4 và 5 hiện các tình huống có vấn đề. Trong # 3, người chơi đang di chuyển về phía đối tượng đang di chuyển lên. Một điểm va chạm bên phải đang đâm vào vật thể, gây ra va chạm và dừng người chơi.

Bây giờ, nếu đối tượng tiếp tục di chuyển lên và người chơi tiếp tục di chuyển sang phải (như thể hiện trong mục số 4), đối tượng sẽ xóa điểm va chạm bên phải của người chơi và người chơi di chuyển sang bên phải. Nhưng bây giờ, khi đã làm như vậy, đối tượng đang giao nhau với một điểm va chạm trên cùng gây ra một vụ nghiền dọc không mong muốn.

Một kịch bản tương tự được hiển thị trong # 5. Hai vật cách nhau đủ xa để các điểm va chạm phía dưới rõ ràng, cho phép người chơi ngã, nhưng không cho phép các điểm va chạm bên cạnh rõ ràng, gây ra một cú đập ngang không mong muốn.

Tôi đã suy nghĩ về một giải pháp, nhưng không có gì tôi nghĩ ra đã hoạt động rất tốt, vì vậy tôi tự hỏi liệu có ai có ý tưởng hay hiểu biết sâu sắc về cách giải quyết những vấn đề này không.

nhập mô tả hình ảnh ở đây

Để xóa một số nhầm lẫn, các điểm va chạm màu đỏ sẽ nằm trong sprite và các đường màu xám chỉ được sử dụng để biểu thị trục có liên quan cho mỗi điểm va chạm. Ví dụ: nếu sprite của nhân vật là một hình vuông màu xanh lá cây đơn giản, các điểm va chạm sẽ trông giống như thế này:

nhập mô tả hình ảnh ở đây

Câu trả lời:


34

Tôi nghĩ bạn sẽ phải cân nhắc chuyển động của chiếc hộp . Đó là, chỉ nghiền nát nếu hộp di chuyển về phía người chơi.

Điều này tương tự như các vấn đề khác trong platformer, trong đó sự di chuyển là quan trọng. Ví dụ: đối với các nền tảng mà bạn có thể nhảy qua và nhảy xuống từ bên dưới, đừng kiểm tra va chạm nếu người chơi di chuyển lên trên.

Vì vậy, một khối có thể đè bẹp người chơi từ trên cao chỉ khi khối đó di chuyển xuống dưới; từ bên dưới chỉ khi khối di chuyển lên trên; từ bên trái chỉ khi khối di chuyển sang phải, v.v.


13
+1 Hãy xem xét rằng khối đang hoạt động ở đây, không phải người chơi. Vì vậy, nếu bạn kiểm tra xem hộp có nghiền người chơi hay không thay vì kiểm tra xem người chơi có bị nghiền không thì vấn đề sẽ dễ giải quyết hơn
Niels

Còn khi các khối không di chuyển thì sao? Tôi nhận ra bây giờ tôi đặt mũi tên lên các khối ở số 5, nhưng đó có nghĩa là hai khối đứng yên.
IanLarson

Nếu bạn quyết định rằng các khối đứng yên không nên nghiền nát, chỉ cần đảm bảo rằng người chơi không bị mắc kẹt và có thể di chuyển ra khỏi đường đi.
congusbongus

Argh, tôi ghét bị nghiền nát bởi hai đối tượng thực sự đang di chuyển xa nhau, chỉ vì tôi đã làm cho nó có pixel và khung hình hoàn hảo và nhà phát triển lười biếng.
tê giác

9

Có các điểm "thử nghiệm" nằm trong hộp màu xám được hiển thị trong hình ảnh số 1 của bạn - tức là chỉ giết người chơi nếu bạn phát hiện ra một cú đánh vào một trong các pixel ở đó.


1
Bạn có nghĩa là điểm kiểm tra bổ sung "bên trong" giới hạn của các điểm va chạm? Vấn đề tôi thấy đó là độ phân giải va chạm sẽ xảy ra ở mỗi trục khi một trong những điểm va chạm của nó bị "kích hoạt" trước khi đối tượng thậm chí có cơ hội tiếp cận các điểm kiểm tra bên trong.
IanLarson

6

Là một người lớn lên với các nền tảng của thập niên 80, nhận xét đầu tiên của tôi là các điểm liên lạc phải chính xác trên sprite, không phải bất cứ nơi nào bên ngoài nó. Có một vài trải nghiệm khó chịu hơn là chết khi vũ khí / máy nghiền / kẻ thù rõ ràng cách xa nhân vật của bạn vài pixel - và loại trải nghiệm đó là thứ ngăn cản mọi người chơi.

Với ý nghĩ đó, ý tưởng có các điểm riêng biệt cho va chạm ngang và dọc đơn giản là không bay. Vì vậy, trường hợp 3 và 5 của bạn không tồn tại.

Đối với việc phát hiện va chạm, như đã nói trước đây, bạn cần xem xét hướng di chuyển và bạn có hai trục chuyển động để xem xét. Nếu máy nghiền bị hỏng, người chơi sẽ không thể đi về phía trước - nó sẽ hoạt động như một bức tường. Vì vậy, với các điểm phát hiện ngang và dọc ở cùng một vị trí, bạn không thể gặp trường hợp 4, ngay cả trước khi bạn thêm hướng di chuyển vào hỗn hợp.

Máy nghiền hướng lên trên làm tăng thêm độ phức tạp. Nếu nó nhanh đến mức người chơi không có cơ hội trốn thoát thì OK. Nhưng nếu nó chậm hơn, người chơi sẽ mong đợi có thể chạy qua nền tảng đang lên và nhảy khỏi phía bên kia. Sprite của người chơi tăng lên trên máy nghiền, và phát hiện nghiền xảy ra ở trần nhà .


3
Điểm nhỏ - bạn không biết sprite của anh ấy trông như thế nào. Đối với tất cả chúng ta biết nó có thể chính xác như được hiển thị trong các hình ảnh trên, vì vậy trường hợp 3 và 5 có thể hoàn toàn hợp lệ.
Alex

1
Alex nói đúng. Tôi đã thực hiện một chỉnh sửa để làm rõ. Tôi đồng ý rằng không có gì tồi tệ hơn các hộp va chạm bất tiện. Tôi nghĩ rằng tôi hiểu quan điểm của bạn về việc không sử dụng các điểm riêng biệt cho các trục khác nhau. Nếu tôi làm, điều đó sẽ biến ví dụ trên từ có tám điểm thành bốn, mỗi điểm một góc, đúng không? Tôi thực sự đã thực hiện một số thử nghiệm với ý nghĩ đó (với kết quả thấp hơn mong muốn), nhưng tôi rất do dự khi làm điều đó, vì các góc "tách biệt" đạt được hành vi mà tôi đang tìm kiếm gần như hoàn hảo. Đây thực sự là những tình huống vấn đề duy nhất tôi gặp phải.
IanLarson

0

Bạn có thể làm cho vật thể "cứng" hơn mặt đất, nghĩa là, giả sử va chạm, người chơi bị đẩy "xuống" mặt đất, trái ngược với việc bị "đẩy" vào vật thể đang di chuyển.

Điều này giả định rằng người chơi không thể tự đẩy "vào" vật thể hoặc mặt đất.


0

Nếu bạn có thể phát hiện sự chồng chéo của các đối tượng mà không phải chờ chúng hiển thị, một cách tiếp cận đơn giản là xử lý chuyển động cho người chơi và các đối tượng khác một cách độc lập, mỗi lần một pixel, với các kiểm tra va chạm riêng biệt. Nếu người chơi di chuyển tự do và va chạm với vật thể do chuyển động như vậy, hãy lùi lại. Nếu xảy ra va chạm với một vật thể do chuyển động của vật thể đó, hãy kiểm tra xem người chơi có thể di chuyển cùng hướng với vật thể đó không. Nếu vậy, di chuyển người chơi. Nếu không, hãy xử lý tình huống "nghiền" một cách thích hợp (gây sát thương hoặc giết chết người chơi và / hoặc di chuyển vật thể va chạm về phía sau, tùy thuộc vào liên hệ).

BTW, nếu chỉ có một số lượng kết hợp các hình dạng giới hạn có thể va chạm, thì có thể hữu ích khi tính toán các ảnh bitmap "phát hiện va chạm" sao cho nếu một pixel được đặt trong sprite đầu tiên ở offset (x1, y1) và trong giây tại offset (x2, y2) của giây, pixel ở offset (x1-x2, y1-y2) sẽ được đặt trong bản đồ va chạm. Bản đồ va chạm được tính toán trước như vậy sẽ giúp phát hiện va chạm giữa hai họa tiết bằng cách kiểm tra trạng thái của một pixel trong bản đồ va chạm.


0

Phải mất hai đối tượng để nghiền nát một người chơi. Phát hiện lòng của bạn nên kiểm tra xem người chơi có ở giữa hai đối tượng không gian, khoảng cách giữa chúng bằng với kích thước của người chơi và khoảng cách giảm dần.


0

Tôi tìm thấy bên cạnh để được làm việc cho đến nay. Nó không yêu cầu thông tin "bên ngoài" về chuyển động của máy nghiền và giải quyết vấn đề dương tính giả. Khi phát hiện dương tính giả, nó được coi là va chạm (và đây là thực tế):

Ý tưởng là: tại sao phải kiểm tra xem máy nghiền có di chuyển hay không khi chúng ta thực sự quan tâm nếu nhân vật đang di chuyển. Cả hai đều có thể trả lời nếu crush là dương tính giả gây ra bởi chuyển động của chính nhân vật hoặc crush thực sự bởi chuyển động của máy nghiền.

Nếu nhân vật đang di chuyển và bị nghiền nát (va chạm vào các mặt đối diện cho khung hình đến) thì hãy kiểm tra lại xem có bị đè lên tọa độ khung / lần lặp cuối cùng không:

  1. Nếu không được xác nhận lại thì đó là do chuyển động của chính nhân vật và nhân vật sẽ được đưa trở lại tọa độ khung / lần lặp cuối cùng giống như một vụ va chạm

  2. Nếu crush được xác nhận lần thứ hai thì tiến hành crush.

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.