Đây là phần tiếp theo của câu hỏi này , tôi đã trả lời, nhưng bài này đã giải quyết một chủ đề cụ thể hơn nhiều.
Câu trả lời này đã giúp tôi hiểu Entity Systems thậm chí còn tốt hơn bài báo.
Tôi đã đọc bài viết (vâng,) về Hệ thống thực thể và nó đã cho tôi biết như sau:
Các thực thể chỉ là một id và một mảng các thành phần (các bài báo nói rằng lưu trữ các thực thể trong các thành phần không phải là một cách tốt để làm việc, nhưng không cung cấp một sự thay thế).
Các thành phần là những phần dữ liệu, cho biết những gì có thể được thực hiện với một thực thể nhất định.
Hệ thống là "phương thức", chúng thực hiện thao tác dữ liệu trên các thực thể.
Điều này có vẻ thực tế trong nhiều tình huống, nhưng phần về các thành phần chỉ là các lớp dữ liệu đang làm phiền tôi. Ví dụ, làm thế nào tôi có thể triển khai lớp Vector2D (Position) của mình trong Hệ thống thực thể?
Lớp Vector2D chứa dữ liệu: tọa độ x và y, nhưng nó cũng có các phương thức , điều này rất quan trọng đối với tính hữu dụng của nó và phân biệt lớp với chỉ một mảng hai phần tử. Ví dụ phương pháp là: add()
, rotate(point, r, angle)
, substract()
, normalize()
, và tất cả các tiêu chuẩn khác, phương pháp hữu ích, và hoàn toàn cần thiết mà các vị trí (trong đó có trường hợp của lớp Vector2D) nên có.
Nếu thành phần chỉ là một chủ sở hữu dữ liệu, nó sẽ không thể có các phương thức này!
Một giải pháp có thể bật lên là triển khai chúng bên trong các hệ thống, nhưng điều đó có vẻ rất phản trực giác. Những phương pháp này là những thứ mà tôi muốn thực hiện ngay bây giờ , để chúng được hoàn thiện và sẵn sàng để sử dụng. Tôi không muốn chờ đợi MovementSystem
để đọc một số thông điệp đắt tiền hướng dẫn nó thực hiện phép tính trên vị trí của một thực thể!
Và, bài báo nêu rất rõ rằng chỉ các hệ thống nên có bất kỳ chức năng nào , và lời giải thích duy nhất cho điều đó, mà tôi có thể tìm thấy, là "để tránh OOP". Trước hết, tôi không hiểu tại sao tôi không nên sử dụng các phương thức trong các thực thể và thành phần. Chi phí bộ nhớ thực tế là như nhau, và khi được kết hợp với các hệ thống, chúng sẽ rất dễ thực hiện và kết hợp theo những cách thú vị. Các hệ thống, chẳng hạn, chỉ có thể cung cấp logic cơ bản cho các thực thể / thành phần, vốn tự biết việc thực hiện. Nếu bạn hỏi tôi - về cơ bản là lấy những điều tốt đẹp từ cả ES và OOP, điều gì đó không thể được thực hiện theo tác giả của bài viết, nhưng đối với tôi có vẻ như là một thực hành tốt.
Nghĩ về nó theo cách này; có nhiều loại đối tượng có thể vẽ khác nhau trong một trò chơi. Hình ảnh cũ đơn giản, hình ảnh động ( update()
, getCurrentFrame()
v.v.), sự kết hợp của các loại nguyên thủy này và tất cả chúng chỉ có thể cung cấp một draw()
phương thức cho hệ thống kết xuất, mà sau đó không cần quan tâm đến cách thức sprite của một thực thể, chỉ về giao diện (vẽ) và vị trí. Và sau đó, tôi sẽ chỉ cần một hệ thống hoạt hình sẽ gọi các phương thức dành riêng cho hoạt hình không liên quan gì đến kết xuất.
Và chỉ một điều khác ... Có thực sự có một sự thay thế cho mảng khi lưu trữ các thành phần? Tôi thấy không có nơi nào khác cho các thành phần được lưu trữ ngoài các mảng bên trong một lớp Thực thể ...
Có thể, đây là một cách tiếp cận tốt hơn: lưu trữ các thành phần như các thuộc tính đơn giản của các thực thể. Ví dụ, một thành phần vị trí sẽ được dán vào entity.position
.
Cách duy nhất khác là có một loại bảng tra cứu kỳ lạ bên trong các hệ thống, tham chiếu các thực thể khác nhau. Nhưng điều đó dường như rất không hiệu quả và phức tạp hơn để phát triển hơn là chỉ đơn giản là lưu trữ các thành phần trong thực thể.