Ezt a bejegyzést már jó ideje megakartam már írni,de valahogy sosem vett rá a lélek.
Ebben a bejegyzésben bemutatom az állapotgépemet, amit csináltam még anno a játék motoromhoz, mert elég érdekesen csináltam meg, mivel Stream-et használtam hozzá. Előbb viszont tisztázok néhány fogalmat.


Állapotgép
Az állapotgép, ahogy a nevéből is kiderül egy olyan gép, aminek állapotai vannak. Ezek az állapotok között klasszikus értelemben van kezdő, aktuális és végállapot. Az állapotgép feladata, hogy események hatására egyik állapotból átmenjen egy másikba. A gép célja, hogy a kezdőállapotból eljusson a végállapotba.

Ez egy egyszerű kapcsolónak a diagramja.

Jól látszik az ábrából, hogy 2 állapot van, amikbe lehetünk. Kezdő állapot és végállapot nincs, de egy igazi rendszernél biztos a kikapcsolt állapot lenne a kezdő állapot. Események itt a kapcsoló használata, ami előidézi, hogy állapot váltás menjen végbe.

Aha, de mi köze van a játékfejlesztéshez?
Játékokat általánosságban elég jól elkülöníthető állapotokra lehet bontani. Gondoljunk csak arra, ahogy egy egyszerű webes játék felépül. Először fogad minket a töltési képernyő aztán következik a menü, ahol eldönthetjük merre tovább. Nem is beszélve, hogy maga a játékmenet is több szintből épülhet fel.

Ezek mind állapotnak tekinthetőek, ahol a kezdő állapot a betöltési képernyő, ahonnan végül tovább lehet jutni többi állapotba.


Stream
Aki már csinált valaha aszinkron programozást annak ismerős lehet a Stream fogalma. Stream magyarul folyamot jelent, viszont a mi esetünkben adatfolyamnak fordítanám le, mivel gyakorlatilag az a lényege, hogy adatot továbbítson folyamatosan. Mi pedig tudjuk fogni ezt az adatfolyamatot és megkapjuk belőle azokat az adatokat, amiket éppen továbbit.
Stream-eknek még van egy nagyon jó tulajdonsága, hogy bármikor meg lehet állítani és folytatni őket.
Nem is beszélve arról, hogy nagyon könnyű velük kommunikálni.

Na ennek meg mi köze van az állapotgéphez?
Valóságban nincs túl sok közük egymáshoz, viszont mégis érdemes vegyíteni őket , mert meglepően sokat tudó rendszert lehet csinálni vele minimális kód megírásával.

Mi esetünkben egy Stream egyelő lesz egy állapottal. Tehát van máris egy állapotunk, amivel tudunk kommunikálni és akkor indítjuk el vagy állítjuk meg amikor csak akarjuk.
A valóságban csak annyi dolgunk volt, hogy az állapot(State) osztállyal örököltettük a Stream osztályt és innentől kezdve csak ki kellet egészíteni, hogy tényleg úgy viselkedjen, mint egy állapot.


Állapotok kezelése
Eddig vannak az állapotaink, de ki tárolja el ezeket az állapotokat és vajon ki indítja el a kezdő állapotot vagy egyáltalán melyik a kezdő állapot?Nem is beszélve, hogy hogyan fogunk állapotokat váltani?

Kérdések megválaszolására kell csinálnunk egy állapot menedzsert, aminek egyetlen dolga, hogy ezeket a problémákat megoldja.

Tárolás mondja egy szimpla asszociatív tömb, amiben a kulcs neve az állapot neve és a kulcshoz tartozó érték pedig egy állapot.

Kezdő állapot definiálás és indítás elég könnyű, mivel csak meg kell adni, hogy melyik állapotot kezdje el hallgatni.(Ugyebár az állapot egy Stream)

Az állapot váltásnál tudnunk kell, hogy melyik állapot következik. Én ezt úgy oldottam meg hogy éppen aktuális állapot tárolja a következő állapot nevét. Név tudatában pedig tudjuk, hogy melyik állapotot hallgassuk meg következőként, viszont előtte még az aktuális állapotot kell megállítanunk.


Állapotok megvalósítása
Az állapotgép csak akkor működik, ha vannak olyan egyéni állapotok, amik öröklik azt az absztrakt állapot osztályt, amit csináltunk és megvalósítják annak az összes absztrakt metódusát.
Az én esetemben csak a create metódus megvalósítását várom el a programozótól.

Magyarázat
Az absztrakt metódus azt jelenti, hogy nincsen megvalósítása. 
Az absztrakt osztály pedig azt jelenti, hogy tartalmaz legalább 1 absztrakt metódust és az osztály nem példányosítható.


Összegezve
Megéri az állapotokat streamelni, mivel valamennyire egyszerű a megvalósítás és nagyon sok lehetőség rejlik benne. Én személy szerint a kommunikációs készségében látom a legnagyobb lehetőséget, amit jó magam még alig használtam ki.

Ha kódot is szeretnétek látni ajánlhatom a játék motorom Állapot és Állapot menedzser osztályát.