Tôi đã có một câu hỏi về kiến trúc trò chơi: cách tốt nhất để các thành phần khác nhau giao tiếp với nhau là gì?
Tôi thực sự xin lỗi nếu câu hỏi này đã được hỏi hàng triệu lần, nhưng tôi không thể tìm thấy bất cứ điều gì với chính xác loại thông tin mà tôi đang tìm kiếm.
Tôi đã cố gắng xây dựng một trò chơi từ đầu (C ++ nếu có vấn đề) và đã quan sát một số phần mềm trò chơi nguồn mở để lấy cảm hứng (Super Maryo Chronicles, OpenTTD và các phần mềm khác). Tôi nhận thấy rằng rất nhiều thiết kế trò chơi này sử dụng các phiên bản toàn cầu và / hoặc singletons ở khắp mọi nơi (đối với những thứ như kết xuất hàng đợi, quản lý thực thể, quản lý video, v.v.). Tôi đang cố gắng tránh các trường hợp và singletons toàn cầu và xây dựng một công cụ kết hợp lỏng lẻo nhất có thể, nhưng tôi gặp phải một số trở ngại do thiếu kinh nghiệm trong thiết kế hiệu quả. (Một phần động lực cho dự án này là để giải quyết vấn đề này :))
Tôi đã xây dựng một thiết kế trong đó tôi có một GameCore
đối tượng chính có các thành viên tương tự như các trường hợp toàn cầu mà tôi thấy trong các dự án khác (nghĩa là nó có trình quản lý đầu vào, trình quản lý video, GameStage
đối tượng điều khiển tất cả các thực thể và trò chơi cho bất kỳ giai đoạn nào hiện đang được tải, vv). Vấn đề là vì mọi thứ đều tập trung trong GameCore
đối tượng, tôi không có cách dễ dàng để các thành phần khác nhau giao tiếp với nhau.
Ví dụ, nhìn vào Super Maryo Chronicles, bất cứ khi nào một thành phần của trò chơi cần liên lạc với một thành phần khác (nghĩa là, một đối tượng kẻ thù muốn tự thêm vào hàng đợi kết xuất sẽ được vẽ trong giai đoạn kết xuất), nó chỉ nói chuyện với cá thể toàn cầu.
Đối với tôi, tôi phải yêu cầu các đối tượng trò chơi của mình chuyển thông tin liên quan trở lại GameCore
đối tượng để GameCore
đối tượng có thể truyền thông tin đó cho (các) thành phần khác của hệ thống cần nó (ví dụ: đối với tình huống trên, mỗi đối tượng kẻ thù sẽ chuyển thông tin kết xuất của họ trở lại GameStage
đối tượng, sẽ thu thập tất cả và chuyển lại cho thông tin GameCore
đó, lần lượt chuyển thông tin đó đến trình quản lý video để kết xuất). Cảm giác này giống như một thiết kế thực sự khủng khiếp, và tôi đã cố gắng nghĩ đến một giải pháp cho vấn đề này. Suy nghĩ của tôi về các thiết kế có thể:
- Các phiên bản toàn cầu (thiết kế Biên niên sử Super Maryo, OpenTTD, v.v.)
- Có
GameCore
đối tượng hoạt động như một người trung gian thông qua đó tất cả các đối tượng giao tiếp (thiết kế hiện tại được mô tả ở trên) - Đưa các con trỏ thành phần cho tất cả các thành phần khác mà chúng sẽ cần nói chuyện (ví dụ, trong ví dụ Maryo ở trên, lớp kẻ thù sẽ có một con trỏ tới đối tượng video mà nó cần nói chuyện)
- Chia trò chơi thành các hệ thống con - Ví dụ: có các đối tượng quản lý trong
GameCore
đối tượng xử lý giao tiếp giữa các đối tượng trong hệ thống con của chúng - (Sự lựa chọn khác? ....)
Tôi tưởng tượng tùy chọn 4 ở trên là giải pháp tốt nhất, nhưng tôi gặp một số khó khăn khi thiết kế nó ... có lẽ bởi vì tôi đã suy nghĩ về các thiết kế mà tôi đã thấy rằng sử dụng toàn cầu. Cảm giác như tôi đang gặp vấn đề tương tự tồn tại trong thiết kế hiện tại của tôi và sao chép nó trong mỗi hệ thống con, chỉ ở quy mô nhỏ hơn. Ví dụ, GameStage
đối tượng được mô tả ở trên là một phần của nỗ lực này, nhưng GameCore
đối tượng vẫn tham gia vào quá trình.
Bất cứ ai có thể cung cấp bất kỳ lời khuyên thiết kế ở đây?
Cảm ơn!