Jednoduchý stavový automat

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");
}

Výstřižek


Posted

in

by

Tags: