Úvod do ActionScriptu 3.0
Pokud jste četli předchozí sekci, což doporučuji, zjistíte, že velkou část principů AS3 zavedla v mírnější podobě už verze 2.0 v roce 2003.
Jestliže ovšem programátoři AS2 nebyli příliš nuceni používat nové jazykové struktury, nyní už nuceni jsou, AS3 totiž, kromě rozšíření jazykových pravidel, odstranilo ty staré z dob AS1.
Klíčové novinky AS3
Budu se jim věnovat v dalších kapitolách, teď jen pro rychlou orientaci
Výrazná změna objektového API
Třídy jsou nyní přeuspořádány do nových balíčků a i funkčně jsou jejich vlastnosti striktněji vymezeny a unifikovány.
Lapidárně řečeno, voda na čaj už se neohřívá v troubě, dá se použít konvice.
Zavedení hlavní třídy dokumentu
Hlavní scéna už nyní nemusí být jen instance objektu
MovieClip, lze použít vlastní třídu pro manipulaci s hlavní scénou.Pokročilejší konstrukce tříd
Zejména upřesnění a rozšíření pravidel viditelnosti, rozšířitelnosti a jmenných prostorů.
Širší základna primitivních objektů
Kromě obvyklého
Numbersi můžeme dopřát už iintauint. Nově také objektXMLzískal prostou syntaxi a je možné jej tak deklarovat stejně pohodlně jako třeba řetězec.Model E4X pro přístup k elementům XML
K prvkům a atributům XML lze nyní přistupovat pohodlně přímo pomocí sady XML operátorů.
Objekt
RegExppro regulární výrazyPodobně jako XML, také s prostou deklarující syntaxí.
Nový Event-framework
Zcela přepracován, sjednocen a zpřehledněn. Zavádí DOM event-flow.
Nový model pro práci s grafickými (display) objekty
A také nové typy display objektů.
Sjednocení konverze objektových typů a kontrola i za běhu programu
Kromě kontroly typů při kompilaci, kterou zavedl AS2, nyní Flash Player kontroluje i runtime typy.
Třída dokumentu
Možná si vzpomenete, že v AS2 a 1 byl dokument (tedy hlavní scéna, _root) vždy instance objektu MovieClip. Mohli jste pak psát například this.gotoAndPlay(10).
V AS3 je nyní možné stanovit třídu, jejíž instance bude kmenovým objektem celého dokumentu.
Je celkem logické, že pokud chci v animaci něco zobrazovat, měla by třída dokumentu rozšiřovat nějaký DisplayObjectContainer - například právě MovieClip nebo novější Sprite (podrobněji v kapitole o Display objektech).
package cz.jpw.flash { import flash.display.MovieClip; public class main extends MovieClip { public function main(){ this.stop(); // zastaví animaci } } }
Použitím třídy dokumentu odpadá dřívější obligátní baterie inicializačních příkazů v prvním snímku animace.
Všimněte si, že objektový kontext třídy dokumentu je logicky shodný s kmenovým objektem animace. Můžeme tedy animaci zastavit příkazem this.stop().
Základní typy objektů
Spíše rekapitulace a vyjasnění některých souvislostí.
Připomeňme, že ActionScript je striktně objektový jazyk. Jakýkoliv myslitelný datový obsah představuje vždy instanci objektu.
var promenna:TypObjektu = new TypObjektu();
Zde vidíte deklaraci proměnné promenna s vymezeným datovým typem TypObjektu, které je definována pomocí operátoru new instance objektu TypObjektu.
Prostá definiční syntaxe (literal)
Instance některých (těch nejpoužívanějších, náhodou) objektů mohou být také vytvořeny prostou syntaxí.
var retezec:String = "Lorem Ipsum"; // funguje i s apostrofy var bool:Boolean = true; // přijatelná je i hodnota 1 a 0 var cislo:Number = -128.16; // desetinný separátor je tečka var celeCislo:int = -128; var celeKladne:uint = 128; /* Přípustný formát zápisu čísel je také exponenciální 5e3 (pět tisíc) a hexadecimální 0xff (255) */ var pole:Array = [12,-8.5,"abc"]; var objekt:Object = {prvni:28, druhy:"abc"}; var regular:RegExp = /(.+)/gi; var xml:XML = <root><item><![CDATA[Lorem Ipsum]]></item></root>
Vidíte, že z verze AS2 nám některé objekty a literály přibyly. Kromě obvyklých typů integer a unsigned integer tu máme jako novinku regulární výraz se stejným literálem, který znáte z JavaScriptu.
Velmi vítanou novinkou je literál pro XML.
Všimněte si, že u prosté syntaxe objektů RegExp a XML se nepoužívají uvozovky - ty jsou vyhrazeny jen pro řetezce.
Typové omezení proměnné
Jak již bylo zmíněno v sekci AS2, objektový typ proměnné může být při deklaraci omezen.
var cislo:int = -155; cislo = 'text';
Implicit coercion of a value of type String to an unrelated type int.
Pro puntičkáře pak budiž bonbónkem novinka v AS3 wildcard:
var cokoliv:* = new Cokoliv();
Je to trochu alibismus. Význam je stejný, jako neuvést nic. V tomto případě ale už Eclipse nekňourá.
Konverze objektových typů
Občas je třeba provést konverzi z jednoho objektového typu na druhý. Obecně platí, že lze konvertovat obecné objekty na více konkrétní. Proto se operaci někdy říká downcast, pokles.
Jsou dva postupy. V prvním se snažíme narvat hrocha do šuplíku, ve druhém pak, rafinovaně, považujeme přímo samotného hrocha za šuplík.
Konverze konstruktorem
Pokud není konverze možná, tento zápis vytvoří výjimku.
var cislo:int = -155; var mc:MovieClip = MovieClip(cislo);
Error #1034: Type Coercion failed: cannot convert -155 to flash.display.MovieClip.
Konverze operátorem as
Méně drakonická varianta předchozího. Slovo as znamená jako.
V případě nekompatibilní konverze je cílové proměnné přiděleno null.
var cislo:int = -155; var mc:MovieClip = cislo as MovieClip; trace(mc); // null
Drobná lingvistická odbočka: coercion prosím neplést s correction.
Doporučované konvence značení
AS3 přineslo také sjednocení konvence pojmenování objektů a jejich prvků.
Při vlastní tvorbě je vhodné se této konvence přidržet.
- U jmen tříd se používá tzv. CamelCase s počátečním velkým písmenem.
- Proměnné, vlastnosti a metody pak opět camelCase, tentokrát už s malým prvním písmenem.
- Konstanty velkým písmem. Například KONSTATNA_VESMIRU.
AS3 opouští konvenci podtržítkových prefixů
Podtržítkové prefixy vlastností jsou reliktem z dob AS1. Vývojáři tehdy měli potřebu odlišit vlastnosti nativních objektů, které mají interně definovaný nějaký accessor. Například u MovieClipu je to prakticky každá veřejná vlastnost, neboť změna vlastnosti musí vyvolat celou kaskádu dalších akcí, spojených především s překreslením zobrazení.