Czytałem więc dużo o używaniu FSM do zarządzania stanem gry, takich jak FSM oraz o stosie lub zestawie stanów do zbudowania jednego. Przeszedłem przez to wszystko. Ale utknąłem przy pisaniu w tym celu rzeczywistej, dobrze zaprojektowanej implementacji FSM. W szczególności, w jaki sposób można jednoznacznie rozwiązać problem przejścia między stanami, (jak) powinien być w stanie korzystać z danych z innych stanów itd. Czy ktoś ma jakieś wskazówki dotyczące projektowania i pisania implementacji w C ++, a jeszcze lepiej, przykładów kodu?
16
Odpowiedzi:
Napisałem FSM na podstawie rozdziału „Rozwój gry wieloosobowej” pod redakcją Thora Alexandra. Wewnątrz znajduje się rozdział zatytułowany „Równoległe maszyny stanu dla wiarygodnych postaci”. Jest to napisane w Pythonie, ale pojęcia można łatwo przetłumaczyć na C ++. Bardzo polecam to sprawdzić, chociaż dotyczy to stanów postaci, a nie stanów gry.
To, co stworzyłem, jest tutaj: https://github.com/swganh/mmoserver/tree/master/src/ZoneServer/GameSystemManagers/State%20Manager zajrzyj do StateManager, aby uzyskać szczegółowe informacje na temat implementacji, ale zasadniczo masz różne „stany podstawowe”, które możesz posługiwać się. Następnie masz określone stany, do których przechodzisz jako postać, więc każdy stan jest klasą. Następnie sprawdzasz, czy można przejść z jednego stanu do drugiego, a następnie po „wejściu” dokonujesz zmiany, możesz również łatwo robić rzeczy takie jak wstawianie zdarzeń po przejściu do stanu. Do tej pory okazało się, że udało się to naprawdę dobrze w grze.
Zaimplementowałem to, co książka nazywa równoległą maszyną stanów, która jest niezbędna do współpracy wielu fsm, w tym przypadku możesz przejść do jednego stanu, który blokuje wszystkie inne stany (np. CreatureState_Dead). Nie będę szczegółowo omawiał szczegółów, ponieważ nie sądzę, żeby to naprawdę pomogło, ale jeśli chcesz, mogę to rozwinąć.
źródło
Programowanie AI gry według przykładu (http://www.ai-junkie.com/books/toc_pgaibe.html) ma przykładową implementację, która jest dość prosta i po prostu obsługuje podstawy. Przejścia są obsługiwane w pojedynczym wywołaniu metody (najpierw Enter (), a następnie Execute () przy każdej aktualizacji, Exit () przy przejściu)> Nie wiem, czego byś potrzebował. Zaimplementowałbym bardziej skomplikowane przejścia jako ich własne stany, które są po prostu zaprojektowane do wykonania raz i przejścia do następnego stanu w sekwencji.
Zrobię ci dźgnięcie i założę, że patrzysz na FSM dla AI, jeśli tak, to polecam rzucić okiem na drzewa zachowań. AIGameDev ma kilka świetnych artykułów na ten temat.
źródło
Jeśli magia szablonu C ++ i potencjalnie długi czas kompilacji nie stanowią dla Ciebie problemu, a masz już zainstalowany Boost do pracy z :
Zwiększenie ma teraz wydajną ( pod względem szybkości i wielkości ) bibliotekę meta-stanów-maszyny, która ma tę zaletę, że pozwala ci ustawić tabelę przejścia oddzielnie od struktur stanów : masz tabelę, która opisuje, kiedy przejść z którego stanu do innego stanu . Musisz tylko to przeczytać, aby zrozumieć, co się dzieje w maszynie stanu.
Inną zaletą jest to, że zostało przetestowane przez kilka przedsiębiorstw, nawet w oprogramowaniu wbudowanym z oprogramowaniem o wysokiej wydajności (szczegółowe informacje można znaleźć na liście mailingowej doładowania). Ponieważ implementacja już tam jest, może być dobrym wyborem, jeśli potrzebujesz ogólnej implementacji automatu stanów, która po prostu działa (tm).
Obsługuje również stany ortogonalne (stany równoległe) i inne przydatne funkcje oparte na języku UML.
Zapewnia także kilka sposobów wyrażenia tabeli przejścia, z których jedna jest eksperymentalna, ale interesująca pod względem ekspresyjności (choć ograniczona obecną wydajnością kompilatora - szkoda!)
źródło