Flash.jpw

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

  • Úvod do ActionScriptu 3.0
  • Nové jazykové pomůcky
  • Metody a funkce
  • Třídy
  • Systém událostí
  • Display objekty a Display list
  • Regulární výrazy
  • XML a E4X
  • Zvuk
  • Internetová komunikace
  • Předchozí: Systém událostí
  • Následující: Regulární výrazy
  • Display objekty a Display list

    Display objekt je obecně objekt, jehož instance se po připojení do některého DisplayObjectContaineru v Display listu vizuálně zobrazí. Zatímco v AS2 bylo skriptování vizuálních objektů omezeno především na metody a tedy vnitřek MovieClipu, v AS3 jsou již vizuální objekty zcela nezávislé.

    Nezávislý Display list

    V AS2 byly všechny objekty (skriptové i zobrazovací) součástí jedné objektové hierarchie. AS3 zavedl nezávislý Display list (dalo by se řící Strom zobrazení). Instance skriptových objektů tedy již nejsou součásti stromu zobrazení a strom zobrazení zase není omezen skriptovou hierarchii. Skriptoví sourozenci tak mohou být zobrazeni jako rodič a dítě, a naopak.

    Nejvyšším členem Display listu je objekt Stage. Reprezentuje celou zobrazovací plochu přehrávače.

    Jeho prvním potomkem je instance třídy dokumentu (hlavní scéna animace) - typicky objekt MovieClip.

    DisplayObject a DisplayObjectContainer

    Každý objekt zobrazení je odvozen z třídy DisplayObject. Některé objekty jsou kromě toho také potomkem třídy DisplayObjectContainer, tedy kontejneru objektů zobrazení. Kontejner může kromě vlastního obsahu zobrazovat další objekty zobrazení nebo kontejnery.

    Typickým příkladem DisplayObjectContaineru je MovieClip. Příkladem DisplayObjectu, který není DisplayObjectContainerem, je třeba TextField. Zatímco MovieClip může obsahovat další objekty, TextField přirozeně nikoliv.

    Běžné kontejnery objektů zobrazení

    Ostatní běžné objekty zobrazení

    Nemohou již obsahovat vnořené objekty. Je doporučováno je v použitelných případech preferovat, protože přirozeně šetří paměť a výpočetní výkon prostředí.

    Objekty pro manipulaci s grafikou editoru

    Velkou výhodou AS3 je, že valná většina grafiky, kterou vytvoříte v prostředí editoru, je pro ActionScript také dostupná. Tyto objekty zmiňuji zvlášť, jelikož se vyznačují tím, že jejich instance lze často tvořit jen pomocí editoru, nikoliv skriptem.

    Typickým příkladem může být třeba StaticText pro manipulaci se statickým textem.

    var titulek:StaticText = new StaticText();

    ArgumentError: Error #2012: StaticText class cannot be instantiated.

    Připojení objektu do stromu zobrazení

    Velkou novinkou AS3 je možnost vytvářet a manipulovat s objekty zobrazení nezávisle na stromu zobrazení. Znamená to, že objekt může být vytvořen, jeho parametry nastaveny a teprve později přidán do stromu zobrazení.

    Aby byl objekt zobrazen, musí být vložen do některého kontejneru objektů zobrazení, který je již ve stromu umístěn. V prázdné animaci to může být třeba hlavní scéna.

    Pokud by byl následující skript umístěn do prvního snímku animace, vytvořil by na scéně textové pole:

    import flash.text.TextField;
     
    var textfield:TextField = new TextField();
    textfield.text = 'Lorem Ipsum';
    textfield.x = 50;
    textfield.y = 50;
     
    this.addChild(textfield);

    Objekt se vkládá do kontejneru metodou addChild. Teprve pak je zobrazen. Z výkonnostních důvodů je lepší nastavit maximum vlastností ještě před zobrazením.

    Odstranění objektu ze stromu

    Analogicky pak metodou removeChild respektive removeChildAt pro odebrání konkrétního objektu respektive objektu s určitým indexem.

    this.removeChild(textfield);

    Nezapomeňte, že objekt textfield stále existuje a může být opět vložen.

    Uvolnění objektu z paměti

    Objekty zobrazení, na rozdíl od textových dat, již představují významnou zátěž prostředí. Zejména u rastrové grafiky a videa se vyplatí dbát na uvolňování nepotřebných objektů z paměti - respektive, v případě Flashe, mu v tom nebránit.

    Využití paměti nelze ActionScriptem řídit přímo, stará se o něj proces Garbage collector (doslova popelář). Garbage collector odstraňuje objekty, které nemají žádné existující reference.

    textfield = null; // nyní může být textové pole uvolněno z paměti

    Průchod stromem zobrazení

    Častou operací ve stromu zobrazení je vyhledání a přístup k rodičovským nebo podřízeným Display objektům.

    Jak již bylo zmíněno, v AS3 je strom zobrazení nezávislý na abstraktní objektové hierarchii. Zobrazený objekt je tedy dosažitelný dvěma způsoby:

    1. Běžně jako vlastnost či proměnná, do které byla při vytvoření vložena instance objektu.
    2. Jako vnitřní nebo nadřazený objekt nějakého Display objektu ve stromu zobrazení.

    Ukazatele na nadřazené objekty

    Zatímco přístup k nadřazenému objektu v objektové hierarchii umožňuje příkaz super, ve stromu zobrazení, kde podřízený objekt vlastně není potomkem jeho nadřízeného, používáme vlastnosti parent, případně root či stage.

    parentNadřízený DisplayObjectContainer
    rootNejvyšší DisplayObjectContainer (instance třídy dokumentu)
    stageScéna, reprezentuje plochu přehrávače.
    this.parent.rotation = 45;		// natočí rodičovský objekt o 45°

    Ukazatele na podřízené objekty

    K podřízeným objektům kontejneru můžete přistoupit prostřednictvím jejich indexu nebo jména.

    this.getChildAt(3).visible = true;
    this.getChildByName('kolecko').y += 20;
    this.kolecko.x = 10;

    Jak vidíte, v prvním případě nastavujeme viditelnost čtvrtého podřízeného objektu. Ten mimochodem nemusí být pojmenovaný, pomocí indexu je dostupný každý objekt. U zbývajících dvou případů hledáme podřízený objekt podle jeho jména (tedy vlastnosti name), oba způsoby jsou ekvivalentní s drobnou obtíží, kterou si ukážeme dále.

    Přístup ke skriptově vytvořeným objektům

    Skriptově vložené objekty zobrazení mají oproti těm vytvořeným v editoru určité odlišnosti.

    Kontejner nemá automaticky přiřazeny vlastnosti pro potomky

    Připojení objektu do kontejneru a jeho pojmenování v něm nevytvoří vlastnost.

    var objekt:Shape = new Shape();
    objekt.name = 'kolecko';
    this.addChild(objekt);
     
    this.kolecko.x = 10;

    TypeError: Error #1010: A term is undefined and has no properties.

    Vidíte, že vlastnost kolecko kontejneru this neexistuje. Logicky - nikdo ji totiž nevytvořil.

    this.getChildByName('kolecko').x = 10;	// to je již v pořádku
     
    this.kolecko = objekt;
    this.kolecko.x = 10;	// tohle už teď také

    Kompiler předpokládá obecný typ DisplayObject

    Novinkou AS3 je kontrola runtime objektů. A protože kontrola probíhá před kompilací (tedy nikoliv v době runtime), dělá kompiler některé obecné předpoklady, protože se o pravém stavu věcí nemůže přesvědčit (v tu chvíli ještě neexistují).

    this.getChildByName('kolecko').x = 55;

    Tento zápis je například korektní. Návratovou hodnotou metody getChildByName je vždy DisplayObject a každý DisplayObject má vlastnost x.

    this.getChildByName('kolecko').graphics.clear();

    1119: Access of possibly undefined property graphics through a reference with static type flash.display:DisplayObject.

    Zde už přistupujeme k vlastnosti graphics, kterou obecný DisplayObject nezná. To, že náš objekt je typu Shape, kompiler neví. Všimněte si slova possibly v chybové hlášce.

    (this.getChildByName('kolecko') as Shape).graphics.clear();

    Zde už je vše v pořádku, výsledek metody getChildByName je přetypován na Shape a může tedy využít vlastnosti graphics.

    Vlastnost graphics pro skriptové kreslení

    Velká část objektů zobrazení (především Shape a Sprite) má vlastnost graphics. Tato vlastnost obsahuje instanci objektu flash.display.Graphics, jejíž metody pak umí uvnitř objektu kreslit základní geometrické obrazce.

    Názvy metod jsou celkem výmluvné. V podstatě jimi většinou ovládáte pomyslnou ruku se štětcem.

    var trojuhelnik:Shape = new Shape();
     
    trojuhelnik.graphics.lineStyle(3, 0x0000FF);
    trojuhelnik.graphics.beginFill(0xFF0000);
    trojuhelnik.graphics.moveTo(0, 0);
    trojuhelnik.graphics.lineTo(100, 0);
    trojuhelnik.graphics.lineTo(50, 50);
    trojuhelnik.graphics.lineTo(0, 0);
    trojuhelnik.graphics.endFill();
     
    this.addChild(trojuhelnik);

    Výsledkem by byl červený trojúhelník s modrým obrysem. Všimněte si, že styl obrysu, stejně jako výplň, je třeba definovat před samotným kreslením - něco jako když Flashi říkáte, jaký štětec má vzít do ruky.