Generowanie szkieletów paczek funkcji na podstawie diagramów stanów

W tym artykule zostanie opisane narzędzie do generowania funkcji na podstawie diagramów maszyn stanów.

Wstęp

Diagramy maszyn stanów świetnie się sprawdzają do modelowania systemów, które pod wpływem różnych zdarzeń zmieniają sposób swojego działania. Opanowanie diagramów maszyn stanów jest bardzo proste i nie wymaga dużej ilości czasu a z wykorzystaniem opisanego tutaj narzędzia może przynieść naprawdę satysfakcjonujące efekty. Przedstawiony tu generator ma na celu zwiększyć tempo tworzenia paczek funkcji oraz zapewnić ich niezawodność.

Zanim opiszę jak korzystać z generatora wyjaśnię krótko czym są diagramy maszyn stanów i jak za ich pomocą zamodelować jakiś system.

Najprostsze co mi przychodzi to diagram przedstawiający to, jak działają drzwi. Na razie nie ma z tego żadnego użytku ale na podstawie tego diagramu można łatwo zobaczyć jak to działa.

Zgodnie z tym co przedstawia rysunek drzwi mogą być otwarte, zamknięte lub zamknięte na klucz (to są 3 możliwe stany w jakich mogą być drzwi). Aby zmienić stan trzeba wykonać przejście (przedstawione na diagramie za pomocą strzałki). Przejścia są wywoływane za pomocą zdarzeń. Zdarzenia na diagramie są opisywane tekstem zamieszczonym obok strzałek. W bardziej skomplikowanych systemach to samo zdarzenie może mieć inny wpływ na działanie w zależności od stanu. Jedyne co zostało niewyjaśnione to ta czarna kropka ze strzałką wskazującą na stan „otwarte”. W ten sposób zaznacza się, który stan jest tym pierwszym (u nas „otwarte”).

Praktyczne przykłady

Skoro mamy już teorię za sobą, czas przejść do praktycznego przykładu. Powiedzmy że chcemy zrobić mapę, na której gracze będą mieli do wyboru dwa tryby gry – pvp i pve. Grę można rozpocząć tylko wtedy, gdy nie trwa żadna inna gra.

W trybie pvp gracze grają przeciwko sobie określoną liczbę rund, jeśli po zagraniu tej ustalonej liczby rund nikt nie wygra zostanie rozpoczęta dogrywka. Jeśli w końcu zostanie wyłoniony zwycięzca to zostanie wyświetlona jakaś informacja i gra się zakończy. Inną opcją zakończenia gry jest też opuszczenie gry przez wszystkich graczy.

W trybie pve gracze będą próbowali pokonać kolejne coraz trudniejsze fale przeciwników. Gra skończy się wyświetleniem podsumowania wyników, gdy wszyscy gracze zginą. Tak samo jak w wypadku trybu pvp, grę może zakończyć też opuszczenie przez wszystkich graczy serwera.

A oto wynik tego co udało mi się stworzyć na podstawie zamieszczonego wyżej opisu:

Na diagramie pojawiły się nowe elementy. Chodzi o te dwa duże stany, w środku których znajdują się mniejsze maszyny stanów. Te nowe elementy to stany złożone. Ich działanie jest bardzo proste – jeśli przejdziesz w taki stan to rozpoczniesz działanie znajdującej się w nim maszyny stanowej. Na przykładzie wyżej oznacza to tylko tyle, że jeśli będzie odbywać się gra w trybie pvp lub pve to dodatkowo będą się wykonywały funkcje odpowiadające za pracę znajdujących się w tych stanach mniejszych maszyn stanowych.

Jeśli wyjdzie się ze złożonego stanu i wróci się do niego ponownie to maszyna stanowa znajdująca się w jego wnętrzu może zachować się na dwa różne sposoby. Może zacząć pracę od nowa, jeśli stan początkowy oznaczymy czarną kropką, lub zacząć w takim stanie w jakim została przerwana jej praca, jeśli stan początkowy oznaczymy kółkiem z literą H w środku (stan historyczny). Zastosowanie stanu historycznego można zobaczyć niżej – jeśli gracz wyjdzie z gry na jakimś etapie to może się spodziewać, że jak wróci to będzie mógł kontynuować od momentu na którym skończył.

Jak korzystać z generatora?

Generator dołączony do tego artykułu konwertuje diagramy maszyn stanów zapisane w odpowiednim formacie (.xmi) na paczkę funkcji, w której zaimplementowana cała logika przechodzenia między stanami, oraz w której będą przygotowane specjalne puste funkcje (gotowe do zapełnienia komendami) wywoływane w następujących sytuacjach – wywołanie zdarzenia, wyjście ze stanu, przechodzenie między stanami, wejście do stanu oraz -wywoływane co tick- bycie w określonym stanie.

Aby wygenerować pliki w formacie .xmi, z których będzie korzystał potem generator należy najpierw skorzystać z jakiegoś zewnętrznego oprogramowania do modelowania diagramów UML. Format XMI to standard zapisu diagramów UML, więc wiele narzędzi do modelowania takich diagramów powinno mieć opcję eksportu do pliku XMI. Jednym z takich narzędzi jest darmowy program ArgoUML, który można pobrać – TUTAJ.

