Cílové cesty:

Instance symbolu

Pokud vytvoříte nějaký symbol, automaticky se uloží do knihovny symbolů a pokud ho nevymažete, zůstane zde navždy. Jestliže chcete symbol dostat kdekoliv na scénu, přetáhnete symbol z knihovny tam, kde ho potřebujete a tím vytvoříte instanci symbolu.

Instancí jednoho symbolu můžete vytvořit nekonečně mnoho a přitom je každá instance jedinečná. Každé instanci můžete nezávisle na sobě měnit velikost, průhlednost, umístění na časové ose nebo třeba x-ové a y-ové souřadnice. Pokud nějakou vlastnost nezměníte, zůstane původní (tj. identická s vlastností symbolu v knihovně, když jste ho vytvářeli). Jediné co nesmíte měnit je samotný vzhled - jako je tvar či barva. Tyto vlastnosti zůstávají vždy stejné jako u původního symbolu.

Pokud máte vytvořeno deset instancí nějakého movie clipu a chcete všem změnit nějakou vlastnost (jakoukoliv), prostě si editujte v knihovně váš movie clip a předělejte si objekt dle vaší vůle. Ke každé instanci může být také připojen jiný skript. Ale aby bylo možné s instancemi komunikovat, musíte je také nějak pojmenovat. V knihovně symbolů mají sice své jméno, ale to program Flash nezná. Navíc pokud byste měli na scéně více jak jednu instanci téhož symbolu, bylo by nemožné je od sebe odlišit.

Dalo by se to přirovnat třeba ke zvířatům. V zoologické zahradě mají tři slony. Aby je od sebe ošetřovatelé odlišili, jmenují se slon Pepa, slon Franta a slonice Naděžda. A když na ně ošetřovatelé volají, křičí Fráááántóóóó! Póóóójď séééééém!!! Nekřičí slóóóónééé! Stejně to funguje ve Flashi. Pokud voláte nějaký movie clip, voláte jej jménem instance symbolu, nikoliv jménem samotného symbolu. Název instance zadáváte v panelu properties.

Adresování

Představte si, že máte nějakého kamaráda Václava, který bydlí v Plzni a chcete mu poslat dopis. Určitě obálku nenadepíšete Václav, Plzeň. Pokud byste to tak udělali, Václav pravděpodobně dopis nikdy nedostane.

A úplně stejně se chová Flash. Jako je naše republika rozdělena na kraje, města aulice, je Flash rozdělen na hlavní časovou osu _root a na dílčí movie clipy. Pokud z hlavní časové osy odkazujute na nějaký movie clip, který je na hlavní scéně, stačí použít název instance.

Problém ale vzniká, pokud v tomto movie clipu je ještě nějaký jiný movie clip. Tento druhý movie clip totiž sám o sobě není na hlavní scéně. Je v movie clipu a přesně to také musíme sdělit programu. V dopise byste asi oddělili jednotlivé položky odsazením na další řádek, ve Flashi používáte tečku. Takže například pro absolutní adresu movie clip na hlavní scéně byste použili tento skript:

_root.auto

Tímto byste programu řekli, že myslíte instanci nějakého symbolu, kterou jste pojmenovali "auto". Příkaz _root určuje hlavní časovou osu. Pak už stačí přidat nějakou funkci, třeba:

_root.auto.gotoAndStop(2);

Instance my_movieclip se tak přesune na druhý snímek a zastaví se. Pozor! Přesune se časová osa movie clipu, nikoliv hlavní časová osa. Ta zůstane nezměněna. Pokud potom máte movie clip v movie clipu (nebo button v movie clipu, to je jedno), vypadala by absolutní cesta takto:

_root.auto.pneu.gotoAndStop(2);

Nyní by se instance movie clipu "pneu" v instanci movie clipu "auto" přesunula na druhý snímek a zastavila by se. Absolutní cesta je neměnná a je a úplně jedno odkud na cílenou instanci ukazujeme. Výše uvedený skript by se správně provedl kdyby byl zapsán na hlavní časovou osu, i kdyby byl vložen do nějaké jiné instance nějakého symbolu. Problém by to dělalo, pokud by cesta byla zapsána relativně. Pokud byste na hlavní časovou osu přidali skript:

bomba.gotoAndPlay(3);

Instance bomba by se přesunula na třetí snímek a pokračovala v přehrávání jen pokud by bylo umístěna na hlavní scéně. Pokud by instance bomba byla skryta v nějakém jiném movie clipu (např. ve výše jmenované instanci "auto"), Flash by hledaný objekt nenašel. Pokud totiž cesta nezačíná _root, Flash začíná s hledáním na úrovni, kde je skript zapsán.

Pokud se zahrabáváte s cestami stále níž a níž, musíte používat přesnou cestu, ale pokud ukazujete z nižšího movie clipu na vyšší, můžete použít příkaz _parent, který určuje nadřazený symbol. Pokud potřebujete, aby byl skript namířen na symbol, na kterém je skript umístěn, použijte příkaz this. Přehledně to všechno ukazuje následující tabulka:

nástin psaní cílových cest ve Flashi
Místo příkazu _root se dá také použít příkaz _level0, ale není to zcela běžný způsob, používá se jen zřídka.
Pokud někde deklarujete proměnnou, platí pro ni stejná pravidla adresování jako u symbolů. To znamená, že pokud máte proměnnou na hlavní časové ose a chcete ji použít někde jinde, musíte před volání proměnné dát příkaz _root, aby program věděl, kde má proměnnou hledat. Jestliže pak chcete mít proměnnou dostupnou lehce všude, zadeklarujte ji jako _global.promenna. Proměnnou pak voláte promenna=25;.

Příklad

Vytvořte si dva movie clipy. První pojmenujte "planeta" a dovnitř movie clipu nakreslete planetu. Vycentrujte. Druhý movie clip pojmenujte "mesic" a nakreslete zde měsíc (pokud možno ať je menší než planeta) a pomocí »guide line ho zanimujte tak, ať běhá po kružnici pořád dokola. Poté vložte movie clip "mesic" do movie clipu "planeta" tak, ať měsíc obíhá planetu (instanci měsíce pojmenujte "mesic").

Movie clip "planeta" nyní vložte do hlavní scény (instanci planety zde pojmenujte "planeta") a opět přidejte guide line a zanimujte celý movie clip "planeta" tak, ať běhá po elipse. Spusťte animaci a vidíte, že měsíc se pohybuje kolem planety a celý movie clip se ještě pohybuje po elipse.

Nyní přijde na řadu skriptování. Vytvořte čtyři tlačítka - dvě stopkovací a dvě spouštěcí. Nyní jednomu tlačítku přidejte tento skript:

on (release) {
  _root.stop();
}

Spusťte animaci a stiskněte tlačítko. Planeta se zastavila, ale měsíc stále obíhá. Je to způsobeno tím, že jste zastavili veškeré animace prováděné na hlavní časové ose a pohyb měsíce je zanimován v samostatném movie clipu, nikoliv na hlavní časové ose, proto stále obíhá.

K druhému tlačítku přidejte stejný skript, jen místo stop(); dejte play();. Po stisknutí tohoto tlačítka se planeta opět rozpohybuje.

K jinému tlačítku pak připojte tento skript:

on (release) {
  _root.planeta.mesic.stop();
}

Pokud jste pojmenovali správně instance jednotlivých klipů, měl by se po stisknutí tlačítka zastavit pohyb měsíce kolem planety, ale zároveň by se měl stále pohybovat s planetou (jakoby kolem slunce). Měsíc se zastavil, protože jste stopli časovou osu měsíce, ale s hlavní časovou osou jste nic neprovedli. Ke čtvrtému tlačítku opět přidejte stejný skript, jen zaměňte stop(); za play(); a prohlédněte si celou animaci.

stáhnout zdroják
Pokud byste měli hodně stejných a dlouhých adres, přidejte radši příkaz with:
with (_root.oves.seno){
a=15;
b=12;
c=123456789;
}
Identický zápis by pak byl:
_root.oves.seno.a=15;
_root.oves.seno.b=12;
_root.oves.seno.c=123456789;

Dynamické určování cesty

Stejně jako můžete sčítat číslo s číslem nebo proměnnou s proměnnou, může být i cílová cesta zadána proměnnou. Pokud tedy máte zadeklarovanou nějakou proměnnou:

cesta="seno";

A na hlavní scéně máte instanci s názvem "seno", můžete použít použít následující syntaxi:

_root[cesta].gotoAndStop(2);

Pokud je v cílové cestě nějaká proměnná v hranaté závorce, program bude brát v úvahu při určování adresy hodnotu proměnné. Před hranatýma závorkama se nedělá tečka.

Můžete také klidně použít více takto určených instancí v závorkách:

cesta1="pole";
cesta2="koule";
_root[cesta1][cesta2].gotoAndStop(5);

Ke stejnému účelu se dá použít příkaz eval:

