Cho đến nay, các hệ thống thành phần thực thể mà tôi đã sử dụng đã hoạt động chủ yếu như các tác phẩm nghệ thuật của Java:
- Tất cả dữ liệu trong các thành phần
- Các hệ thống độc lập không trạng thái (ít nhất là ở mức độ mà chúng không yêu cầu đầu vào khi khởi tạo) lặp lại qua từng thực thể chỉ chứa các thành phần mà hệ thống cụ thể quan tâm
- Tất cả các hệ thống xử lý các thực thể của chúng một tích tắc, sau đó toàn bộ sự việc bắt đầu lại.
Bây giờ tôi đang cố gắng áp dụng điều này cho một trò chơi theo lượt lần đầu tiên, với vô số sự kiện và phản hồi phải xảy ra theo thứ tự được đặt tương ứng với nhau, trước khi trò chơi có thể tiếp tục. Một ví dụ:
Người chơi A nhận sát thương từ một thanh kiếm. Để đáp lại điều này, áo giáp của A đá vào và làm giảm thiệt hại. Tốc độ di chuyển của A cũng bị hạ thấp do hậu quả của việc yếu đi.
- Các thiệt hại gây ra là những gì đặt ra toàn bộ tương tác
- Giáp phải được tính toán và áp dụng cho sát thương nhận vào trước khi sát thương được áp dụng cho người chơi
- Giảm tốc độ di chuyển không thể được áp dụng cho một đơn vị cho đến khi thiệt hại thực sự được xử lý, vì nó phụ thuộc vào lượng sát thương cuối cùng.
Các sự kiện cũng có thể kích hoạt các sự kiện khác. Giảm sát thương kiếm bằng áo giáp có thể khiến thanh kiếm vỡ ra (điều này phải diễn ra trước khi hoàn thành việc giảm sát thương), điều này có thể gây ra các sự kiện bổ sung để đáp ứng với nó, về cơ bản là đánh giá đệ quy các sự kiện.
Nói chung, điều này dường như dẫn đến một vài vấn đề:
- Rất nhiều chu trình xử lý bị lãng phí: Hầu hết các hệ thống (tiết kiệm cho những thứ luôn chạy, như kết xuất) đơn giản là không có gì đáng để làm khi nó không "đến lượt" hoạt động và dành phần lớn thời gian chờ đợi trò chơi vào một trạng thái làm việc hợp lệ. Điều này tạo ra mọi hệ thống như vậy với các kiểm tra tiếp tục tăng kích thước, càng nhiều trạng thái được thêm vào trò chơi.
- Để tìm hiểu xem một hệ thống có thể xử lý các thực thể có trong trò chơi hay không, họ cần một số cách để theo dõi các trạng thái thực thể / hệ thống không liên quan khác (hệ thống chịu trách nhiệm xử lý thiệt hại cần biết liệu áo giáp có được áp dụng hay không). Điều này có thể làm rối loạn các hệ thống với nhiều trách nhiệm hoặc tạo ra nhu cầu cho các hệ thống bổ sung không có mục đích nào khác ngoài việc quét bộ sưu tập thực thể sau mỗi chu kỳ xử lý và liên lạc với một nhóm người nghe bằng cách nói với chúng khi nào đó có thể làm gì đó.
Hai điểm trên cho rằng các hệ thống hoạt động trên cùng một tập hợp các thực thể, kết thúc việc thay đổi trạng thái bằng cách sử dụng các cờ trong các thành phần của chúng.
Một cách khác để giải quyết nó là thêm / xóa các thành phần (hoặc tạo các thực thể hoàn toàn mới) do một hệ thống duy nhất hoạt động để tiến triển trạng thái trò chơi. Điều này có nghĩa là bất cứ khi nào một hệ thống thực sự có một thực thể phù hợp, nó sẽ biết rằng nó được phép xử lý nó.
Tuy nhiên, điều này làm cho các hệ thống chịu trách nhiệm kích hoạt các hệ thống tiếp theo, gây khó khăn cho lý do về hành vi của chương trình vì các lỗi sẽ không hiển thị do kết quả của một tương tác hệ thống. Việc thêm các hệ thống mới cũng trở nên khó khăn hơn vì chúng không thể được thực hiện mà không biết chính xác chúng ảnh hưởng đến các hệ thống khác như thế nào (và các hệ thống trước đó có thể phải được sửa đổi để kích hoạt các trạng thái mà hệ thống mới quan tâm), đánh bại mục đích có các hệ thống riêng biệt với một nhiệm vụ duy nhất.
Đây có phải là thứ tôi sẽ phải sống cùng không? Mỗi ví dụ ECS duy nhất tôi từng thấy là thời gian thực và thật dễ dàng để thấy cách vòng lặp một trò chơi này hoạt động trong các trường hợp như vậy. Và tôi vẫn cần nó để kết xuất, nó dường như thực sự không phù hợp với các hệ thống tạm dừng hầu hết các khía cạnh của chính nó mỗi khi có điều gì đó xảy ra.
Có một số mẫu thiết kế để di chuyển trạng thái trò chơi về phía trước phù hợp cho việc này hay tôi chỉ nên di chuyển tất cả logic ra khỏi vòng lặp và thay vào đó chỉ kích hoạt nó khi cần thiết?