Super-szybka instrukcja korzystania z ArgoUML

Rysunek wyżej to screen-shot z programu ArgoUML.

Aby rozpocząć tworzenie diagramu maszyn stanów należy wcisnąć przycisk oznaczony na rysunku jako (1). Tworzenie modelu polega na przeciąganiu elementów zaznaczonych jako (2), (3) i (4) na pole edycji – elementy, do przeciągnięcia na pole edycji, które nie są zaznaczone na rysunku nie są obsługiwane przez generator, więc należy ich unikać. Aby do przejścia dodać wywołujące je zdarzenie należy kliknąć dwukrotnie na strzałkę symbolizującą to przejście i wypełnić pole tekstowe, które się pojawi. Aby wygenerować plik .xmi, należy skorzystać z opcji zaznaczonej na rysunku jako (5). Oprócz tego warto jest też zapisać projekt z diagramem bo odczytywanie projektów z pliku .xmi w ArgoUML jest dość niewygodne.

Objaśnienie działania generatora

Przed uruchomieniem generatora trzeba w nim najpierw wypełnić pięć pól formularza.

  1. Ścieżka do pliku .xmi wygenerowanego za pomocą ArgoUML (lub innego programu tego typu).
  2. Ścieżka, w której mają zostać wygenerowane pliki funkcji.
  3. Nazwa głównego folderu paczki funkcji (to co będzie w folderze functions).
  4. Ścieżka wewnątrz folderu z punktu 3.
  5. Nazwa wykorzystywana jako prefiks do generowania nazw scoreboardów, które utworzy program.

Po uzupełnieniu formularza należy wcisnąć wielki przycisk zatytułowany „Generate function files”.

Opis plików wygenerowanych przez program

Po wygenerowaniu funkcji, w głównym folderze (wygenerowanym na podstawie danych z punktów 2, 3 i 4)  pojawi się 5 plików – _do, _drop, _init, _restart i _stop oraz 4 foldery _states, states, _events oraz events.

W programie przyjęta jest zasada, że pliki z nazwami rozpoczynającymi się na „_” nie powinny być edytowane. Pliki te są odpowiedzialne za to, żeby wywoływać w odpowiednich miejscach funkcje odpowiadające stanom, przejściom i zdarzeniom.

  1. Funkcja _init powinna być wywołana jednorazowo aby stworzyć scoreboardy potrzebne do działania maszyny stanów.
  2. Przeciwieństwem funkcji _init jest funkcja _drop, która usuwa wszystkie scoreboardy
  3. Funkcja _restart powinna być wywołana za pomocą komendy execute na bycie, który będzie służył jako maszyna stanów. Funkcja ta ustawia początkowe wartości maszyny stanów i wystarczy ją wywołać jeden raz.
  4. Funkcja _stop usuwa wartości scoreboardów bytowi, na którym zostanie wywołana.
  5. Funkcja _do powinna być co tick wywoływana na bycie, który będzie służył jako maszyna stanowa.
  6. Do folderu _state w zasadzie nie ma potrzeby zaglądać (jest po to żeby działało, nic ciekawego).
  7. W folderze _events są funkcje zdarzeń, które będzie trzeba okazjonalnie wywoływać na bycie służącym jako maszyna stanowa w celu wywołania przejść. Zdarzenia nie będą wywoływać się same. Trzeba osobiście zaimplementować kiedy dane zdarzenie może wystąpić.
  8. W folderze events można umieszczać w funkcjach komendy, komendy które mają być wywołane w razie wystąpienia jakiegoś zdarzenia.
  9. W folderze states są puste funkcje reprezentujące stany oraz wychodzące z tych stanów przejścia. Nazwy przejść są konstruowane według wzoru @NAZWA_ZDARZENIA i reprezentują przejście występujące pod wpływem zdarzenia NAZWA_ZDARZENIA. W folderach reprezentujących stany mogą się pojawić 3 funkcje – do – wywoływane co tick jeśli dany stan jest aktywny, entry – wywoływane tylko przy okazji wchodzenia w dany stan oraz exit – wywoływane przy wychodzeniu ze stanu.

Dodatkowe WAŻNE uwagi

-Należy unikać nazywania stanów i zdarzeń nazwami zawierającymi polskie znaki, białe znaki lub nazwami zaczynającymi się od „_” lub od „@”.

-Tworząc model w ArgoUML należy nadać jakieś nazwy stanom początkowym (czarne kropki) oraz historycznym (kółka z literą H w środku). Mimo że te nazwy nie wyświetlą się na diagramie, generator i tak z nich skorzysta.

Linki:

-Pobierz generator: UML Statechart to MC Functions

-Dodatkowe materiały (przykłady):  dodatkowe materialy (w tym pliku znajduje się projekt z programu ArgoUML wykorzystany w drugim przykładzie w tym artykule wraz z plikiem .xmi oraz utworzonymi na jego podstawie przez generator funkcjami).

Patreon

Komentarze do “Generowanie szkieletów paczek funkcji na podstawie diagramów stanów” (1)

  1. Jasno i przejrzyście wytłumaczone. (Szkoda tylko że nie wiem prawie nic o komendach function).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *