Tôi đang cập nhật câu trả lời của mình vì rất nhiều điều không rõ ràng trước các bình luận. Hãy trần với tôi trong khi tôi giải thích suy nghĩ của tôi.
Nói chung, hai khía cạnh quan trọng cần xem xét trong bất kỳ thiết kế nào là sự gắn kết và khớp nối . Chúng ta đều biết rằng chúng ta cần sự gắn kết cao và khớp nối thấp để có thể tạo ra một thiết kế có thể tái sử dụng và mở rộng hơn.
Vì vậy, nếu thế giới phải quản lý mọi thứ, điều đó có nghĩa là nó có độ gắn kết thấp và khớp nối chặt chẽ (bởi vì nó cần phải biết và làm mọi thứ). Tuy nhiên, đây cũng là trường hợp khi một thực thể trò chơi phải làm mọi thứ. Cập nhật vị trí của anh ấy, kết xuất kết cấu của anh ấy, v.v.
Điều bạn thực sự quan tâm là tạo ra các hệ thống tập trung vào một khía cạnh của thực thể. Ví dụ: một thực thể trò chơi có thể có Texture, nhưng Trình kết xuất sẽ chịu trách nhiệm hiển thị kết cấu đó trên màn hình. Trình kết xuất không quan tâm các thuộc tính khác mà thực thể có.
Nói xa hơn một chút, một thực thể trò chơi chỉ đơn giản là một túi tài sản. Các thuộc tính này được thao tác bởi các hệ thống tập trung vào các thuộc tính cụ thể. Và đây là nơi các Hệ thống thực thể dựa trên thành phần (CBES) xuất hiện, nơi các thuộc tính = thành phần.
Cụ thể, CBES với Hệ thống (hoặc Hệ thống con). Thiết kế này có xu hướng có một vài Hệ thống tập trung vào các thành phần cụ thể của một thực thể trong khi không quan tâm đến những thành phần khác mà thực thể đó có. Ngoài ra, các Hệ thống chỉ được kết hợp với thông tin họ cần để xử lý các thành phần này.
Hãy lấy ví dụ của bạn. Vì đầu vào của nơi để di chuyển thực thể dựa trên bộ điều khiển của trình phát, nên bạn có thể sẽ có PlayerControllSystem. Hệ thống này, sẽ kiểm soát, ngoài nhiều thứ khác, PositionComponent của thực thể. Trong trường hợp này, PlayerControllSystem sẽ cần biết về Cấp độ và PositionComponent. Nếu sau này bạn quyết định thêm phát hiện va chạm, bạn sẽ tạo một CollisionSystem sẽ sử dụng lại vị trí của các thực thể, nhưng lần này để tính các hộp giới hạn (hoặc bạn có thể có BoundingBoxComponent, cuộc gọi của bạn). Thực tế là, bạn có thể dễ dàng bật hoặc tắt hành vi (ngay cả khi đang di chuyển) bằng cách thêm / xóa các thành phần. Vì vậy, nhiều hành vi hơn có nghĩa là nhiều hệ thống đang thao túng các thành phần của một thực thể, nhưng tất cả chúng đều nằm trong một lớp được xác định rõ ràng với độ khớp thấp. Muốn viết kịch bản? Thêm một ScriptComponent. BAM! Bạn chỉ cần thêm khả năng kịch bản với 2 lớp. Vật lý? Âm thanh? Lại như vậy.
Vì vậy, lý do tôi ủng hộ CBES với SubSystems là nó hoàn toàn OO và một hệ thống có thể bảo trì / mở rộng dễ dàng. Thêm một hành vi vào một thực thể cũng đơn giản như quyết định dữ liệu nào hành vi đó cần và thực thể nào cần nó.
Để biết thêm thông tin về Hệ thống thực thể dựa trên thành phần với Hệ thống con, có một loạt bài đăng blog tuyệt vời của T = Machine tại Hệ thống thực thể là tương lai của sự phát triển MMOG . Tác giả thậm chí đã đi xa đến mức tạo ra một wiki để thu thập các triển khai khác nhau có tên Dự án Hệ thống Thực thể
Một bài đăng chung (và nổi tiếng) về Hệ thống thực thể dựa trên thành phần nói chung là Phát triển hệ thống phân cấp của bạn , người đã tạo ra hệ thống cho Tony Hawk Pro.
Cuối cùng, nếu bạn đang tìm kiếm một thư viện có mã ví dụ, đừng đi xa hơn thư viện Artemis . Artemis chủ yếu ở Java nhưng đây là một cổng trong C # (mà tôi hiện đang sử dụng trong dự án XNA của mình).
Actor
biết vềworld
tất cả?