Xin lỗi nếu câu hỏi này đã được trả lời trước đó, nhưng sau khi không ngừng tìm kiếm, tôi không thể tìm thấy bất cứ điều gì.
Như nhiều người, gần đây tôi đã nhảy vào nhóm ECS và tôi hiện đang giết một thời gian bằng cách tạo ra một trò chơi ECS khiêm tốn. Trò chơi này là một trò chơi nền tảng 2D đơn giản. Nó được lập trình trong JS đơn giản.
Bố cục của trò chơi về cơ bản như sau:
Cốt lõi của trò chơi là Engine, Engine chạy vòng lặp trò chơi và giữ một EventManager, chịu trách nhiệm nâng cao các sự kiện và EntityManager, chịu trách nhiệm chứa tất cả các thành phần của tất cả các thực thể.
Tất cả logic được thực hiện bởi các hệ thống. Các hệ thống đăng ký các trình xử lý sự kiện (tức là các hàm thành viên) với EventHandler cho các EventTypes cụ thể, được gọi khi một sự kiện thuộc loại đó được đưa ra.
Ví dụ:
this.eventManager.registerHandler(EventType.EVENT_RENDER, this.render, null, this);
Gần đây tôi đã chuyển từ gọi tất cả các chức năng có liên quan của hệ thống một cách rõ ràng trong Công cụ sang mẫu này.
Nhưng qua vấn đề và câu hỏi của tôi.
Để kết xuất tôi có một RenderSystem. Hệ thống này chứa các tham chiếu đến một số loại thành phần có thể vẽ / hoạt hình mà nó, bạn đoán nó, biểu hiện.
Cho đến gần đây, hệ thống này cũng chứa một tham chiếu đến một hệ thống khác , MapSystem, chỉ mục không gian tất cả các thực thể. Lý do cho tham chiếu này là để có thể gọi một hàm dọc theo dòng
mapSystem.search(frame_bound);
cắt tỉa hiệu quả tất cả các thực thể không cần phải được kết xuất.
Vì vậy, tôi có một vài câu hỏi liên quan đến điều này:
Có phải thực tế rất xấu cho các hệ thống để giao tiếp trực tiếp? Một cái gì đó về nó chỉ không có mùi đúng với tôi.
Tôi thấy nó có thể làm phức tạp nghiêm trọng mã của bạn như thế nào nếu bạn nói 100 hệ thống và mỗi hệ thống giữ các tham chiếu đến nhiều hệ thống khác. Xin chào O (n ^ 2).
Nếu tôi không giữ các tài liệu tham khảo liên hệ thống, làm thế nào để tôi thực hiện giao tiếp như được mô tả ở trên?
Suy nghĩ ban đầu của tôi là tạo ra một thực thể có mục đích chính là giữ thông tin cần thiết (tức là tất cả các thực thể hiện trong khung). Sau đó, hãy để MapSystem ghi vào và RenderSystem đọc từ thực thể này.
Nhưng điều này dường như cũng khá ô uế đối với tôi. Đặc biệt là chức năng tìm kiếm MapSystems có thể hữu ích để gọi trong nhiều ngữ cảnh khác nhau. Tạo một thực thể cho mỗi cuộc gọi - bối cảnh thực sự có vẻ không phải là một cách hay để thực hiện.
TL; DR: Điều đó có tệ khi các hệ thống trong trò chơi ECS giao tiếp trực tiếp và giữ các tham chiếu với nhau không?