Optimalizácia flash aplikácií
Veľa vývojárov flash aplikácií, má pri výslednej kompilácii svojho projektu do SWF problém s dátovou veľkosťou, rýchlosťou a zabezpečením svojho produktu.
Pri optimalizácii flash aplikácií sa väčšinou berie ohľad na tri prvky:
- • Dátová veľkosť výslednej aplikácie
• Rýchlosť aplikácie (script)
• Zabezpečenie aplikácie
Dátová veľkosť výslednej aplikácie
Dátová veľkosť aplikácie je asi najväčší problém pri vývoji akéhokoľvek produktu vo flashi. Síce flash od verzie 6 (Macromedia Flash MX) implicitne podporuje kompresiu SWF, pomocou ZLib kompresie, ktorá významne dopomohla k ešte väčšej príťažlivosti flashu, je efektívna iba v prípade, že máme vytvorenú aplikáciu čisto vektorovou a skriptovou formou. Aj keď je flash primárne vektorová technológia, veľa vývojárov neváha použiť vo svojich projektoch bitmapovú grafiku, ktorá je mnoho násobne dátovo objemnejšia ako vektor, ale niekedy sa tomu skutočne nedá vyhnúť. To isté platí aj pri použití zvukových alebo video súborov. Pri použití bitmapovej grafiky, videa a zvuku máme dve možnosti, ako znížiť celkovú veľkosť našej aplikácie, a to je nastavenie kvality objektu pri exporte aplikácie do SWF, alebo prvok načítavať dynamicky (externe).
Ak vytvoríme aplikáciu a po jej kompilácii zistíme, že jej dátová veľkosť je nad prípustnou hodnotou (flash banner, welcome screen), musíme najprv zistiť, ktorý z nami použitých objektov navršuje veľkosť aplikácie nad povolenú hranicu. Na to nám slúži funkcia Generate size report, ktorá nám spolu so skompilovaným SWF, vygeneruje ako TXT súbor aj výpis dátovej veľkosti všetkých, nami použitých objektov v aplikácii.
Túto možnosť si môžeme vybrať pri exporte:
Na ukážku som pripravil SWF súbor, ktorý obsahuje JPG obrázok (441KB), zvukový súbor MP3 (15MB) a výrez videa (cca 600KB) – spolu cca 16,4MB. Nastavil som rôzne parametre pre obrázok, zvuk, video a vyexportoval SWF, ktoré malo výslednú veľkosť 2,9MB. Size report tohto súboru vyzerá nasledovne:
Kód: Vybrať všetko
Scene Shape Bytes Text Bytes ActionScript Bytes
------------------------- ----------- ---------- ------------------
Scene 1 0 0 0
Bitmap Compressed Compression
----------------------- ---------- -------- -----------
obrazok.jpg 145083 8940300 JPEG Quality=40
Stream Sound:
Stream Sound: 11KHz Mono 16 kbps MP3
Event Sounds: 22KHz Mono 16 kbps MP3
Sound name Bytes Format
----------------------- --------- ----------
Led Zepplin- Stairway to Heaven.mp3 1424451 22KHz Mono 24 kbps MP3
Video Compressed
------------------------ ----------
video 1320531
Ako som dosiahol taký výrazný pokles veľkosti? Musel som obetovať 100% kvalitu vložených objektov a vybrať pre mňa optimálnu. To znamená pre JPG obrázok som zvolil JPG kompresiu s kvalitou 40, pre zvuk MP3 s kvalitou 320kbps 44kHz Stereo, som zvolil 24kbps mono a pre video súbor (vložený do SWF ako „Embed video in SWF and play in timeline“) som kvalitu zvolil už pri jeho importe do aplikácie (len vtedy sa dá nastaviť kvalita) a orezal som z neho iba časť, ktorú som potreboval. Pozor pri importe videa vo formáte FLV sa kvalita nastavit nedá ! Toto sa musí urobiť, novým prekonvertovaním do nižšej kvality pomocou externého programu.

