Tôi đang sử dụng Box2D lần đầu tiên một cách nghiêm túc trong một Trò chơi Flash có kích thước trung bình mà tôi đang làm việc. Kinh nghiệm hiện tại của tôi với Box2D bị hạn chế trong việc tạo ra một thế giới, cơ thể và thêm những cơ thể đó vào thế giới theo cách thức hoạt động.Làm thế nào tôi có thể theo dõi tất cả các va chạm Box2D của tôi một cách sạch sẽ, dễ quản lý?
Tôi đang tìm thấy nó dễ dàng, đủ để tích hợp Box2D vào môi trường trò chơi của tôi, duy trì mã được viết tốt và đã hoàn thành một vài hướng dẫn đi qua đối phó với va chạm. Vấn đề mà tôi đang phải đối mặt bây giờ là trò chơi của tôi sẽ có nhiều thi thể, mỗi người tương tác với các cơ quan khác theo nhiều cách khác nhau, và tôi thấy khó để viết lớp con b2ContactListener
của riêng mình mà không bị lộn xộn.
Dựa trên hướng dẫn tôi đã sử dụng, tôi đã tạo lớp con của riêng mình là b2ContactListener
và thêm ghi đè phương thức BeginContact()
. Đối số rằng BeginContact()
nhận được khi nó được gọi là sẽ tham chiếu một thể hiện của b2Contact
, thông qua đó tôi có thể truy cập hai trường hợp b2Fixture
(hai trường hợp đã va chạm). Sau đó, tôi có thể truy cập cá thể b2Body
được liên kết với mỗi số trong số b2Fixture
giây đó.
Vấn đề: Hiện nay tôi có một cách vòng xoay tìm ra những gì hai điều va chạm (tức là cho dù họ đang một bức tường và một tên lửa, hay máy nghe nhạc và một cây, vv) trong đó sử dụng
GetUserData()
và vẻ như ví dụ này:var f1Player:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Player var f2Player:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Player var f1Tree:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Tree var f2Tree:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Tree // ... continutes with all possible combinations. // Example of managing a collision: if(f1Player && f2Tree) { // Player (FixtureA) and Tree (FixtureB) } if(f2Player && f1Tree) { // Player (FixtureB) and Tree (FixtureA) }
Như bạn có thể thấy, điều này sẽ kết thúc cực kỳ dài và không thể quản lý được. Tôi cũng phải viết từng bộ hành động để thực hiện hai lần để phục vụ cho một phần tử nhất định là FixtureA hoặc FixtureB, hoặc ngược lại (rõ ràng dưới dạng một cuộc gọi hàm với các tham số được hoán đổi thay vì viết lại theo nghĩa đen).
Đây rõ ràng không phải là cách tiếp cận chính xác, nhưng tôi chưa tìm được tài nguyên giải thích kỹ hơn về quản lý phát hiện va chạm.
Có ai có kinh nghiệm quản lý phát hiện va chạm bằng cách sử dụng Box2D mà họ có thể chia sẻ không? Ngoài ra, đang sử dụng SetUserData(entityThatOwnsTheBody);
cách chính xác để sử dụng phương pháp đó?
Có vẻ như câu lệnh 'if' dài được chuyển vào lớp Đang. Làm thế nào về chế biến mà chỉ nên được thực hiện một lần cho vụ va chạm, ví dụ như. chơi một âm thanh hoặc tăng điểm. – iforce2d
@ iforce2d Đó là sự thật, tôi có nghĩa là sẽ phải có các câu lệnh 'if()' để thêm tiêu chí cho mỗi kết hợp va chạm, nhưng điều này có vẻ được tổ chức hơn là có mọi thứ trong một tệp. Nó cung cấp cho tôi khả năng dễ dàng xác định vị trí một va chạm giữa hai điều thông qua các lớp học có liên quan và tôi không phải kiểm tra xem đó là cái nào cho mọi va chạm bằng tay. – Marty
Đối với các lần xuất hiện đơn lẻ, có thể được quản lý bởi cá nhân cũng bằng cách sử dụng boolean 'hasBeenTouched' đơn giản hoặc tương tự. – Marty