Tôi đang tạo một component-based game object system. Một số mẹo:Đăng ký thành phần đối tượng trò chơi trong hệ thống con trò chơi? (Thiết kế đối tượng trò chơi dựa trên thành phần)
GameObject
chỉ đơn giản là danh sáchComponents
.- Có
GameSubsystems
. Ví dụ: kết xuất, vật lý, v.v. MỗiGameSubsystem
chứa các con trỏ đến một số sốComponents
.GameSubsystem
là một sự trừu tượng rất mạnh mẽ và linh hoạt: nó đại diện cho bất kỳ slice (hoặc khía cạnh nào) của thế giới game.
Có nhu cầu trong cơ chế đăng ký Components
trong GameSubsystems
(khi GameObject
được tạo và soạn). Có 4 phương pháp tiếp cận:
- 1: Chain of responsibility mẫu. Mỗi
Component
được cung cấp cho mọiGameSubsystem
.GameSubsystem
đưa ra quyết địnhComponents
nào để đăng ký (và cách sắp xếp chúng). Ví dụ, GameSubsystemRender có thể đăng ký thành phần Renderable.
pro. Components
không biết gì về cách chúng được sử dụng. Khớp nối thấp. A. Chúng tôi có thể thêm GameSubsystem
mới. Ví dụ, hãy thêm GameSubsystemTitles đăng ký tất cả ComponentTitle và đảm bảo rằng mỗi tiêu đề là duy nhất và cung cấp giao diện để quering đối tượng theo tiêu đề. Tất nhiên, ComponentTitle không nên được viết lại hoặc thừa hưởng trong trường hợp này. B. Chúng tôi có thể sắp xếp lại GameSubsystems
hiện có. Ví dụ, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter có thể được hợp nhất vào GameSubsystemSpatial (để đặt tất cả âm thanh, emmiter, render Components
trong cùng một hệ thống phân cấp và sử dụng các biến đổi tương đối cha mẹ).
con. Kiểm tra từng lần. Rất không hiệu quả.
con. Subsystems
biết về Components
.
- 2: Mỗi
Subsystem
tìm kiếmComponents
các loại cụ thể.
pro. Hiệu suất tốt hơn so với Approach 1
.
con. Subsystems
vẫn biết về Components
.
- 3:
Component
đăng ký chính nó trongGameSubsystem(s)
. Chúng ta biết tại thời gian biên dịch có một GameSubsystemRenderer, vì vậy hãy ComponentImageRender sẽ gọi một cái gì đó như GameSubsystemRenderer :: register (ComponentRenderBase *).
Observer mẫu.Component
đăng ký sự kiện "cập nhật" (được gửi bởiGameSubsystem(s)
).
pro. Hiệu suất.Không có séc không cần thiết như trong Approach 1
và Approach 2
.
con. Components
bị kết hợp kém với GameSubsystems
.
- 4: Mediator mẫu.
GameState
(có chứaGameSubsystems
) có thể triển khai registerComponent (Thành phần *).
pro. Components
và GameSubystems
không biết gì về nhau.
con. Trong C++ nó sẽ trông giống như chuyển đổi typeid xấu xí và chậm.
Câu hỏi: phương pháp nào là 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 nào về triển khai (theo hướng dữ liệu) của Approach 4
?
Cảm ơn bạn.
Tôi đồng ý với bạn rằng những lợi thế này rất có giá trị. Nhưng cái đầu tiên có một mặt khác: không có khả năng tái sử dụng 'Component' giữa các dự án (với các bộ khác nhau của' Hệ thống con').Việc phân phối các hệ thống con trong một dự án đơn lẻ cũng trở thành một vấn đề. Có thể có hàng trăm thành phần '', viết lại tất cả là một công việc tẻ nhạt. Tôi tin rằng lợi thế thứ hai có thể đạt được trong các cách tiếp cận khác, quá. –
Đồng ý với quan điểm của bạn. Tại một thời điểm tôi được giới thiệu với thiết kế CBGOS không nhiều như tôi muốn. Nhưng công việc tôi gặp phải trong việc giải quyết vấn đề này đã cho tôi những cân nhắc sau: * 1. * Thiết kế các giao diện hệ thống con theo cách trừu tượng nhất để tập hợp các hệ thống phụ sẽ thay đổi một chút giữa các dự án khác nhau. * 2. * Ưu tiên tương tác bằng tin nhắn giữa các thành phần trên tất cả và cắt bỏ các phụ thuộc giao diện trong đó có thể. – Keynslug
Nó có thể hoạt động. Tôi đã gặp mọi người tại các diễn đàn gamedev.net sử dụng cách tiếp cận này. –