koza3="dangerous";
x=3;
y=eval("koza" + x);

Výsledná hodnota proměnné "y" bude "dangerous".

Pořadí příkazů

Je velmi důležité uvědomit si, v jakém pořadí se napsané příkazy provedou. Kupříkladu u této sady je to velmi jasné:

cena1=120;
cena2=50;
celkem=cena1+cena2;

Nejprve přiřadíte proměnným cena1 a cena2 hodnoty 120 a 50 a poté je jednoduše sečtete. Je jasné, že kdybyste přehodili první dva řádky, že by se nic nestalo:

cena2=50;
cena1=120;
celkem=cena1+cena2;

Program se bude chovat naprosto stejně. Ovšem pokud byste přehodili poslední dva řádky, byl by to problém:

cena1=120;
celkem=cena1+cena2;
cena2=50;

Tady už by se program nechoval stejně, protože sčítáte dvě proměnné a přitom jednu z nich ještě nemáte deklarovanou. Jelikož Flash na druhém řádku ještě proměnnou cena2 nezná, nebude ji brát v úvahu (respektive počítá, jako kdyby měla hodnotu 0) a proměnné celkem přiřadí 120.

Dalším problém nastává, když máte nějaký skript na snímku a zároveň na movie clipu v daném snímku. Co se provede dřív? Nejprve se provede sada příkazů na časové ose a až poté na symbolu. Můžete se o tom sami přesvědčit.

Vytvořte si na hlavní scéně jednoduchou animaci o dvaceti snímcích. Na desátý snímek vložte nový klíčový snímek a do panelu actions vepište:

stop();

Animace se zastaví na desátém snímku. Nyní konvertuje vámi nakreslený objekt na movie clip a v desátém snímku přiřaďte tomuto movie clipu tento skript:

onClipEvent(load){
  _root.play();
}

Jak vidíte, animace se nezastavila. Respektive animace se na desátém snímku nejdříve zastavila - to když program narazil na příkaz stop(); na hlavní časové ose a zase se (ještě v tom samém snímku) rozjela - to když program narazil na příkaz _root.play(); na movie clipu.

Když příkazy stop(); a play(); na movie clipu a časové ose prohodíte, animace se zastaví, protože nejdříve se vykoná příkaz play(); na časové ose a až poté stop(); na movie clipu.

Rozdíl mezi tlačítkem a movie clipem

V určování relativních cest je mezi movie clipem a tlačítkem jeden docela zrádný rozdíl. Pokud totiž nezadáte absolutní cestu (tj. cesta k symbolu nezačíná _root), každý ze symbolů začne hledat cílený objekt na jiné úrovni.

Movie clip totiž automaticky hledá cílený objekt vevnitř sama sebe, kdežto tlačítko hledá tentýž objekt na stejné úrovni, na jakém tlačítko zrovna danou chvíli je.

Můžete se o tom sami přesvědčit. Na hlavní scénu vložte nějaký button. Poté vytvořte první movie clip, ve kterém vytvořte nějakou jednoduchou animaci. Vraťte se zpět na hlavní scény a z knihovny symbolů zde vložte instanci tohoto movie clipu. Pojmenujte ho "clip".

Nyní vyberte button a přiřaďte k němu tento skript:

on (release) {
  clip.stop();
}

Celou animaci si nyní prohlédněte. Pokud kliknete na button, animace se zastaví.

Nyní ale vytvořte druhý movie clip, který ale bude sloužit jako tlačítko. Jednoduše v editaci nového movie clipu nakreslete obdélník, vycentrujte, vraťte se na hlavní scénu a vložte zde instanci tohoto movie clipu. A připojte k němu úplně stejný skript, jako v případě buttonu.

Logika říká, že když skript funguje na tlačítku, tak by měl stejný skript fungovat i na movie clipu. Chyba. Nebude to fungovat.

Když kliknete na movie clip, animace se nezastaví. Proč? Protože movie clip hledá symbol "clip" v sobě, nikoliv na stejné úrovni, na které se nachází.

Vymažte z hlavní scény instanci "clip". Editujte druhý movie clip (tedy ten, který sloužil jako provizorní tlačítko) a do tohoto movie clipu opět vložte instanci "clip". Nezapomeňte ji znovu pojmenovat.

Spusťte animaci. Když nyní kliknete na button, nic se nestane, ale když kliknete na movie clip, animace se zastaví.

další téma - Vlastnosti symbolu

hlavní stránka # o tento web se stará Lukáš Havrlant # lukas.havrlant@gmail.com