Uživatelské nástroje

Nástroje pro tento web


vyuka:interakce_mezi_objekty

1. Interakce mezi objekty

Cílem této lekce je na příkladu křižovatky s autem a semaforem si osvojit základní způsoby interakce mezi objekty - t.j. jak jsou objekty schopny mezi sebou komunikovat, resp. zjistit, jaký je stav jiného objektu.

Prvním úkolem je sestavit semafor - movie klip se třemi světly, které se rozsvicí v pořadí červená - oranžová (červená + žlutá) - zelená - žlutá (a protože movie klipy hrají dokola, ze žluté přejde semafor automaticky zase na začátek - na červenou). Na každý „stav“ (barvu) semaforu vyhradíme např. 5 snímků, aby nám semafor neběhal příliš rychle. Nicméně ale nyní nechceme, aby semafor pořád hrál dokola, protože ho budeme ovládat tlačítkem, takže přidáme stop() na 1. snímek časové osy semaforu a snímek pro větší přehlednost pojmenujeme „cervena“ (položka label ve vlastnostech vybraného snímku). Stejně tak přidáme stop() na snímek, kde naskočí zelená barva (v mém příkladu snímek č. 11) a snímek pojmenujeme „zelena“. Na oranžovou ani žlutou stopky dávat nebudeme, protože chceme aby semafor těmito stavy prošel bez zastavení a nemusíme je tím pádem ani pojmenovávat:

Předpokládejme, že nyní máme na Ploše tween auta pohybujího se křižovatkou pojmenovaný „auto“, semafor pojmenovaný „semafor“ a tlačítko se jmenuje „btn“. Na stisk tlačítka chceme, aby se změnil stav semaforu (t.j. svítí-li červená, chceme aby přešla na zelenou a naopak, svítí-li zelená, chceme aby se změnila v červenou). Toho docílíme přidáním posluchače (resp. událostní procedury) tlačítku na událost CLICK - posluchač může volat nějakou funkci a nebo můžeme přidat nepojmenovanou funkci přímo do definice posluchače (což je výhodné zejména pro jedno- či několika málo- řádkové funkce). V rámci naší událostní procedury nám (zatím) stačí zavolat play() na semaforu - to způsobí, že se spustí přehrávání časové osy semaforu, které se zastaví na dalaší stopce (t.j. na červené nebo na zelené):

var semafor:MovieClip
var btn:SimpleButton

btn.addEventListener(MouseEvent.CLICK, function (e) {
	semafor.play();
})

Je ale potřeba zařídit, aby se pohyb auta řídil podle semaforu - pokud svítí červená, auto by mělo u semaforu zastavu a rozjet se zase na zelenou. Intuitivní způsob, jak tohoto dosáhnout, je vložit ActionScript na ten snímek časové osy tweenu pohybu auta, kdy je auto těsně před semaforem - v mém příkladu cca snímek 26. Kontrolu stavu semaforu provedeme pomocí vlastnosti movie klipu „semafor“ currentFrameLabel, která obsahuje jméno snímku, na kterém se semafor nachází (podobně bychom mohli použít vlastnost currentFrame, která obsahuje číslo snímku, ale použití jména snímku je elegantnější). Pokud na semafor voláme z časové osy tweenu auta, nesmíme zapomenout použít parent, protože semafor existuje na Ploše a nikoliv uvnitř tweenu auta (Plocha je „rodičem“ semaforu). Vlastní porovnání hodnoty currentFrameLabel a jména snímku „cervena“ (pokud se semafor nachází na snímku červená, budeme chtít zastavit tween auta) provedeme příkazem if pro vyhodnocování podmínek a je-li podmínka splněna, zastavíme tween příkazem stop():

if (parent.semafor.currentFrameLabel == "cervena") {
	stop();
}

Poslední, co zbývá udělat, je aby se auto opět rozjelo, pokud se na semaforu rozsvítí zelená. Pro tuto chvíli si to zjednodušíme a přidáme play() pro tween auta přímo do událostní procedury na stisk tlačítka - autíčko se tedy rozjede hned jak stiskneme tlačítko a nepočká, než skutečně naskočí zelená. Jak toto udělat lépe se dozvíme v přístí lekci. Událostní procedura tlačítka tedy bude nyní vypadat takto:

btn.addEventListener(MouseEvent.CLICK, function (e) {
	semafor.play();
	auto.play();
})
vyuka/interakce_mezi_objekty.txt · Poslední úprava: 2011/04/17 00:28 autor: kripi