Tôi đang tạo một hệ thống đối tượng trò chơi dựa trên thành phần . Một số lời khuyên:
GameObjectchỉ đơn giản là một danh sáchComponents.- Có
GameSubsystems. Ví dụ, kết xuất, vật lý, vv Mỗi cái đềuGameSubsystemchứa con trỏ đến một sốComponents.GameSubsystemlà một sự trừu tượng rất mạnh mẽ và linh hoạt: nó đại diện cho bất kỳ lát cắt (hoặc khía cạnh) nào của thế giới trò chơi.
Có một nhu cầu trong một cơ chế đăng ký Componentstrong GameSubsystems(khi GameObjectđược tạo ra và sáng tác). Có 4 cách tiếp cận :
- 1: Chuỗi mô hình trách nhiệm . Mỗi
Componentđược cung cấp cho mọiGameSubsystem.GameSubsystemđưa ra quyết địnhComponentsđăng ký (và cách tổ chức chúng). Ví dụ: GameSubystemRender có thể đăng ký Thành phần kết xuất.
chuyên nghiệp Componentskhông biết gì về cách chúng được sử dụng. Khớp nối thấp. A. Chúng ta có thể thêm mới GameSubsystem. Ví dụ: hãy thêm GameSubystemTitle đăng ký tất cả Thành phần và đảm bảo rằng mọi tiêu đề là duy nhất và cung cấp giao diện để truy vấn các đối tượng theo tiêu đề. Tất nhiên, ElementTitle không nên được viết lại hoặc kế thừa trong trường hợp này. B. Chúng ta có thể tổ chức lại hiện có GameSubsystems. Ví dụ: GameSubystemAudio, GameSubystemRender, GameSubystemParticleEmmiter có thể được hợp nhất vào GameSubystemSpatial (để đặt tất cả âm thanh, trình giả lập, hiển thị Componentstrong cùng phân cấp và sử dụng các biến đổi tương đối cha mẹ).
con. Kiểm tra mọi thứ. Rất không hiệu quả.
con. Subsystemsbiết về Components.
- 2: Mỗi
Subsystemtìm kiếm choComponentscác loại cụ thể.
chuyên nghiệp Hiệu suất tốt hơn trong Approach 1.
con. Subsystemsvẫn biết về Components.
- 3:
Componentđăng ký chính nó trongGameSubsystem(s). Chúng tôi biết tại thời điểm biên dịch rằng có GameSubystemRenderer, vì vậy, hãy để ElementImageRender sẽ gọi một cái gì đó giống như GameSubystemRenderer :: register (ElementRenderBase *).
chuyên nghiệp Hiệu suất. Không kiểm tra không cần thiết như trong Approach 1.
con. Componentsđược kết hợp xấu với GameSubsystems.
- 4: Mẫu người hòa giải .
GameState(có chứaGameSubsystems) có thể thực hiện registerComponent (Thành phần *).
chuyên nghiệp Componentsvà GameSubystemskhông biết gì về nhau.
con. Trong C ++, nó trông giống như kiểu chuyển đổi xấu xí và chậm chạp.
Câu hỏi:
Cách tiếp cận nào tốt hơn và chủ yếu được sử dụng trong thiết kế dựa trên thành phần? Thực hành nói gì? Bất kỳ đề xuất về việc thực hiện Approach 4?
Cảm ơn bạn.
Componentstại GameObjectsnằm ngoài phạm vi câu hỏi của tôi. Đọc các bài viết về cách tiếp cận dựa trên thành phần hoặc đặt câu hỏi của riêng bạn trên trang web này nếu bạn quan tâm đến nó. Những gì bạn nghĩ GameSubsystemlà hoàn toàn sai.