Pracowałem na tym samym silniku co koderanger. Mam inny punkt widzenia. :)
Po pierwsze, nie mieliśmy stosu FSM - mieliśmy stos stanów. Stos stanów tworzy pojedynczy FSM. Nie wiem, jak wyglądałby stos FSM. Prawdopodobnie zbyt skomplikowane, aby zrobić cokolwiek praktycznego.
Moim największym problemem z naszą Globalną Maszyną Stanową było to, że był to stos stanów, a nie zbiór stanów. Oznacza to np. ... / MainMenu / Ładowanie było inne niż ... / Ładowanie / Menu główne, w zależności od tego, czy menu główne pojawiło się przed czy po ekranie ładowania (gra jest asynchroniczna, a ładowanie odbywa się głównie na serwerze ).
Jako dwa przykłady rzeczy uczyniło to brzydkim:
- Doprowadziło to np. Do stanu LoadingGameplay, więc miałeś Base / Loading oraz Base / Gameplay / LoadingGameplay do ładowania w stanie Gameplay, który musiał powtarzać dużą część kodu w normalnym stanie ładowania (ale nie wszystkie i dodać trochę więcej ).
- Mieliśmy kilka funkcji, takich jak „jeśli w kreatorze postaci przejdź do gry; jeśli w grze przejdź do wyboru postaci; jeśli w postaci wybierz powrót do logowania”, ponieważ chcieliśmy pokazywać te same okna interfejsu w różnych stanach, ale wprowadzać Wstecz / Dalej przyciski nadal działają.
Mimo nazwy nie był zbyt „globalny”. Większość wewnętrznych systemów gier nie używała go do śledzenia swoich stanów wewnętrznych, ponieważ nie chciały, aby ich stany rżały się z innymi systemami. Inni, np. System interfejsu użytkownika, mogą go używać, ale tylko do kopiowania stanu do własnych lokalnych systemów stanu. (Chciałbym szczególnie ostrzec system przed stanami interfejsu użytkownika. Stan interfejsu użytkownika nie jest stosem, to naprawdę DAG, a próba wymuszenia na nim jakiejkolwiek innej struktury spowoduje, że korzystanie z interfejsów będzie frustrujące.)
To, co było dobre, to izolowanie zadań związanych z integracją kodu od programistów infrastruktury, którzy nie wiedzieli, jak właściwie przebieg gry jest zorganizowany, abyś mógł powiedzieć facetowi piszącemu „wstaw swój kod w Client_Patch_Update”, a facetowi piszącemu grafikę ładowanie „umieść kod w Client_MapTransfer_OnEnter”, a my możemy bez problemu zamienić niektóre przepływy logiczne.
W przypadku pobocznego projektu miałem więcej szczęścia z zestawem stanów niż ze stosem , nie boję się tworzyć wielu maszyn dla niepowiązanych systemów i nie pozwalam sobie wpaść w pułapkę posiadania „stanu globalnego”, który jest naprawdę to po prostu skomplikowany sposób synchronizacji za pomocą zmiennych globalnych - Jasne, skończysz na tym, że zbliża się termin, ale nie projektuj tego z myślą o swoim celu . Zasadniczo stan w grze nie jest stosem, a wszystkie stany w grze nie są ze sobą powiązane.
GSM, podobnie jak wskaźniki funkcji i zachowanie nielokalne, utrudniało debugowanie, chociaż debugowanie tego rodzaju dużych przejść między stanami nie było zbyt zabawne, zanim je mieliśmy. Zestawy stanów zamiast stosów stanów tak naprawdę nie pomagają, ale powinieneś o tym wiedzieć. Funkcje wirtualne zamiast wskaźników funkcji mogą to nieco złagodzić.