Miałem pytanie dotyczące architektury gry: Jaki jest najlepszy sposób na komunikowanie się różnych komponentów?
Naprawdę przepraszam, jeśli to pytanie zostało już zadane milion razy, ale nie mogę znaleźć niczego z dokładnie taką informacją, jakiej szukam.
Próbowałem zbudować grę od podstaw (C ++, jeśli ma to znaczenie) i obserwowałem inspirację dla niektórych gier typu open source (Super Maryo Chronicles, OpenTTD i inne). Zauważam, że wiele z tych projektów gier korzysta z globalnych instancji i / lub singletonów w każdym miejscu (np. Do renderowania kolejek, menedżerów encji, menedżerów wideo i tak dalej). Staram się unikać globalnych instancji i singletonów i buduję silnik, który jest tak luźno sprzężony, jak to możliwe, ale napotykam przeszkody, które wynikają z mojego braku doświadczenia w efektywnym projektowaniu. (Częścią motywacji tego projektu jest zajęcie się tym :))
Zbudowałem projekt, w którym mam jeden główny GameCore
obiekt, który ma elementy analogiczne do instancji globalnych, które widzę w innych projektach (tj. Ma menedżera wprowadzania danych, menedżera wideo, GameStage
obiekt, który kontroluje wszystkie jednostki i grę dla dowolnego aktualnie załadowanego etapu itp.). Problem polega na tym, że ponieważ wszystko jest scentralizowane w GameCore
obiekcie, nie mam łatwego sposobu, aby różne komponenty mogły się ze sobą komunikować.
Patrząc na Super Maryo Chronicles, na przykład, ilekroć element gry musi komunikować się z innym składnikiem (tj. Obiekt wroga chce się dodać do kolejki renderowania, która zostanie narysowana na etapie renderowania), po prostu rozmawia z instancja globalna.
Dla mnie muszę sprawić, aby moje obiekty gry przekazywały odpowiednie informacje z powrotem do GameCore
obiektu, aby GameCore
obiekt mógł przekazać te informacje do innego komponentu systemu, który ich potrzebuje (tj .: w powyższej sytuacji każdy obiekt wroga przekażą informacje o renderowaniu z powrotem do GameStage
obiektu, który zebrałby je wszystkie i przekazałby je z powrotem GameCore
, co z kolei przekazałoby je menedżerowi wideo do renderowania). Wydaje mi się, że to naprawdę okropny projekt i starałem się znaleźć rozwiązanie tego problemu. Moje przemyślenia na temat możliwych projektów:
- Instancje globalne (projekt Super Maryo Chronicles, OpenTTD itp.)
- Posiadanie
GameCore
obiektu działa jak pośrednik, przez który komunikują się wszystkie obiekty (obecny projekt opisany powyżej) - Podaj wskaźniki komponentów wszystkim pozostałym komponentom, z którymi będą musiały porozmawiać (tj. W powyższym przykładzie Maryo klasa wroga miałaby wskaźnik do obiektu wideo, z którym musi porozmawiać)
- Podziel grę na podsystemy - na przykład obiekty menedżera w
GameCore
obiekcie obsługujące komunikację między obiektami w ich podsystemie - (Inne opcje? ....)
Wyobrażam sobie, że opcja 4 powyżej jest najlepszym rozwiązaniem, ale mam problem z zaprojektowaniem jej ... być może dlatego, że myślałem o projektach, które widziałem, które wykorzystują globale. Wydaje mi się, że biorę ten sam problem, który istnieje w moim obecnym projekcie i powielam go w każdym podsystemie, tylko na mniejszą skalę. Na przykład GameStage
opisany powyżej obiekt jest w pewnym sensie próbą tego, ale GameCore
obiekt jest nadal zaangażowany w proces.
Czy ktoś może tutaj zaoferować jakieś porady dotyczące projektowania?
Dzięki!