. .. : Swf.hu 1.0 archívum : Swf.hu főoldal >>> : .. .




 
 
SEGÉDLETEK ActionScript alapok

Actionscript 3.0 alapok Adobe Flash CS3-ban
  feltöltve: 2007.10.11 | szerző: Reider | olvasva: 5952 alkalommal

               
 

Flash mindig is folyamatosan bővült de még eddig sohasem ment át olyan hatalmas változáson, mint amit az új Actionscript 3 hozott. Akár nyugodtan beszélhetnénk róla úgy, mint egy teljesen más nyelvről mivel alapjaiban lett újraírva és a futtatást is másik virtuális gép végzi (AVM2, Actionscript Virtual Maschine 2) a flash playeren belül. Hasonlóságok természetesen vannak, viszont egy AS2-es kód AS3-asra átírása komplexebb dolgok esetén akár a kód újraírását is vonhatja maga után. Ez a tutorial az alapok bemutatására koncentrál azokat is inkább ahogyan a Flash CS3-ban láthatjuk és használhatjuk. Főleg a változásokról és a különbségekről lesz szó, így hasznos lehet, ha valaki tisztában van az AS2 alapjaival is.

Tartalom

Áttekintés

Actionscipt 1.0

Így hívtuk a flash player 6-ban megjelent és korábbi flash script nyelvet. Minden egyes nyelvi elem objektum volt és a származtatást prototípus objektumok segítségével valósították meg. A prototípusok mindig a származtatott objektumra mutattak és ha egy metódust nem talált a player végigjárta a porototípusokat addig amíg meg nem találta, így valósult meg a származtatás.
Másik fontos dolog hogy nem támogatta az osztály definíciókat nem volt lehetőség a class kulcsszó használatával osztályok létrehozására. Erre a célra függvényeket használtak, amik template-ként szolgáltak egy objektum elkészítéséhez. Készítsük el a Kerék és a Tárgy osztályokat:

function Targy(szilard) {
     this.szilard = szilard;
}

function Kerek() {}
Kerek.prototype = new Targy(true);
Kerek.prototype.gurulj = function() {
      trace("gurul");
};

var kerek = new Kerek();
kerek.gurulj(); //gurul
trace(kerek.szilard); //true

Actionscipt 2.0

Ez a Flash Mx 2004-ben került először használtra és maradt Flash 8-ban is.
Actionscript 2.0 tulajdonképpen csak egy feltunningolt AS1 mivel a nyelv alap működésében nem hozott semmi újat csak a fejlesztők dolgát könnyítette meg olyan újdonságokkal, mint a fordításidejű típus ellenőrzés vagy a class kulcsszó bevezetése, amivel lehetőség nyílt más nyelvekhez hasonló osztályok létrehozására.
Megjelentek az interface-ek is amik szintén a fejlesztők dolgát voltak hivatottak megkönnyíteni.

A belső maradt ugyanaz, az osztályok példányosításuk után objektumokká váltak és elvesztették a láthatósági információkat amit a private vagy public kulcsszavak használatával lehetett megadni.
Hiába lehetett típusokat megadni ez csak a fordításkor tudta kiszűrni a hibákat mivel nem volt futás idejű típus ellenőrzés. Vegyük a következő példát:

var myNum:Number
myNum = 12
trace(myNum) // 12

myNum = new Array() // Hiba

Az első estben minden tökéletesen működik, belekerül a számunk a változóba, azonban amikor megpróbálunk egy más típusú értéket adni a változónknak a fordító értesít minket, hogy ezt mi nem szeretnék megcsinálni. A fordító rájött, hogy a két típus nem azonos ezért hibát fog kiírni. De mi van, ha mi nagyon bele akarunk rakni egy tömböt egy szám típúsu változóba? Mivel nincs futás idejű típus ellenőrzés, csak azt kell megakadályoznunk, hogy a fordító felismerje a változót. Mivel tudjuk, hogy flash-ben minden objektum, és hogy az objektumokon belül bármire tudunk String kulcsokkal hivatkozni így kipróbálhatjuk ezt:

var myNum:Number

this["myNum"] = new Array()
myNum["push"]("hello")

trace(myNum) // hello

