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.
Để 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: