Moje pytanie brzmi:
Jak przechowywać globalne dane kontekstowe, tj. informacje o danych na świecie, aktualny czas na świecie itp. w systemie elementów encji?
Myślę o pracy nad stworzeniem otwartej gry symulacyjnej Dwarf Fortress w C ++. Stworzyłem silnik gry w stylu komponentu bytu dla zabawy i obecnie próbuję dowiedzieć się, jak zamierzam działać we wszystkich wymaganych funkcjach. Oprócz standardowej rozgrywki (rendering, fizyka, dane komponentów specyficzne dla bytu, itp.) Chciałbym również mieć pewne globalne dane kontekstowe, do których miałyby dostęp wszystkie odpowiednie systemy (tj. Dane światowe, takie jak rok, w którym są obecnie , czy ma miejsce globalne ocieplenie, Wszelkie rzeczy, które byłyby istotne dla symulacji świata). Początkowo myślałem o stworzeniu komponentu „światowego”, ale wydaje się to bezcelowe i trudne, jeśli wiele różnych systemów potrzebuje dostępu do tych logicznie „globalnych” danych.
Czy sensowne byłoby posiadanie komponentu „światowego”, czy też powinienem przechowywać te dane w inny sposób?
Zastanawiałem się także nad tym, aby te dane były globalne, a tym samym umożliwiałyby dostęp do systemów, które chciałyby z nich korzystać; wydaje się, że jest to naruszenie zasad składowych bytu w ogóle i być może bałagan z innych powodów, ale pomyślałem, że to może naprawdę zadziałać.
Inną rzeczą, o której myślałem, byłoby osadzenie odpowiednich danych kontekstu światowego bezpośrednio w samych systemach. Na przykład, gdybym miał AgeSystem
„starzejące się” wszystkie byty, które mają getsWeakerAsTimePasses
składnik lub coś w tym stylu, to może ten system mógłby przechowywać odpowiednie dane dotyczące czasu dla świata bezpośrednio jako dane członka, których użyłby do obliczenia upływu czasu i ile starzeć się i osłabiać ludzi itp. Trzecia opcja była moją najmniej ulubioną, ale coś, co przyszło mi do głowy podczas burzy mózgów.
Czy ktoś może doradzić?
źródło
Odpowiedzi:
Każdy sposób, który działa, to sposób, który działa. Brzmi dziwnie, ale tak naprawdę twoja gra jest 1000 razy ważniejsza niż architektura. Wybierz dowolne podejście i wybierz łatwą w użyciu.
Te, które widziałem w rzeczywistych grach wysyłkowych (wykorzystujących projektowanie oparte na komponentach, a nie ECS; nigdy nie widziałem czystego ECS „na wolności”, chociaż wiele projektów komponentów ma do nich elementy podobne do ECS):
handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")
, tak, naprawdę)Wszystkie działają. Mam obsesję na punkcie niektórych podejść i oczywistego faworyta, ale wszystkie były używane do wysyłania gier AAA. Czasami wiele podejść w jednym projekcie (40-100 + zespołów inżynierów ma tendencję do tworzenia przypadkowego duplikatu kodu, niestety).
źródło