Természetesen előfordulhatnak ilyen hibák akaratlanul is, és mivel a player nem szól róluk, marad a hosszas hibakeresés. Ez az újfajta típusosság nem szüntette meg teljesen az elírásokból fakadó hibákat, de nagyban segített megtalálni őket.

Actionscipt 3.0 Újdonságok

Elérkeztünk végre az Actionscript 3.0-hoz, ami az ECMAScript (ECMA 262) nyelvi specifikációra épül. Külön virtuális gépet kapott, amit AVM2-nek (Actionscript Virtual Maschine 2) hívnak ennek segítségével, sokkal gyorsabban és megbízhatóbban futtatható flash alkalmazások készíthetőek. Megnőtt kódok futtatásának sebessége is, helyenként 10x gyorsabban fut ugyanaz a kód AVM2 alatt.

Új primitív típusok

Actionscript 2.0-ban csak 1 fajta szám létezett, mégpedig a Number. Ez alapjában véve megkönnyíti a fejlesztők dolgát, mivel csak egy fajta szám típussal kell foglalkozniuk de, ugyanakkor a memória használatot is növeli és lassítja a kódot, mivel ebben a típusba ugyanúgy bele kell férnie a lebegőpontos számoknak és a negatív számoknak is.
Ezért került bevezetésre 2 új típus az int (integer) és az uint (unsigned integer).

Az int egész számok tárolására alkalmas, egyaránt pozitív és negatív irányban is. Csak egész számokat lehet benne tárolni, mivel értékadást követően azonnal levágja a tizedes pont utáni részt, tehát úgy viselkedik, mintha meghívták volna rá a Math.floor() -t tehát például 125.545-ből egyszerűen csak 125 lesz értékadás után.
Az int adattípust legtöbbször egész számokkal végzendő számítások során vagy ciklusok írásakor célszerű használni, mint például egy for ciklusban.

Az uint pozitív egész számok tárolására alkalmas. Negatív számokat nem érdemes tárolni ilyen változókban, mert itt nem fog semmilyen értelmesnek mondható konvertálás végbemenni. Negatív szám uint kén tárolása esetén jobb esetben a fordító futás időben értesít a tévedésünkről, rosszabb esetben váratlan dolgok történhetnek. Próbáljuk ki hogy uint ként tároljuk például a -1 et az eredmény: 4294967295 hogy ez miért és hogyan fordulhat elő azt most nem firtatom.
Az uint adattípus legtöbbször színek tárolására vagy számlálók készítéséhez használhatjuk.

Futás idejű típus ellenőrzés

As3-ban a típus információk futás időben is megmaradnak így a player értékadásnál ellenőrizni, tudja a típusok kompatibilitását, és eltérés estén megpróbálhatja átkonvertálni vagy hibát dobhat ami nagy segítséget nyújt a fejlesztők számára. Próbáljuk meg átverni a playert az As2-ben is bemutatott mintával:

var myNum:Number

this["myNum"] = new Array()

//Error #1069: Property push not found on Number and there is no default value.
myNum["push"]("hello")

Hát igen As3-at már nem lehet átverni, mivel megtartja a típus információkat. Felmerülhet a kérdés, hogyha olyan okos akkor miért nem vette észre a this["myNum"] = new Array() részt miért csak akkor szólt amikor már elemet akartam rakni a változómba. Pontosan tudta hogy ezt csináltam és meg is próbálta bekonvertálni a tömbömet számmá, ami azt eredményezte hogy 0 értéket kapott a változóm.

A player futás közben a primitív típusokat automatikusan konvertálja még akkor is ha komplex adattípusokat próbálnak ilyen típusú változókban tárolni, de ezekről majd később.

Futás idejű kivételek

Régebbi actionscript verziókban a player nem szólt, hogyha valamilyen hiba lépett fel futás közben automatikusan tovább futott mintha mi sem történt volna ezek voltak az úgynevezett "Silent Error"-ok.

Ennek mostantól vége, a debug flash player minden hibáról részletes értesítést küld, amiben látható a hiba leírása és a sorszám ahol a hiba keletkezett. Ezzel együtt meg kell szoknunk a hibakezelést is, ami elengedhetetlenné vált ennek következtében.

