Tôi còn khá mới mẻ trong việc phát triển trò chơi (nhưng không phải lập trình) và tôi đang cố gắng tìm ra cách tốt nhất để xử lý giao tiếp giữa các thế giới. Ý tôi là thế này:
Tôi đã đọc về các hệ thống thành phần thực thể (ECS) và cách mọi người đề xuất sử dụng các thế giới / không gian khác nhau ( http://gamedevelopment.tutsplus.com/tutorials/spaces-usiously-game-object-containers--gamedev-14091 ) cho một phần phụ của một trò chơi. Ví dụ, một HUD, kho đồ hoặc chiến đấu / chuyển động, mỗi cái có một thế giới / không gian riêng biệt (vì chúng có đồ họa khác nhau và logic cơ bản.
Tuy nhiên, tôi đã tự hỏi làm thế nào hàng tồn kho, hoặc HUD biết về sức khỏe của người chơi khi sức khỏe được xử lý bởi một không gian / thế giới khác, ví dụ như khi chiến đấu?
Điều này cũng áp dụng cho tiến trình trò chơi nói chung, ví dụ như hộp thoại với NPC (hộp thoại sẽ là một không gian riêng vì nó là màn hình bật lên) nhưng bạn sẽ chuyển các lựa chọn trong (hoặc trạng thái) của hộp thoại sang các không gian / thế giới khác như thế nào . Hoặc về cơ bản là bất kỳ loại sự kiện nào khác ảnh hưởng đến tiến trình trò chơi trong các không gian / thế giới khác nhau (sức khỏe, mana, nhiệm vụ, hộp thoại, chiến đấu, kiểm kê, hud, v.v.)
Làm thế nào một người sẽ xử lý loại thiết kế này? Nó có cần một đối tượng singleton (đang thực hiện) chứa tất cả các loại thông tin này không? Điều đó thật kỳ lạ bởi vì sau đó, components
cần phải truyền tải từng thay đổi cho đối tượng đơn lẻ này, cảm giác như thực hiện hai lần (đi ngược lại DRY chính của lập trình) ...
Tôi thua lỗ ở đây về mặt thiết kế, có con trỏ nào không?
---BIÊN TẬP---
Vì vậy, tôi đã đọc một vài bài viết khác được đề xuất bởi các bình luận và có một ý tưởng chung về các khả năng, tuy nhiên mỗi bài trong số chúng dường như có một nhược điểm lớn khiến chúng không đúng. Rất có khả năng tôi đang giám sát các chi tiết sẽ giải quyết những nhược điểm này vì vậy hãy thoải mái sửa chữa cho tôi. Tôi sẽ cố gắng đưa ra một cái nhìn tổng quan cũng như một số câu trả lời cho một số câu hỏi.
Tôi đang thấy ba tùy chọn chính để 'chia sẻ' dữ liệu giữa các không gian. Mặc dù hầu hết các bài viết là về chia sẻ dữ liệu giữa các hệ thống, tôi cảm thấy như có thể được áp dụng tương tự để chia sẻ dữ liệu giữa các hệ thống.
1. Truy vấn
Ví dụ : Nếu thế giới HUD cần biết sức khỏe hiện tại của người chơi, nó có thể truy vấn một thế giới khác và yêu cầu sức khỏe hiện tại.
Nhược điểm : Các thế giới cần biết về nhau, đây là một vấn đề phụ thuộc lớn và đi ngược lại với việc tách rời.
2: Nhắn tin trực tiếp (đồng bộ hóa và không đồng bộ)
Ví dụ : Nếu trong khi chiến đấu, sức khỏe của người chơi thay đổi, nó có thể gửi tin nhắn (đồng bộ hóa và không đồng bộ, bất cứ điều gì cần thiết) đến các thế giới khác cần biết về thay đổi này.
Nhược điểm : Vẫn là vấn đề tách rời: thế giới cần biết về nhau.
3: Nhắn tin gián tiếp (đồng bộ hóa và không đồng bộ) <- tùy chọn tốt nhất
Ví dụ : Nếu trong khi chiến đấu, sức khỏe của người chơi thay đổi, nó có thể gửi tin nhắn (đồng bộ hóa và không đồng bộ, bất cứ điều gì cần thiết) đến trung tâm thông báo chung. Các thế giới / hệ thống khác cần biết về thay đổi này được đăng ký vào kênh tin nhắn cụ thể và đọc các tin nhắn.
Ưu điểm : Hoàn toàn tách rời, dễ quản lý và có thể mở rộng.
Nhược điểm / không rõ ràng : Khi nào kênh tin nhắn biết rằng các tin nhắn cần phải bị xóa? Hoặc có thể hệ thống được đăng ký nhãn hiệu (chỉ dành cho chính nó) tin nhắn như đã đọc và chờ tin nhắn mới -> hộp thư trở nên rất lớn sau một thời gian. Làm thế nào để thế giới / hệ thống xử lý trật tự? Ví dụ: trong khung: nếu HUD đã bỏ phiếu thông báo sức khỏe và sau đó sức khỏe thay đổi, khung tiếp theo HUD sẽ được cập nhật. Đối với một số ứng dụng, điều này có thể không đúng cách.
Q: Một đối tượng trò chơi có thể tồn tại trong nhiều không gian
Tôi đang sử dụng khung công tác ECS của Artemis đi kèm với các không gian tích hợp (được gọi là thế giới). Mỗi thực thể (và với nó, dữ liệu ở dạng các thành phần) được tạo trên một thế giới và do đó không thể chia sẻ giữa các thế giới.