cuốn sách gpt4 ai đã làm

c++ - Quyết định kế thừa/giao diện cho động cơ vật lý

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 23:25:27 27 4
mua khóa gpt4 Nike

Đây là một dự án trò chơi nhỏ dành cho MinGW/Windows sử dụng SDL.

Tôi đang làm việc trên một công cụ vật lý và ý tưởng là có mộtVật lý::Đối tượng, tất cả các đối tượng vật lý phải bắt nguồn từ nó, và nó sẽ có tính toàn cầu Đăng ký hệ thống của riêng bạn trong Vật lý:: class (đây là mẫu đơn hình), do đó người dùng không cần theo dõi những đối tượng nào được đưa vào phép tính vật lý và chỉ cần gọi một hàm như Vật lý::Hệ thống::PerformTimestepCalculation(double dt ).

Điều này hoạt động rất tốt, tôi thậm chí còn sử dụng một lớp dẫn xuất Vật lý::Vòng tròn Để thực hiện nó, đây là một vòng tròn 2D. Tôi khá hài lòng với khả năng phát hiện va chạm dự đoán, mặc dù tôi vẫn cần tối ưu hóa nó.

Dù sao đi nữa, khi tôi bắt đầu thêm các giá trị nguyên thủy khác để đưa vào tính toán, tôi gặp phảirắc rối, chẳng hạn như dòng. Vật lý::Hệ thống::PerformTimestepCalculation(double dt) đầy đủ các cặp Đối tượng::GetID() hoặc các lệnh gọi hàm tương tự (có thể là một cách để tránh Dynamic_cast<>), nhưng tôi cảm thấy bẩn.

tôi đã làm một ít đọcvà nhận ra rằng các thành phần trong hệ thống phân cấp của tôi không thể thay thế được (tức là sự va chạm giữa hai vòng tròn rất khác với sự va chạm giữa hai đường thẳng).

tôi thích của tôi Vật lý::Đối tượngSystem Cách các lớp tự "đăng ký" để chúng tự động được đưa vào tính toán, tôi thực sự không muốn đánh mất điều này.

Phải có một số con đường thiết kế hợp lý khác. Làm cách nào tôi có thể thiết kế lại mọi thứ tốt hơn để những vật thể không thể thay thế không gây cản trở?

Đã chỉnh sửa chỉ để tham khảo:Cuối cùng, tôi chia nhỏ các thuộc tính thực thể và hình dạng, tương tự như mô tả trong câu trả lời được chấp nhận, tương tự như mô hình hệ thống thành phần thực thể. Điều này có nghĩa là tôi vẫn có logic "đây là đường tròn hay đường thẳng, đây là đường thẳng hay đường tròn?", nhưng tôi không còn giả vờ rằng tính đa hình đang giúp tôi ở đây nữa. Điều này cũng có nghĩa là tôi sử dụng một số loại nhà máy và nhiều thế giới tính toán có thể xảy ra cùng một lúc!

câu trả lời hay nhất

Các công cụ vật lý có sẵn công khai thành công nhất không quá nặng về mặt "mẫu" hoặc "thiết kế hướng đối tượng".

Đây là một bản tóm tắt ủng hộ khẳng định táo bạo được thừa nhận của tôi:

sóc chuột - Viết bằng C là đủ rồi.

Box2d - Viết bằng C++, ở đây có tính đa hình. Có một hệ thống phân cấp hình dạng (lớp cơ sở b2Shape) với một số hàm ảo. Tuy nhiên, sự trừu tượng này bị rò rỉ như một cái sàng và bạn sẽ tìm thấy nhiều phép biến đổi đối với các lớp lá trong toàn bộ mã nguồn. Ngoài ra còn có một hệ thống phân cấp "liên hệ", đã được chứng minh là thành công hơn, mặc dù việc viết lại nó mà không có tính đa hình bằng cách sử dụng một hàm ảo sẽ là chuyện nhỏ (tôi tin rằng sóc chuột sử dụng con trỏ hàm). b2Body là một lớp dùng để biểu diễn các phần cứng và nó không ảo.

Viên đạn - Được viết bằng C++ và được sử dụng trong một số lượng lớn trò chơi. Rất nhiều tính năng, nhiều mã (so với hai tính năng còn lại). Thực tế, có một lớp cơ sở dành cho phần mở rộng biểu diễn phần thân cứng và phần thân mềm, nhưng chỉ một phần nhỏ của mã có thể sử dụng nó. Hầu hết các chức năng ảo của lớp cơ sở đều liên quan đến tuần tự hóa (lưu/tải trạng thái động cơ). Phần mềm không thể triển khai hai chức năng ảo còn lại, một trong số đó có TODO thông báo cho chúng tôi rằng chúng tôi cần dọn dẹp một số lỗi. Đây không hẳn là sự chứng thực rõ ràng về tính đa hình trong động cơ vật lý.

Có rất nhiều điều để nói và tôi thậm chí còn chưa thực sự bắt đầu trả lời câu hỏi của bạn. Tôi muốn nhấn mạnh rằng tính đa hình không phải là thứ được triển khai hiệu quả trong các công cụ vật lý hiện có. Điều này có lẽ không phải do tác giả không "hiểu" được hướng đối tượng.

Vì vậy, dù sao đi nữa, lời khuyên của tôi là: hãy từ bỏ tính đa hình cho các lớp thực thể của bạn. Cuối cùng, bạn sẽ không có 100 loại khác nhau mà không thể tái tạo lại sau này, dữ liệu hình dạng của công cụ vật lý của bạn sẽ khá đồng nhất (đa giác lồi, hình hộp, hình cầu, v.v.) và dữ liệu thực thể của bạn có thể sẽ còn đồng nhất hơn nữa (có thể chỉ cần cơ thể cứng nhắc).

Một sai lầm khác mà tôi nghĩ bạn đang mắc phải là chỉ hỗ trợ một Physics::System. Sẽ rất hữu ích nếu có thể mô phỏng cơ thể của nhau một cách độc lập (ví dụ: đối với trò chơi hai người chơi) và cách dễ nhất để làm điều này là hỗ trợ nhiều Vật lý::Hệ thống.

Với suy nghĩ này, "mẫu" rõ ràng nhất cần làm theo là mẫu nhà máy. Khi người dùng muốn tạo một vật cứng, họ cần yêu cầu Physics::System (hoạt động như một nhà máy) làm điều đó cho họ, vì vậy trong Physics::System của bạn:

// trả về một con trỏ thông minh sẽ không phải là không hợp lý, nhưng tôi sẽ trả về một con trỏ thô để đơn giản:
cứng nhắc_body_t* AddBody( body_params_t const& body_params );

Trong mã khách hàng:

Circle_params_t vòng tròn(1.f /*radius*/);
body_params_t b( 1.f /*mass*/, &circle /*shape params*/, xform /*system Transform*/ );
cứng_body_t* body = vật lý_system.AddBody( b );

Dù sao cũng có chút lảng vảng. Hy vọng điều này sẽ giúp. Ít nhất tôi muốn chỉ cho bạn box2d. Nó được viết bằng phương ngữ C++ rất đơn giản và các mẫu được áp dụng sẽ phù hợp với công cụ của bạn, cho dù là 3D hay 2D.

Về các quyết định kế thừa/giao diện cho c++ - công cụ vật lý, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/9339129/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress