Tôi có một vấn đề với độ phân giải va chạm AABB.
Tôi giải quyết giao điểm AABB bằng cách giải quyết trục X trước, sau đó đến trục Y. Điều này được thực hiện để ngăn chặn lỗi này: http://i.stack.imgur.com/NLg4j.png
Phương thức hiện tại hoạt động tốt khi một đối tượng di chuyển vào trình phát và người chơi phải được đẩy theo chiều ngang. Như bạn có thể thấy trong .gif, các gai ngang đẩy người chơi chính xác.
Tuy nhiên, khi các gai dọc di chuyển vào trình phát, trục X vẫn được giải quyết trước tiên. Điều này làm cho "sử dụng gai như một thang máy" là không thể.
Khi người chơi di chuyển vào các gai thẳng đứng (bị ảnh hưởng bởi trọng lực, rơi vào chúng), anh ta bị đẩy vào trục Y, vì không có sự trùng lặp nào trên trục X để bắt đầu.
Một cái gì đó tôi đã thử là phương pháp được mô tả trong câu trả lời đầu tiên của liên kết này: Phát hiện va chạm đối tượng hình chữ nhật 2D
Tuy nhiên, các gai và các vật thể chuyển động di chuyển bằng cách thay đổi vị trí của chúng, không phải là vận tốc và tôi không tính toán vị trí dự đoán tiếp theo của chúng cho đến khi phương thức Update () của chúng được gọi. Không cần phải nói giải pháp này cũng không hiệu quả. :(
Tôi cần giải quyết xung đột AABB theo cách mà cả hai trường hợp được mô tả ở trên đều hoạt động như dự định.
Đây là mã nguồn va chạm hiện tại của tôi: http://pastebin.com/MiCi3nA1
Tôi thực sự biết ơn nếu ai đó có thể xem xét vấn đề này, vì lỗi này đã xuất hiện trong động cơ ngay từ đầu và tôi đã đấu tranh để tìm một giải pháp tốt, mà không thành công. Điều này thực sự khiến tôi mất nhiều đêm để xem mã va chạm và ngăn tôi đến "phần thú vị" và mã hóa logic trò chơi :(
Tôi đã thử triển khai hệ thống va chạm giống như trong bản demo nền tảng XNA AppHub (bằng cách sao chép hầu hết các nội dung). Tuy nhiên, lỗi "nhảy" xảy ra trong trò chơi của tôi, trong khi nó không xảy ra trong bản demo AppHub. [lỗi nhảy: http://i.stack.imgur.com/NLg4j.png ]
Để nhảy tôi kiểm tra xem người chơi có "onGround" không, sau đó thêm -5 vào Velocity.Y.
Vì Velocity.X của người chơi cao hơn Velocity.Y (tham khảo bảng thứ tư trong sơ đồ), onGround được đặt thành đúng khi không nên và do đó cho phép người chơi nhảy lên giữa không trung.
Tôi tin rằng điều này không xảy ra trong bản demo AppHub vì Velocity.X của người chơi sẽ không bao giờ cao hơn Velocity.Y, nhưng tôi có thể bị nhầm.
Tôi đã giải quyết điều này trước bằng cách giải quyết trên trục X trước, sau đó trên trục Y. Nhưng điều đó làm tăng sự va chạm với các gai như tôi đã nêu ở trên.