Stavový automat s použitím addEventListener, removeEventListener a dispatch Event
Před vytvořením stavového automatu si vždy vytvořte diagram popisující jednotlivé stavy a přechody, u každé části diagramu napiště název odpovídající budoucímu labelu v MovieClipu (např. výchozí stav = stav1, následující stav = stav2, přechodový stav = stav1_stav2
import flash.events.MouseEvent; // pokud pracujeme s vnořenými MovieClipy, je třeba je oslovit formatem: // nazevVrchnihoMovieclipu.NazevVnorenehoMovieclipu.Fuknce(parametr); // např. pro oslovení oslovení prvního semaforu (semafor1_mc), který se nachází uvnitř movieclipu krizovatka_mc, musíme napsat: // krizovatka_mc.semafor1_mc.play(); // pro oslovení oslovení druheho semaforu (semafor2_mc), bude zápis: // krizovatka_mc.semafor2_mc.play(); // nastavení semaforů na požadovanou barvu (semafory jsou tři instance stejného symbolu) krizovatka_mc.semafor1_mc.gotoAndStop("semafor_zelene"); krizovatka_mc.semafor2_mc.gotoAndStop("semafor_cervene"); krizovatka_mc.semafor3_mc.gotoAndStop("semafor_zelene"); //přidání posluchačů událostí (EventListener) - nad každým autem je neviditelné tlačítko "tlacZlute_mc", "tlacZelene_mc" a "tlacNakladak_mc" krizovatka_mc.tlacZlute_mc.addEventListener(MouseEvent.CLICK, zluty_jede1); krizovatka_mc.tlacZelene_mc.addEventListener(MouseEvent.CLICK, zeleny_jede1); krizovatka_mc.tlacNakladak_mc.addEventListener(MouseEvent.CLICK, nakladak_jede1); function zluty_jede1(e:MouseEvent) { krizovatka_mc.gotoAndPlay("stav1_stav2"); // v případě stavových automatů musíme posluchače událostí po jejich splnění opět odebrat, aby bylo možné // Movieclipu přidat posluchače jiné události, nebo posluchače spouštějícího jinou funkci krizovatka_mc.tlacZlute_mc.removeEventListener(MouseEvent.CLICK, zluty_jede1); krizovatka_mc.tlacZelene_mc.removeEventListener(MouseEvent.CLICK, zeleny_jede1); krizovatka_mc.tlacNakladak_mc.removeEventListener(MouseEvent.CLICK, nakladak_jede1); } //tento posluchač se přidá až po přehrání přechodové animace stav1_stav krizovatka_mc.addEventListener("KONEC_stav1_stav2", funkce_stav2); // funkce tentokrát nemá v závorkách (e:MouseEvent) - což by znamenalo, že reaguje na fuknce myši, ale (e:Event) // protože uvnitř Movieclipu generujeme novou událost zapsanou takto: dispatchEvent(new Event("KONEC_stav1_stav2")); function funkce_stav2(e:Event) { krizovatka_mc.tlacZelene_mc.addEventListener(MouseEvent.CLICK, zeleny_jede2); krizovatka_mc.tlacNakladak_mc.addEventListener(MouseEvent.CLICK, nakladak_jede2); } function zeleny_jede1(e:MouseEvent) { krizovatka_mc.gotoAndPlay("stav1_zelene"); krizovatka_mc.tlacZlute_mc.removeEventListener(MouseEvent.CLICK, zluty_jede1); krizovatka_mc.tlacZelene_mc.removeEventListener(MouseEvent.CLICK, zeleny_jede1); krizovatka_mc.tlacNakladak_mc.removeEventListener(MouseEvent.CLICK, nakladak_jede1); } function nakladak_jede1(e:MouseEvent) { krizovatka_mc.gotoAndPlay("stav1_nakladak"); krizovatka_mc.tlacZlute_mc.removeEventListener(MouseEvent.CLICK, zluty_jede1); krizovatka_mc.tlacZelene_mc.removeEventListener(MouseEvent.CLICK, zeleny_jede1); krizovatka_mc.tlacNakladak_mc.removeEventListener(MouseEvent.CLICK, nakladak_jede1); } function zeleny_jede2(e:MouseEvent) { krizovatka_mc.gotoAndPlay("stav2_stav3"); krizovatka_mc.tlacZelene_mc.removeEventListener(MouseEvent.CLICK, zeleny_jede2); krizovatka_mc.tlacNakladak_mc.removeEventListener(MouseEvent.CLICK, nakladak_jede2); } function nakladak_jede2(e:MouseEvent) { krizovatka_mc.gotoAndPlay("stav2_nakladak"); krizovatka_mc.tlacZelene_mc.removeEventListener(MouseEvent.CLICK, zeleny_jede2); krizovatka_mc.tlacNakladak_mc.removeEventListener(MouseEvent.CLICK, nakladak_jede2); } krizovatka_mc.addEventListener("KONEC_stav2_stav3", zmen_semafory); function zmen_semafory(e:Event) { krizovatka_mc.semafor1_mc.gotoAndStop("semafor_cervene"); krizovatka_mc.semafor2_mc.gotoAndStop("semafor_zelene"); krizovatka_mc.semafor3_mc.gotoAndStop("semafor_cervene"); krizovatka_mc.tlacNakladak_mc.addEventListener(MouseEvent.CLICK, nakladak_jede3); } function nakladak_jede3(e:MouseEvent) { krizovatka_mc.gotoAndPlay("stav3_stav4"); krizovatka_mc.tlacNakladak_mc.removeEventListener(MouseEvent.CLICK, nakladak_jede3); } //funkce nabidniZnovu umožňuje kliknout na možnosti "Hrát znovu? ano / ne") krizovatka_mc.addEventListener("KONEC_znovu", nabidniZnovu); function nabidniZnovu(e:Event) { krizovatka_mc.tlacAno_mc.addEventListener(MouseEvent.CLICK, zacniZnovu); krizovatka_mc.tlacNe_mc.addEventListener(MouseEvent.CLICK, ukonci); } function zacniZnovu(e:MouseEvent) { krizovatka_mc.tlacAno_mc.removeEventListener(MouseEvent.CLICK, zacniZnovu); krizovatka_mc.tlacNe_mc.removeEventListener(MouseEvent.CLICK, ukonci); krizovatka_mc.gotoAndStop("stav1"); // opět musíme nastavit stejné vlastnosti a metody Movieclipů jako na začátku - barvu semaforů a funkce tlačítek na autech, // bez toho by se křižovatka sice vrátila do stavu 1, ale nereagovala by na klikání krizovatka_mc.semafor1_mc.gotoAndStop("semafor_zelene"); krizovatka_mc.semafor2_mc.gotoAndStop("semafor_cervene"); krizovatka_mc.semafor3_mc.gotoAndStop("semafor_zelene"); krizovatka_mc.tlacZlute_mc.addEventListener(MouseEvent.CLICK, zluty_jede1); krizovatka_mc.tlacZelene_mc.addEventListener(MouseEvent.CLICK, zeleny_jede1); krizovatka_mc.tlacNakladak_mc.addEventListener(MouseEvent.CLICK, nakladak_jede1); } // závěr - obrazovka s nápisem "konec" function ukonci(e:MouseEvent) { krizovatka_mc.gotoAndStop("konec"); }