Jako člověk, který se zabývá tvorbou prezentací a aplikací
ve Flashi již dlouhou dobu se často setkávám s poměrně zbytečně složitými strukturami
v podobných projektech. Tyto složité struktury je možné řešit mnoha způsoby,
od těch nejvíce jednoduchých, které nejsou téměř vůbec založeny na Action Scriptu,
až po ty, které jsou na těchto skriptech přímo postaveny. Právě tento fakt byl
podnětem pro napsání tohoto článku, ve kterém se budeme zabývat vhodným využitím
podmínek a proměnných při stavbě tradiční Flash prezentace.
Tyto podmínky, které jsou zmíněny výše, jsou ve Flashi reprezentovány ve tvarech
if, else if a else. Principem těchto zápisů je zjišťování splnění
určité události a následná reakce na ně.
Příklad, který zde budu popisovat se týká tvorby reálné prezentace, která obsahuje
relativně velké množství tlačítek, u nichž po stisku každého dojde k různorodé
akci, resp. nahrání různých externích dat. Vzhledem k tomu, že tlačítek je opravdu
relativně mnoho, bylo nutné navrhnout takový "systém", jehož správa
by byla poměrně jednoduchá a při tom nebylo nutné vytvářet mnoho rozličných
Movie Clipů, kde by každý z nich obsahoval několik animací, stavů apod.,
nebo dokonce vše vytvářet v hlavní scéně a odkazovat se pouze na čísla klíčových
snímků. Výsledkem celé práce byla tato struktura:
Každé tlačítko obsahovalo tento kód:
on (release) {
tellTarget (_root.main) {
gotoAndPlay (2);
promenna = "Co nabízíme";
}
}
Tento zápis udává, že po stisku tlačítka dojde k přesunu v Movie Clipu
"main" na druhý klíčový snímek, od kterého začne samotné přehrávání
(tento Movie Clip obsahuje všechny důležité akce) a dále se do proměnné
"promenna" zapíší data "Co nabízíme". Jak je již zmíněno
výše, tato akce bude přístupná na každém tlačítku s tím, že hodnota proměnné
se vždy bude měnit podle toho, o jaké tlačítko se jedná.
Dalším krokem je úprava Movie Clipu s Instance name "main".
Tento Movie clip může obsahovat nějaké animace, případně efekty, avšak
na prvním políčku musí mít akci stop, aby se nezačal okamžitě přehrávat
(čekáme až na přechod na druhý snímek a samotné spuštění). U tohoto reálného
příkladu byla v Movie Clipu obsažena menší animace, která trvala cca
10 klíčových snímků. Na 15. snímku byl vložen nejdůležitější kód, tedy ten,
který deklaroval provedení určitých akcí v závislosti na proměnných, které byly
definovány. Kód vypadá asi takto:
nadpismain = promenna;
if (promenna == "Profil") {
loadVariables ("hlavni/profil.txt", _root.main.containerMC.scr_all.txt_field);
tellTarget (_root.main.obr1) {
gotoAndStop (2);
}
} else if (promenna == "Co nabízíme") {
loadVariables ("ceske/conabizime.txt", _root.main.containerMC.scr_all.txt_field);
tellTarget (_root.main.obr2) {
gotoAndStop (2);
}
} else if (promenna == "Kontakt") {
loadVariables ("hlavni/kontakt.txt", _root.main.containerMC.scr_all.txt_field);
tellTarget (_root.main.obr2) {
gotoAndStop (2);
}
}
Samozřejmě, že samotný kód byl mnohem delší (cca 80 řádků), nicméně
podstata byla vždy stejná. Kód nejdříve definuje informace, které se mají zobrazit
v dynamickém textovém poli "nadpismain". Vidíte, že není přímo definováno
co se má zobrazovat, ale pouze odkaz na proměnnou "promenna". Tento
fakt opodstatňuje tvar proměnných jako "Co nabízíme" apod. Tím chci
říci, že často se jako hodnoty proměnných používají názvy jako "about",
"conab" apod., kdy tyto názvy jsou pouze pro naši potřebu. Avšak v
této situaci názvy proměnných zobrazujeme a proto je nutné, aby byly zapsány
v plném tvaru.
Dále následují samotné podmínky. Na základě zjištění stavu proměnné (if (promenna==".......")
se provede určitá akce - v tomto případě "natažení" externích textových
souborů do textového pole v Movie clipu "containerMC", resp.
"scr_all". Dále si můžete všimnout, že dochází k volání Movie clipu
s Instance name "obr1", "obr2" apod. V této ukázce
je to řešeno vnořenými Movie Clipy, nicméně je možné tu samou akci provádět
jako volání externích Movie clipů, případně přímo obrázků (Flash MX),
neboť právě ilustrační obrázky tyto Movie clipy obsahují.
Všechny tyto akce jsou vloženy na 15. snímku, nicméně Movie clip "main"
se přehrává dále a na 15. snímku se nezastaví. Zastaví se až na 20., kde je
vložena akce stop a kde existuje klíčový snímek obsahující Movie Clip
"ContainerMC", do kterého se samotná data nahrávají (resp. do dynamického
textového pole v něm obsaženém). Fakt, že data se natahují již na 15. snímku
a při tom jsou zobrazeny až na 20. umožňuje snížit dobu, kterou bude uživatel
vyčkávat než se data nahrají. V reálném příkladě se navíc ještě na 15. - 19.
snímku přehrává animace, která dynamické pole "zacloňuje" a data mají
čas se nahrávat částečně "dopředu". Na tomto klíčovém snímku jsou
rovněž přítomny všechny ostatní Movie clipy, které jsou využívány, tedy
ty, které obsahují obrázky, dodatečné formuláře apod. a jsou volány prostřednictvím
Tell target z hlavní části kódu. Všechny tyto Movie clipy obsahují
první políčko prázdné, čímž dojde k jejich "neviditelnosti" ve fázi,
kdy s nimi pracovat nechceme. Tímto mohou být přítomny všechny na jednom místě
a není třeba pro každý z nich vytvářet zvláštní vrstvu.
A aby toho všeho nebylo málo, tak je zajímavým řešením umístit tento kód jako
externí soubor. Samotná aplikace poté bude v klíčovém snímku volat externí *.as
soubor, který bude obsahovat veškeré skripty pro tento daný snímek a tím bude
možné snadno upravovat samotný běh prezentace, aniž by bylo nutné mít Macromedia
Flash vůbec nainstalován (zvláště v případě, kdy budeme "volat" externí
soubory, u nichž bude docházet k časté aktualizaci). Samotný kód pro volání
externích skriptů vypadá takto:
#include "scripty/promenne.as"
Tento jednoduchý zápis říká, že na daném klíčovém snímku se má
"volat" soubor promenne.as ze složky scripty. Jakmile budeme chtít
změnit např. odkaz na určitý externí textový soubor (bude mít nové jméno apod.)
tak je možné pouze upravit promenne.as a tím bude veškerá práce velmi
ulehčena.
Vzhledem k tomu, že celý tento článek je o podmínkách, tak by bylo vhodné rovněž
zmínit rozdíly mezi nimi. Jak je napsáno výše, tak pracujeme s podmínkami if,
else if a else, resp. s těmito "cykly". If je jasné
a, myslím, že není co dodávat. Rozdíl je mezi else if a else,
kdy první případ nám umožňuje (jak je uvedeno v ukázce kódu) definovat akci,
která se má vykonat na základě určeného stavu, tedy vykonat něco, v závislosti
na něčem. Na druhé straně je zde rovněž možnost else, kdy zde pouze
definujeme co se má stát ve všech ostatních případech. Ve vztahu k naší ukázce
je možné zapsat else na úplný závěr kódu, kdy můžeme například vypsat
chybové hlášení v tom případě, že ani jedna z podmínek nebude splněna a tím
informovat uživatele o aktuálním stavu, zatímco v opačném případě by se pouze
žádná akce nevykonala a uživatel by s tímto nebyl seznámen a byl by možná "zmaten".
A to je vlastně vše. Může se zdát, že jde o velmi jednoduchý příklad, který
ani není nutné uveřejňovat, nicméně opravdu často se můžete setkat s prezentacemi
(jejich zdrojovými kódy), které přímo vyzývají k definici akcí na základě proměnných,
avšak jsou vytvářeny pomocí tradičních GoToFrame akcí.
Sudacki Lukáš
|