Zárt osztályok

As3-ban a legtöbb osztály zárt, ez azt jelenti, hogy nem lehet hozzájuk dinamikusan objektumokat hozzáadni példányosítás után. Ami eddig az osztályunkban szerepelt a benne is marad, de ilyen osztályoknál nincs lehetőség például egy szám elhelyezésére az osztályban, hacsak nincs dinamikus-ként definiálva. Például ilyen dinamikus osztály a MovieClip, amin bármikor elhelyezhettünk változókat vagy függvényeket.

Hogy egy osztály dinamikus vagy nem azt könnyen kideríthetjük az új kinézetű Súgó segítségével. Próbáljuk meg megnézni, hogy dinamikus osztály-e az Object.
A class mellett ez áll: public dynamic class Object
Tehát dinamikus így elhelyezhetünk rajta gond nélkül új változókat a fordító nem fog hibát dobni.

Új XML kezelés

As3-ban megjelent egy új xml típus, ami sokkal egyszerűbbé teszi az xml kezelés még komplex xml-ek esetén is. Ennek segítségével az xml úgy viselkedik, mintha egy egyszerű objektum lenne és pont olyan egyszerű is bejárni az elemeit.

RegEx támogatás

Az előző actionscript verziókban nem volt beépített RegEx (Regular expressions) támogatás de le lehetett tölteni olyan osztályokat, amik lehetővé tették javascript segítségével vagy simán csak flash-ben megírva. Ez mostanra megváltozott mivel a String osztály beépített metódusokat tartalmaz a RegEx kifejezések kezelésére sőt egy saját osztály is hozzáadásra került RegExp néven.

Ennek az új osztálynak a segítségével egy sorosra lehet csökkenteni olyan kódokat, amikkel régebben sokkal több sorban lehetett csak azonos végeredménnyel leírni ugyanazt a műveletet, mint például az e-mail cím ellenőrzés.

Namespace-ek

A namespace-ek deklarálásának lehetősége bizonyára ismerős azoknak, akik más komolyabb programnyelvekkel dolgoznak de pár namespace biztosan ismerős lesz másoknak is ha ezeket említem: private, public, protected.
Ezek is namespace-ek amik láthatóságot adnak meg. A namespace azt határozza meg hogy egy adott metódust vagy változót honnan lehet elérni. Most már lehetőségünk van saját láthatóságot is definiálni, ami például megakadályozza a névütközést azonos nevű metódusok egy osztályon belüli deklarálása esetén vagy akár xml kezelésnél is hasznosak lehetnek.

Új eseménykezelő rendszer

Az események ismerősek lehetnek régebbi actionscript verziókból amikor addListener() -t vagy addEventListener() -t használtunk figyelő objektumok hozzáadására komponensekhez vagy beépített osztályokhoz mint például a Key. Az esemény kezelő rendszer a legjobban az As2-es komponensek esemény kezeléséhez hasonlít de mégis teljesen más.

Új display list

A display list az a lista ami alapján a flash player rendereli az elénk táruló képet. Az határozza meg, hogy az objektumok milyen sorrendben jelenjenek meg és hogy éppen melyik takarja el a másikat. Eddig nem volt lehetséges olyan objektumot a display listához adni ami létrejöttekor még nem volt a része. Ezért kellett például MovieClip-ek létrehozásakor nem a new MovieClip() syntaxist hanem a movieClipInstance.createEmptyMovieClip-et használni ami automatikusan visszaadott egy már a displaylist-hez adott MC-t.

Most már nincs szükségünk erre a hosszas és körülményes megoldásra, hanem egyszerűen a new kulcsszó segítségével pl: new MovieClip() hozhatunk létre display objektumokat amiket később az addChild() segítségével a display list-hez csatolhatunk. Mostantól nincs szükségünk a depth (mélység) értékek megadásával bajlódni mivel ezt AS3 már automatikusan kezeli.

 
               
 
 

© Devnet.hu. A segédletek semmilyen formában nem másolhatók, publikálhatók a Devnet.hu és a szerzők közös írásos engedélye nélkül.
 
. .. : Swf.hu 1.0 archívum : Swf.hu főoldal >>> : .. .