Čo ale vtedy, keď chceme mať v aplikácii zvuk, video alebo obrázok v pôvodnej kvalite ale nemôžeme si to dovoliť? Riešenie je pomerne jednoduché a to, tento objekt nevkladať priamo do SWF ale načítavať ho externe. Tento postup sa nazýva streaming a nevyužíva sa iba pri audio súboroch ale aj pri videu a obrázkoch (MP3, VIDEO prehrávače a FOTOgalérie). Tu prichádza na rad ActionScript, ktorým si tento Streaming jednoducho vytvoríme (naprogramujeme).
Zvuk:
Vytvoríme si objekt triedy sound s názvom zvuk, s ktorým môžeme ďalej pracovať. Pod pojmom objekt si môžeme v tejto chvíli predstaviť akúsi nádobu, na ktorej je napísaný jej názov "zvuk" a do ktorej budeme načítavať našu mp3. Tým, že máme objekt pomenovaný, vieme naň priamo zacieliť zavolaním jeho mena, a tak vykonať príslušnú akciu.
Ako už názov napovedá, loadSound(); slúži pre načítanie zvukového súboru do objektu zvuk. loadSound(); má dva parametre:
- • Prvý parameter udáva názov nášho zvukového súboru, ktorý zapisujeme v úvodzovkách (String) aj s príponou, v tomto prípade "hudba.mp3", čo znamená, že zvukový súbor s názvom hudba.mp3 sa nachádza v rovnakom umiestnení ako SWF súbor (relatívna cesta k súboru).
• Druhý parameter je typu Boolean (true/false), ktorý nám udáva, či má byť zvukový súbor prehrávaný okamžite (true – povolený streaming), aj keď ešte nie je úplne načítaný, alebo či sa má spustiť až po jeho úplnom načítaní (false), čo nie je vhodné ak je súbor väčšieho dátového objemu a spustenie môže istú dobu trvať (podľa rýchlosti internetového pripojenia užívateľa).
Obrázky:
Pri externom načítavaní obrázkov, nám odpadá vytváranie objektu (s výnimkou LoadClip();) a máme možnosť použiť jednu z troch variant, jeho načítania do SWF aplikácie.
- • loadMovieNum();
• loadMovie();
• loadClip();
Táto funkcia nám načíta obrázok na scénu a viac sním už pracovať nemôžeme. Je to vhodné pre jednorazové načítanie pozadia. Zadávame dva parametre.
- • Prvý je tak isto ako pri zvuku, názov načítavaného obrázku
• Druhý je číslo vrstvy (hĺbky), do ktorej sa má obrázok načítať (podobne ako je to v html pri CSS a jeho parametre z-index v DIVe). Môžeme zadať aj zápornú hodnotu.
Kód: Vybrať všetko
loadMovie("obrazok.png", instanciaMC);
// alebo
instanciaMC.loadMovie("obrazok.png");
Obidve varianty sú rovnaké. Pre správne fungovanie tejto funkcie, je nutné mať vopred vytvorenú prázdnu inštanciu movieclipu, umiestenú na scéne. instanciaMC je názov tohto movieclipu a obrázok načítavame do neho. Takto môžeme s obrázkom, respektíve s takto "naplneným" movieclipom, ľubovoľne manipulovať (zmena pozície, veľkosti, aplikovať transparentnosť a pod.) Nevýhodou je, že pri takomto načítavaní je problém (nie je to ale nemožné), kontrolovať priebeh načítavania (preloader).
Kód: Vybrať všetko
var nacitanie:MovieClipLoader = new MovieClipLoader();
nacitanie.loadClip("obrazok.png", instanciaMC);
Asi najčastejšie používaná funkcia, pri ktorej je potrebné mať vytvorený objekt MovieClipLoader. Funguje na princípe kombinácie objektu Sound a funkcie loadMovie();. loadClip je priradený k objektu a do parametrov sa zadáva názov obrázku ako String a názov movieclipu, do ktorého sa má obrázok načítať (hodnota typu :MovieClip). Pomocou funkcie onLoadProgress(); (a ďalších, viď. help vo flashi), kde ale musí byť ešte pridaný listener (poslucháč) a nový prázdny Object, môžeme bez problémov kontrolovať priebeh načítania, jeho ukončenie, chybu pri načítaní a pod.
Video:
Externé načítanie videa do SWF je o niečo zložitejšie. Aj tu máme na výber dve možnosti ako to urobiť.
Prvá, jednoduchšia možnosť, je použiť už vstavanú komponentu FLVPlayback. Stačí ak na importujeme nami zvolené video ako Progressive download from web server a ďalej postupujeme podľa sprievodcu importom (Ak importujeme video vo formáte FLV automaticky preskočíte možnosť encoding). Ako tretí krok (možno druhý podľa formátu videa), nasleduje Skinning, kde si môžete vybrať skin ovládacieho panelu vášho prehrávača. Ak si žiadne ovládacie prvky neželáte, stačí z možností v rozbaľovacom menu vybrať možnosť, None. Nič viac nemusíte nastavovať, stačí vyexportovať SWF a okamžite sa vami zvolené video začne prehrávať.
Druhá možnosť, ktorá sa využíva hlavne pri vyrábaní video prehrávačov na mieru, je o niečo zložitejšia, pretože budeme musieť písať ActionScript. Zobrazíme si library (CTRL+L), kde klikneme myšou na pravé horné tlačítko a z ponuky, ktorá sa zobrazí vyberieme New Video. Zobrazí sa nám okno, v ktorom je vybratá voľba Video (Action Script – controlled). Nič nemeníme a stlačíme OK.
V library sa nám vytvorila nová inštancia s ikonkou kamery, ktorú potiahneme na scénu a v panely properties ju pomenujeme video. Teraz otvoríme okno Actions (F9) a napíšeme:
Kód: Vybrať všetko
var prepojenie:NetConnection = new NetConnection();
prepojenie.connect(null);
Najprv si musíme vytvoriť objekt triedy NetConnection, ktorý bude slúžiť ako prepojenie.
Kód: Vybrať všetko
var streamovanie:NetStream = new NetStream(prepojenie);
Následne si vytvoríme objekt triedy NetStream, ktorý prepojíme s triedou NetConnection.
Inštanciu pomenovanú video, ktorá je na scéne, previažeme pomocou funkcie attachVideo s triedou NetStream a tak nám bude slúžiť ako display.
Na koniec, nasleduje funkcia play();, ktorú priradíme triede NetStream a ako parameter zadáme názov nášho videa, čo nám zaručí okamžité prehrávanie.
Takto dokážeme veľmi efektívne znížiť výslednú veľkosť aplikácie a jej funkčnosť zostane naďalej zachovaná.
Rýchlosť aplikácie (script)
Ďalším citlivým prvkom pri vývoji flash aplikácií, je ich rýchlosť, čiže čas, za ktorý sa vykonajú nami vytvorené funkcie v algoritme. Síce ActionScript nepatrí medzi rýchle jazyky, ako je napríklad jazyk C, vieme ho aspoň lepším zápisom nášho algoritmu o málo zvýšiť. Je samozrejmé, že pri technológii, ktorá je závislá od interpretera (flash player), je rýchlosť vykonávania scriptu jeho "práca" a odvíja sa od toho ako je interpreter naprogramovaný a ako spracúva príkazi ActionScriptu (to už ale my neovplyvníme). Vieme, však náš kód aspoň optimalizovať do takej miery, aby sme flash playeru (aj keď len minimálne) dopomohli.
Umiestňovanie scriptu:
Prvou a zásadnou zmenou, ktorú by sme mali preferovať pri zápise scriptu, je vyvarovať sa zapisovaniu scriptu priamo na inštancie objektov (návyk zo starších verzií flashu). Vykonávanie takto umiestneného scriptu je o cca 24ms pomalšie ako vykonávanie scriptu umiestneného v snímku časovej osy. Z tohto, ale aj iného dôvodu, bola možnosť umiestňovať script na inštancie v novej verzii ActionScript 3.0 zakázaná a ak script umiestnime na inštanciu, nebude fungovať (debuger bude hlásiť chybu a script bude nefunkčný). Preto je dobré sa naučiť písať script, najlepšie iba do jedného snímku pre celú aplikáciu.
Úplné deklarovanie premenných a funkcií:
Kód: Vybrať všetko
var cislo:Number = 5; // hocijaké reálne číslo, celé alebo desatiné
var celeCislo:int = 6; // kladné alebo záporné celé číslo, iba v ActionScript 3.0
var celeKladneCislo:uint = 128; // iba celé kladné číslo, iba v ActionScript 3.0
var text:String = "ahoj"; // textová hodnota v úvodzovkách alebo apostrofoch
var logickaHodnota:Boolean = true; //alebo false, bez úvodzoviek
var objektMovieClipu:MovieClip = nazov; // bez úvodzoviek
var regulerneVyrazy:RegExp = /<([a-z]+)>(.+?)</1>/; // bez úvodzoviek, iba v ActionScript 3.0
Pri takto deklarovaných premenných, im nemusí pri spracovávaní flash player vyhradzovať väčší priestor, a tým mu aspoň z časti domôžeme, nehovoriac o tom, že ak by sme mali premennú deklarovanú takto:
bude síce funkčná, ale túto premennú môžeme prepísať akýmkoľvek iným typom premennej, napr. textom, čo by bolo neprípustné a debuger nás na takúto prípadnú kolíziu typov neupozorní.
To isté platí aj pri použití premenných v cykloch, menovite v cykle for, kde miesto zápisu:
použijeme zápis:
Pri vytváraní funkcií by sme mali na konci definície funkcie udať, či funkcia bude vracať nejaký typ hodnoty, alebo či nebude vracať nič, vďaka čomu flash player nemusí pre túto funkciu vyhradzovať väčší priestor. Takže namiesto zápisu:
Kód: Vybrať všetko
function test() {
var a:Number = 1;
var b:Number = 2;
return a+b;
}
Kde nám funkcia vracia číselnú hodnotu sčítania hodnôt v premenných A a B, to zapíšeme takto:
Kód: Vybrať všetko
function test():Number {
var a:Number = 1;
var b:Number = 2;
return a+b;
}
A tým určíme, že hodnota, ktorú bude funkcia vracať, bude číslo. V prípade, že funkcia nemá vracať žiadnu hodnotu, tak ako deklaráciu použijeme :Void, čo znamená koniec. V ActionScript 2.0 sa :Void píše s veľkým začiatočným písmenom. V ActionScript 3.0 sa píše s malým začiatočným písmenom :void.
Kód: Vybrať všetko
var c:Number = 0;
function test():Void {
var a:Number = 1;
var b:Number = 2;
c = a+b;
}
Jedinou výnimkou nedeklarovania typu návratovej hodnoty, je situácia, keď máme vo funkcii podmienku a funkcia môže vracať viac typov hodnôt.
Meranie rýchlosti scriptu:
Meranie rýchlosti scriptu je skôr vec pre puntičkárov, ako som ja. Jedná sa o výpočet trvania vykonania určitej časti alebo celého scriptu (pokiaľ nepoužívame paralelné funkcie spúšťané event hadlermi).
K tomuto účelu nám poslúži funkcia getTimer();, ktorá nám vracia číselnú hodnotu času od spustenia aplikácie v milisekundách. Jej použitie je nasledovné:
Kód: Vybrať všetko
var cas1:Number = getTimer();
for (var i:Number = 0; i<10000; i++) {
a = i;
}
var cas2:Number = getTimer();
trace(cas2-cas1);
Premennú cas1, ktorá sa nachádza tesne pred meranou časťou kódu, naplníme aktuálnym priebehovým časom a táto hodnota sa už nezmení. Nasleduje nami meraná časť kódu, v tomto prípade sa jedná o cyklus, ktorý kým sa nevykoná, kód nebude pokračovať. Po jeho vykonaní znovu zmeriame čas a uložíme ho do premennej cas2. Funkciou trace();, ktorá slúži na kontrolný výpis v prostredí flash editoru, si dáme zobraziť výsledok odčítania hodnoty v premennej cas1, od hodnoty v premennej cas2, a výsledné číslo je čas vykonávania nášho cyklu v milisekundách. Takto si vieme zmerať, ktorúkoľvek časť nášho kódu a poprípade urobiť jeho korekciu a zrýchliť ho.
(tip: Funkciu trace(); používajme s rozvahou a pred konečnou kompiláciou aplikácie všetky trace() z kódu odstráňme, pretože samotná funkcia, aj keď sa u užívateľa nezobrazí, nám spomaľuje kód o cca 14ms a ak ich máme v kóde veľa, nemusí to našej aplikácii prospieť.)
Volanie funkcií medzi sebou:
AscionScript nám dovoľuje jednu zaujímavú možnosť zápisu funkcií.
Kód: Vybrať všetko
function hojko():Void {
hojko_mc._x += 5;
hojko_mc._xscale ++;
}
function ovladanie(pozX:Number):Void {
hojko();
hojko_mc._y = pozX;
}
ovladanie(3);
Takéto volanie funkcií, kde funkciu 1 zavoláme z funkcie 2, je pomalé a je vhodné iba v prípade, že funkciu 1 používame v našom kóde viac krát. Možno sa ale pýtate, čo vtedy keď chcem zavolať funkciu 1 pomocou event handler funkcie (tlačítko)? Automaticky by asi zápis vyzeral napr. takto:
Kód: Vybrať všetko
tlacitko.onRelease = function():Void {
hojko();
};
Tento zápis je správny, ale pomalší. Ak teda funkcii hojko(); netreba nadefinovať dáke parametre a spúšťame ju s prázdnymi zátvorkami, môže náš event handler vyzerať takto:
Za znak "rovná sa" napíšeme priamo názov funkcie, ktorú chceme spustiť, ale bez zátvoriek. Tým, sme nie len zrýchlili vykonanie funkcie, ale aj skrátili náš zápis. Samozrejme, nie vždy to všetko platí a jedná sa o to, čo má funkcia vykonávať. Je dobré radšej zmerať jej rýchlosť a rozhodnúť sa.
// Editácia článku 05.03.2011 [weroro]
Pred nedávnom som potreboval vyriešiť jeden problém a pri mojich pokusoch vyriešiť ho, som narazil na jeden síce v praxy (asi) nepoužiteľný, ale za to zaujímavý zápis spustenia 2 a viac funkcií. Jedná sa o zavolanie inej funkcie z hlavnej funkcie a to tak, že druhú funkciu voláme pri inicializácii prvej a zapíšeme ju ako parameter vo funkcii 1. Ukážeme si to na štyroch samostatných funkciách.
Kód: Vybrať všetko
// vytvoríme si prvú funkciu
function prva():Void {
trace("prvá položka");
}
// vytvoríme si druhú funkciu
function druha():Void {
trace("druhá položka");
}
// vytvoríme si tretiu funkciu
function tretia():Void {
trace("tretia položka");
}
// vytvoríme si štvrtú funkciu
function stvrta():Void {
trace("štvrtá položka");
}
//
// INICIALIZÁCIA PREDDEFINOVANÝYCH FUNKCIÍ, S POMOCOU KOMBINACIE
//
prva(druha(tretia(stvrta()))); //zavolanie prvej kombinácie
//
prva(druha(),tretia(),stvrta()); //zavolanie druhej kombinácie
//
prva(druha(tretia()),stvrta()); //zavolanie tretej kombinácie
//
prva(druha(),tretia(stvrta())); //zavolanie štvrtej kombinácie
Trace umiestnený vo funkciách nám vyhodí výpis:
Kód: Vybrať všetko
štvrtá položka
tretia položka
druhá položka
prvá položka
štvrtá položka
tretia položka
druhá položka
prvá položka
štvrtá položka
tretia položka
druhá položka
prvá položka
štvrtá položka
tretia položka
druhá položka
prvá položka
To znamená, že funkcie sú spúšťané vždy od najhlbšie umiestnenej funkcie v zápise (od konca).
[edit end]
Skratky:
V prípade, že potrebujeme viac objektom v aplikácii priradiť rovnaký parameter k vlastnosti, alebo k rôznym event handlerom priradiť rovnakú funkciu, je na mieste použiť skrátené priradenie k objektom. Prestavme si situáciu, kde máme v aplikácii 5 objektov, ktorým chceme nastaviť pozíciu _x na hodnotu 0. Zapíšeme to takto:
Kód: Vybrať všetko
objekt1._x = 0;
dalsiobj.ovladac._x = 0;
mc1._x = 0;
menu._x = 0;
gulicka._x = 0;
Máme, tak script na 5 riadkov, v ktorom piatim rôznym objektom nastavujeme pozíciu _x na 0. Tu ale môže vzniknúť problém pri zmene tejto hodnoty, pretože pre každý objekt ju treba zmeniť zvlášť. Pokiaľ bude, ale táto hodnota rovnaká pre každý z týchto objektov vždy, vieme použiť skrátení výraz a pri prípadnej editácii kódu nemusíme ručne meniť hodnotu každého objektu zvlášť.
Zápis bude vyzerať takto:
Kód: Vybrať všetko
objekt1._x = dalsiobj.ovladac._x=mc1._x=menu._x=gulicka._x=0;
Tento typ zápisu sa nazýva INLINE (v riadku) a je použiteľný iba v prípade použitia vlastností a handlerov, ktorým je nutné priradiť nejakú hodnotu za znakom rovná sa (=).
Kód: Vybrať všetko
mc1._visible = false;
mc1._width = 10;
// a pod.
Samozrejme, že pri takomto skracovaní môžeme typy vlastností aj miešať medzi sebou.
Toto isté platí aj pri priraďovaní funkcií k event handlerom a pod. Predstavme si tlačítko, ktorému chceme nastaviť, aby pri evente onRollOver a pri evente onRelease, aby vykonalo rovnakú akciu napr. prešiel na scéne, na snímok 3. Zápis by mohol vyzerať takto:
Kód: Vybrať všetko
tlacitko.onRollOver = function():Void {
_root.gotoAndStop(3);
};
tlacitko.onRelease = function():Void {
_root.gotoAndStop(3);
};
Skratka pre tento zápis bude vyzerať nasledovne:
Kód: Vybrať všetko
tlacitko.onRollOver = tlacitko.onRelease=function ():Void {
_root.gotoAndStop(3);
};
Zápis je rovnako funkčný a tak isto rýchly. Je ho možné využiť aj pri použití preddefinovaných funkcií, ktoré používame v celej aplikácii.
Kód: Vybrať všetko
function preskocenie():Void {
_root.gotoAndStop(3);
}
tlacitko.onRollOver = preskocenie;
tlacitko.onRelease = preskocenie;
alebo v skratke:
Kód: Vybrať všetko
tlacitko.onRollOver = tlacitko.onRelease=preskocenie;
Všetky tieto zápisy sú plne funkčné a je iba na nás, pre ktorý z nich sa rozhodneme.
Ďalšia technika používania skratiek je univerzálnejšia a dokonca priamo v nej môžeme použiť techniku INLINE. Jedná sa o skratku, pri ktorej je využívaný cyklus. Ako som už napísal, technika INLINE je použiteľná iba v prípade, že sa bude jednať o funkcie, ktorým je nutné priradiť hodnotu za znakom rovná sa (=). Avšak v prípade funkcií, využívajúcich iba dot operátor (bodku), toto nie je použiteľné. Predstavme si situáciu, kedy máme na scéne 100 movieclipov, v ktorých je nejaká animácia a potrebujeme túto animáciu vo všetkých týchto objektoch zastaviť, pomocou funkcie stop();. Môžeme to vypísať ručne na 100 riadkov, ale priznajme si sami, komu sa to chce, však? 100 objektov nie je málo, a tak to môžeme zapísať nasledovne.
Kód: Vybrať všetko
for (var i = 1; i<=100; i++) {
_root["mc"+i].stop();
}
Ako vidíme zo 100 možných riadkov, máme 3, ktoré fungujú rovnako rýchlo a 100 animácií zastavíme.
Zápis
je zástupný a znamená, že na hlavnej scéne (_root) sa nachádza objekt s názvom mc, ktorý má na konci názvu dáke číslo (mc1, mc2, mc3, mc99 a pod.) a toto číslo nám určuje cyklus od 1 po 100.
Isto Vás teraz napadla otázka: Čo vtedy, ak mám na scéne 100 objektov, ale každý sa volá inak a nemá vo svojom mene žiadne číslo a ručné premenovanie neprichádza do úvahy?
Riešenie je pomerne jednoduché, ale neodporúčam ho využívať často a hlavne nie pri veľa objektoch (100 je už asi veľa) a to preto, lebo riešením je použiť pole prvkov, do ktorého ručne vypíšeme názvy všetkých objektov, ktoré chceme spracovať.
Kód: Vybrať všetko
var PolePrvkov:Array = [objekt1, objekt_mc, menu, stopkaMc, dalsiobj.ani, hojko, startovanie];
for (var i = 0; i<7; i++) {
PolePrvkov[i].stop();
}
Do poľa vpíšeme názvy bez úvodzoviek a cyklus zahájime od čísla 0, pretože prvá položka v poly je nultá. V prípade, že sa nám nechce vypĺňať toto pole ručne, môžeme si to z automatizovať, a to tak že pole naplníme pomocou cyklu for in, ktorý bude fungovať na tento princíp.
Kód: Vybrať všetko
for (i in this) {
if (typeof this[i] == "movieclip") {
trace(i);
}
}
Cyklom for in oskenujeme celú hlavnú scénu aplikácie a pomocou podmienky odfiltrujeme objekty typu movieclip, ktorými naplníme pole. Ako som už však načrtol, používanie poľa nie je veľká výhra pri veľkom počte prvkov, pretože to je náročné na užívateľskú pamäť (RAM).
Skratky pre logické hodnoty:
Ďalším typom skratky je takzvaná návratová hodnota negácie, ktorá pracuje s vlastnosťami objektov a premennými logického typu Boolean (true/false).
Napr.
Kód: Vybrať všetko
mc._visible = false; // z neviditeľní objekt s názvom mc
var logika:Boolean = true; //nastaví premennú logika na hodnotu true
Ak používame podmienky, kde kontrolujeme práve hodnotu true alebo false, už vieme, že náš zápis nemusí vyzerať takto:
Kód: Vybrať všetko
if (a == true) {
//vykonaj akciu
}
//alebo
if (a == false) {
//vykonaj akciu
}
Ale stačí ak to zapíšeme takto:
Kód: Vybrať všetko
if (a) { // nahrádza a == true
//vykonaj akciu
}
//alebo
if (!a) { // ! negácia (nerovnosť) nahrádza a != true, čo je vlastne to isté ako a == false
//vykonaj akciu
}
Ak ale potrebujeme kvôli niečomu neustále meniť hodnotu true a false v dákej funkcii, alebo premennej napr. pomocou tlačidla, môžeme to vyriešiť nasledovným zápisom.
Kód: Vybrať všetko
tlacitko.onPress = function():Void {
if (a) {
a = false;
} else {
a = true;
}
};
Vo funkcii, ktorú spustíme stlačením tlačidla, máme podmienku, ak sa premenná A rovná true tak ju prepni na hodnotu false, v opačnom prípade (ak sa premenná A rovná false) ju prepni na true. Takto môžeme prepínať stavy true/false (pravda/nepravda). Tento zápis je však na 4 riadky, tak prečo si ho neskrátiť? Áno, práve na toto nám slúži návratová hodnota negácie, ktorej zápis vyzerá strašne primitívne, ale je rovnako efektívny.
Kód: Vybrať všetko
tlacitko.onPress = function():Void {
a = !a;
};
Zápis a = !a znamená, že ak sa hodnota A rovná true prepne sa na hodnotu false, alebo ak sa hodnota A rovná false, prepne sa na hodnotu true, presne tak isto ako pri použití podmienky. Tento zápis sa dá použiť aj pri funkcii _visible a ostatných logických funkciách (_lockroot, _smooth, atď).
Čím môžeme jednoduchým klikaním na tlačidlo, zobrazovať a skrývať objekty. Na záver dodám, pre tých, ktorí si všimli, že som nikde nepoužil základnú premennú A , ktorej by som určil hodnotu false. To preto, lebo vo flashi existujú anonymné premenné, ktoré netreba dopredu definovať a v prípade anonymnej premennej typu Boolean, je jej základná hodnota vždy false.
Zabezpečenie aplikácie
Na túto tému sa už diskutuje dlhé roky a pravdou je, že neexistuje žiadna ochrana. Na úvod a v krátkosti, napíšem, že použitá grafika v aplikácii sa nedá ochrániť vôbec. Síce mňa osobne už napadla myšlienka, či neexistuje software, ktorý dokáže vektorovú grafiku použitú v aplikácii prekonvertovať do ActionScriptu, avšak som sa k ničomu takému nikdy nedopátral. Ochrániť, aj keď iba z časti sa dá iba ActionScript, na čo bolo vyvinutých veľa aplikácií ale väčšinu z nich, dokonca aj najlepšiu aplikáciu aká na trhu dlho bola (amayeta SWF encrypt), sa podarilo nabúrať. Viac som sa na túto tému rozpísal
tu.
Akákoľvek reprodukcia ľubovoľnej časti článku, nie je bez písomného súhlasu autora dovolená.