Ú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.
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í.
Vývoj jazyka ale postoupil a taková konvence přináší jen zmatky. V AS3 jsou tedy podtržítka odstraněna.
Někteří programátoři používají ve svých třídách podobné druhy konvencí. Osobně si myslím, že to přináší víc zmatků než užitku.