Tôi đang viết một triển khai tiểu hành tinh cơ bản như một bài tập trong việc học cách suy nghĩ trong các thực thể và các thành phần, và hầu hết đều khá đơn giản. Nhưng có một điều tôi tiếp tục gặp phải là các tình huống trong đó một hệ thống nhất định cần một thực thể / thành phần nhất định và tôi biết chỉ có một trong số đó. Ví dụ:
MovementSystem
cần biết giới hạn củaWorld
thành phần để nó biết khi nào cần bọc sang phía bên kia của màn hìnhLevelSystem
cần biếtGameState
thành phần để nó biết có nên tạo ra các tiểu hành tinh mới khôngInputSystem
cần biết trạng thái củaKeyboard
thành phần
(Vân vân.)
ECS tôi đang sử dụng được cuộn bằng tay nhưng về mặt khái niệm tương tự như Hệ thống thực thể RDBMS Beta - Java của Adam Martin . Những gì tôi thấy mình làm liên tục cho các trường hợp như ở trên là yêu cầu các EntityManager
thành phần "tất cả" của loại đã cho và lấy "đầu tiên" (chỉ gọi là):
World world = entityManager.getAllComponentsOfType(World.class).iterator().next()
Điều này hoạt động nhưng có vẻ lộn xộn, và làm cho mã khó chịu không rõ ràng. Các lựa chọn thay thế mà tôi đã nghĩ đến:
- làm cho mỗi hệ thống lặp lại 'tất cả' các thành phần này, giống như bất kỳ loại thành phần nào khác
- thêm hỗ trợ rõ ràng cho các thành phần 'singleton' vào
EntityManager
- không sử dụng các thành phần cho những thứ này; tiêm chúng vào hệ thống theo một cách khác và sống với thực tế rằng điều này làm cho thiết kế kém tinh khiết hơn đáng kể
Có một giải pháp điển hình hoặc nổi tiếng cho vấn đề này?