Flash.jpw

  • Obecné
  • Adobe Flash
  • ActionScript 1 & 2.0
  • ActionScript 3.0
  • ActionScript 1 & 2.0

  • Úvod do ActionScriptu
  • Proměnné, pole a generický objekt
  • Podmínky a smyčky
  • Funkce
  • Úvod do objektů
  • Vlastní třídy
  • Objekty CORE
  • Objekty MOVIE
  • Výjimky
  • Asynchronní události
  • Předchozí: Úvod do ActionScriptu
  • Následující: Podmínky a smyčky
  • Proměnné, pole a generický objekt

    Proměnnou si lze představit jako krabici s názvem ve které je uložena informace. Hodnotu proměnné můžeme měnit a opakovaně používat.

    Ve Flashi se proměnná neuvozuje žádným symbolem (jako je třeba $ v PHP).

    Pokud napíšete nečíselný výraz bez uvozovek, je chápán jako proměnná. Název proměnné nesmí začínat číslem a nesmí obsahovat nepovolené znaky.

    Deklarace lokální a globální proměnné

    Lokální proměnná (variable)

    Existuje jen ve svém bloku kódu (mezi složenými závorkami) - například uvnitř funkce nebo snímku případně objektu. Lokální proměnná není přístupná z vnějšku - po vykonání procesů v místě její existence je uvolněna z paměti.

    var pozdrav = "ahoj";

    Globální proměnná - vlastnost (property) aktuálního objektu

    Funguje podobně jako lokální proměnná, ale jejím definováním vytvoříte vlastnost aktuálního objektu (v animačním prostředí Flashe je to nejčastěji MovieClip).

    Po vykonání procesů v místě definice zůstává vlastnost dostupná, a to i z vnějšku, dokud je dostupný i objekt, který ji obsahuje.

    this.pozdrav = "ahoj";
     
    // identifikátor "this" je možné vynechat.
    pozdrav = "ahoj";

    Všimněte si, že vlastnost se nedefinuje klíčovým slovem var.

    Nechápete? Tak to zatím nechte koni, ten má větší hlavu. Jinak vizte úvod do objektů.

    Obsah proměnné

    Obsah proměnné nebo vlastnosti může mít více forem - takzvaných datových typů.

    Jak se dozvíte později, datový typ reprezentuje typ objektu, který je v proměnné uložen.

    Základní (primitivní) datové typy

    StringTextový řetězec
    NumberČíslo
    BooleanLogická hodnota, true nebo false

    Primitivní typy se vyznačují tím, že jdou deklarovat primitivní syntaxí (tzv. literal) - to jest není nutné používat new DatovyTyp()

    Tato syntaxe se samozřejmě u jednotlivých typů liší, je důležité to nepoplést, protože nesprávný datový typ může vyústit v neočekávané výsledky.

    var text	= "Lorem Ipsum";	// text uzavíráme do uvozovek
    var cislice	= "007";		// i číslice mohou být chápány jako text
    var take_text	= 'Dolor sit amet';	// apostrofy jsou ekvivalentní uvozovkám
     
    var cislo	= 155;			// čísla jsou napsána přímo
    var podil	= -0.5;			// desetinný separátor je vždy tečka
    var exponent	= 155e6;		// exponenciální tvar, 155 milionů
    var hexa	= 0xff;			// 255 hexadecimálně
     
    var logicke	= false;		// bez uvozovek

    Proměnná s vymezeným datovým typem

    Od AS2.0 je možné, při deklaraci proměnné, určit povolený datový typ.

    var cislo:Number = 155;
     
    cislo = 'text';

    Compiler Error:

    Type mismatch in assignment statement: found String where Number is required.

    Vidíte, že pokud se do vymezené číselné proměnné pokusíme uložit text, kompiler ohlásí chybu.

    Je dobrým zvykem omezovat typy proměnných. Mírně to šetří výpočetní výkon prostředí a hlavně nervy při ladění - v případě, že se vám totiž dostane do proměnné typ, který tam nečekáte, kompiler vás hned upozorní, že strkáte kostičku do kulatého otvoru.

    Nelze omezovat datové typy globálních proměnných (vlastností objektů) za běhu programu (run-time).

    Použití proměnných

    Proměnné a vlastnosti je možno použít prakticky kdekoliv místo samotné hodnoty.

    var snimek = 38;
     
    GotoAndPlay(snimek); // animace přejde na snímek 38

    Všimněte si prosím, že klíčové slovo var, případně datový typ proměnné, slouží jen k deklaraci, dál už se neuvádí.

    Adresování vlastností

    Pokud přistupujeme ke globálním proměnným (vlastnostem) z vnějšku, je nutné specifikovat jejich umístění.

    trace(hlavniRamecek.TlacitkoOdeslat.popisek);  // Odeslat

    Zde vidíte, že je hledána vlastnost popisek (pravděpodobně) MovieClipu TlacitkoOdeslat, který je uvnitř MC hlavniRamecek.

    Zde se vám také můžou hodit univerzální identifikátory _parent pro rodičovský objekt a _root pro hlavní scénu. Například:

    trace(_parent._parent._parent.pruhlednost);

    Priorita

    Jak vidíte, tak přestože se proměnné a vlastnosti deklarují jinak, používají se stejně.

    Existuje pořadí, kterém jazyk hledá uvedený výraz:

    1. Argumenty funkce
    2. Názvy tříd
    3. Lokální proměnné
    4. Globální vlastnosti
    var neco:String = 'a';
    this.neco = 'b';
     
    trace(neco);		// a
    trace(this.neco);	// b

    Předávání hodnot a předávání referencí

    Pokud předáváme základní datové typy proměnné (tedy String, Number nebo Boolean), je předána jen hodnota. Mezi originálem a kopií tak nezůstává žádná vazba:

    var jmeno = 'Alois Jirásek';
     
    var kopie = jmeno;
    trace(kopie);	// Alois Jirásek
     
    kopie = 'Lorem Ipsum';
    trace(kopie);	// Lorem Ipsum
    trace(jmeno);	// Alois Jirásek

    Všechny ostatní datové typy (například MovieClip) se předávají jako reference. Předáním obsahu se nevytvoří nová instance objektu, ale předá se jen odkaz (ukazatel) na tu existující.

    var pole = new Array('a', 'b', 'c');
     
    var kopie = pole;
    trace(kopie);   // a, b, c
     
    kopie[0] = 'x';
    trace(kopie);   // x, b, c
    trace(pole);    // x, b, c

    Není možné určit které typy mají být předány referencí a které hodnotou.

    Operátor (de)reference v ActionScriptu neexistuje. Pokud chcete předat základní typ jako referenci, musíte jej vložit například do generického objektu nebo pole. A také opačně - duplikovat objekty musíte metodami na to určenými.

    Odstranění proměnné nebo vlastnosti

    Je dobrým zvykem uvolňovat nepotřebnou paměť. Především pokud máte v proměnné nebo vlastnosti uložený velký obsah.

    K tomu slouží příkaz delete.

    delete pole;

    Datové pole (Array)

    Array (pole, matice, chcete-li) je datový objekt sdružující množinu různých prvků. Podrobněji Úvod do objektů nebo Objekty CORE.

    Deklarace pole

    Přestože bych pole už asi neřadil mezi primitivní datové typy, má ještě také primitivní definiční syntaxi.

    var pole:Array = ["a", "b", "c", 15, "ahoj"];
    Samozřejmě jej lze vytvořit také jako instanci kteréhokoliv jiného objektu. Tedy pomocí klíčového slova new a konstruktoru Array.

    var pole:Array = new Array("a", "b", "c", 15, "ahoj");

    Zde jsme (v obou případech) vytvořili proměnnou pole, které obsahuje objekt Array s pěti položkami - konkrétně čtyřmi řetězci (String) a jedním číslem (Number).

    Přístup k jednotlivým položkám pole

    Položky v poli jsou očíslovány, první položka má klíč roven nule.

    gotoAndPlay(pole[3]); // Animace by takto přešla na snímek 15

    Hodnoty položek v poli jdou samozřejmě i upravovat:

    pole[4] = "čau";

    Délka pole je dynamická, můžeme tedy psát:

    pole[25] = "nazdar";

    Zde jsme přeskočili klíče 5 až 24, ty jsou automaticky vytvořeny jako prázdné.

    Na tohle pozor při zjišťování délky pole, prázdné klíče jsou započítány taky, délka tohoto pole je nyní 26.

    Pole může obsahovat položky s libovolnými datovými typy, klidně i další pole - tak se dají vytvořit vícerozměrná pole (matice).

    var matice:Array = [[1,2],[3,4]];
    trace(matice[0][1]);    // 2

    Délka pole

    Aktuální délka pole je uložena ve vlastnosti length.

    trace(pole.length);    // 26

    Délka jde i upravit, pole se pak automaticky prodlouží respektive zkrátí.

    Asociativní pole (s textovými klíči)

    Klíče pole nemusejí být jen číselné, je možné použít i text.

    pole['jmeno'] = 'Pavel';

    Takové použití pole ale není doporučováno, většina metod pro práci s poli s textovými klíči nepočítá. Také vlastnost length nebude vracet správný počet položek.

    Protože pole je samozřejmě také potomkem generického objektu (Object), lze jeho instancím definovat vlastnosti stejně jako generickému objektu. To je právě případ asociativních klíčů - stojí vlastně mimo normální prvky, je to takový hack, se kterým metody pole už nepočítají.
    U předchozího příkladu by šla použít i objektová syntaxe: pole.jmeno = 'Pavel'.

    Generický objekt (Object)

    Také univerzální datový objekt, rodič většiny ostatních odvozených objektů. Nejčastěji se používá jako asociativní datová struktura.

    Jako objekt může obsahovat kromě vlastností (proměnných) i metody (funkce). Je tak možné vytvořit jednoúčelový skriptový objekt. Jak se vytvářejí vlastní objekty a prototypy je popsáno v úvodu do objektů.

    var objekt:Object = {jmeno:'Pavel', icq:123456789};

    Všimněte si zápisu inicializace hodnot, od pole se mírně liší.

    Stejně jako u pole, i objekt lze inicializovat klasicky konstruktorem.

    var objekt:Object = new Object({jmeno:'Pavel', icq:123456789});
     
    trace(objekt.jmeno);    // Pavel

    Alternativní přístup k potomkům

    K potomkům objektu přistupujeme operátorem tečka. Stejně tak ale můžeme použít hranaté závorky:

    trace(objekt['jmeno']);    // Pavel

    Je to ideální v případě, že je třeba jméno potomka sestavit dynamicky bez použití funkce eval. V AS3 už je to jediná možnost, protože zde už eval neexistuje.

    Vlastní metody generického objektu

    Jak jsem zmínil, obsahem objektu nemusí být jen vlastnosti, je možné připojit i metody (funkce objektu).

    objekt.pozdrav = function(){
    	trace('Ahoj! Tvoje jméno je '+this.jmeno+'.');
    }
     
    objekt.pozdrav();	// Ahoj! Tvoje jméno je Pavel.

    Podrobněji v kapitole funkce.