Giao tiếp liên hệ trong một trò chơi ECS


8

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:

  1. 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).

  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?



Trong khi họ không cho tôi một câu trả lời trực tiếp, họ chắc chắn đã chỉ cho tôi một nơi nào đó đúng hướng. Cảm ơn bạn! Tôi đoán những gì tôi sẽ cố gắng làm bây giờ là triển khai một hệ thống chuyển tin nhắn giữa các hệ thống cho phép tôi truy vấn đồng bộ mọi thứ như tất cả các thực thể trong một ràng buộc cụ thể, v.v.
trmd

Câu trả lời:


3

Về cơ bản, các hệ thống của bạn không cần phải nói chuyện với nhau. Có thể có trường hợp các hệ thống ngầm tương tác, nhưng tương tác này không nên rõ ràng. Nếu bạn cần có các hệ thống tương tác với nhau, thì có lẽ bạn đã không xác định đúng hệ thống.

Trước khi tôi đi sâu vào một số ví dụ để minh họa điểm tôi muốn xác định loại hệ thống thành phần thực thể mà tôi đang nói đến. Bạn có các thực thể không làm gì và các thành phần xác định hành vi của chúng. Hành vi thực tế được thực hiện trong Hệ thống. bởi vì đó là điều hiệu quả để làm Các thực thể có các thuộc tính và sự kiện, có thể được đọc, viết hoặc kích hoạt bởi nhiều thành phần.


Hãy giả sử rằng bạn đang thực hiện một tên lửa. Hành vi cơ bản của tên lửa được điều khiển bởi thành phần dẫn đường (tập lệnh), chuyển động thực tế được điều khiển bởi thành phần vật lý cơ thể cứng nhắc, kích nổ được điều khiển bởi thành phần kích hoạt (tập lệnh), biểu diễn trực quan được thực hiện thông qua thành phần lưới thị giác và âm thanh được phát ra thông qua một thành phần âm thanh điểm. Thành phần hướng dẫn thiết lập thuộc tính vectơ lực và vật lý cơ thể cứng nhắc di chuyển thực thể và do đó cũng đặt vị trí và hướng (trong số những thứ khác). Thành phần kích hoạt lắng nghe sự kiện va chạm, vì vậy khi xảy ra va chạm với một thực thể khác, nó sẽ hành động và đảm bảo rằng tình trạng lộn xộn xảy ra.

Để thực hiện tên lửa, hệ thống đồ họa, âm thanh, vật lý và kịch bản có liên quan. Tương tác thực tế chỉ xảy ra mặc dù các thành phần của họ.


Giả sử bạn có một trò chơi thực tế bằng hình ảnh và hệ thống đồ họa là phương tiện chính để hiển thị cảnh. Bạn muốn một bản đồ như lớp phủ. Có hai cách để thực hiện điều này, hoặc bạn mở rộng hệ thống đồ họa để vẽ bản đồ (xấu) hoặc bạn thêm hệ thống bản đồ (tốt). Để truy cập thiết bị đồ họa thực tế, hệ thống bản đồ không gọi hệ thống đồ họa. Bạn trích xuất thiết bị đồ họa (trừu tượng phần cứng) từ hệ thống đồ họa và sau đó chuyển qua hệ thống bản đồ và hệ thống đồ họa cho thiết bị đồ họa và họ lần lượt sử dụng nó.


Cuối cùng tôi tìm thấy khái niệm rằng hệ thống đồ họa yêu cầu hệ thống ánh xạ cho một danh sách các mục có thể nhìn thấy lẻ. Hệ thống đồ họa nên duy trì một danh sách các mục có thể nhìn thấy, tốt nhất là được lưu trữ trong một số cấu trúc được tối ưu hóa đặc biệt như cây tứ giác. Bạn có thể thoát khỏi nó trong bối cảnh của một trò chơi 2D, nhưng khoảnh khắc bạn chuyển sang 3D bạn gặp rắc rối thực sự.


1
Một chút ghép nối giữa các hệ thống không phải là một điều xấu trong kinh nghiệm của tôi, và rõ ràng hơn là dựa vào các sự kiện hoặc tương tự để giao tiếp giữa các hệ thống. Tôi có xu hướng có một vài hệ thống được ghép nối ( các hệ thống được tham chiếu trên các cột ngoài cùng bên phải) - chúng thường hoạt động như các hệ thống "hỗ trợ", chẳng hạn như GridSystem.
rác rưởi

Cảm ơn đã phản hồi rioki! Vì vậy, về cơ bản, những gì bạn đang nói là trong tất cả các hệ thống mà tôi cần trích xuất các thực thể / thành phần từ các khu vực cụ thể, tôi nên lưu trữ các bản sao của các thực thể có liên quan (trong một phần tư)? Lý do của tôi để có sự kết hợp được đề cập giữa hai hệ thống (và cả hệ thống chuyển động và hệ thống bản đồ) là để tôi không phải có một góc phần tư cho mỗi hệ thống có liên quan, mà thay vào đó có một hệ thống nằm trong hệ thống bản đồ.
trmd

@trmd Bạn có nhiều lựa chọn. Bạn có thể có một cây tứ giác trong cảnh hoặc bạn có thể có một cây trên mỗi hệ thống. Vấn đề là mỗi hệ thống chỉ có các thực thể có liên quan trong cấu trúc của nó và có thể sử dụng các cấu trúc tổ chức khác nhau.
rioki

1
@junkdog Bạn phải luôn tiếp cận bất kỳ vấn đề nào với chủ nghĩa thực dụng. Lý tưởng nhất, khớp nối lỏng lẻo là tối ưu. Khi bạn có thể loại bỏ hoặc thay thế một hệ thống mà không thay đổi bất cứ điều gì khác, bạn đã làm đúng. Nhưng đôi khi việc giảm khớp nối làm tăng sự phức tạp của hệ thống một cách quyết liệt, sau đó bạn phải tìm điểm cân bằng trong đó mức tăng tính linh hoạt không bị mất bởi cơ sở mã tăng.
rioki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.