ActionScript (Slika desno) predstavlja spisak akcija u Flashu 4 kojima je bilo moguće uticati na tok filma. Akcije su se pridruživale određenom frejmu ili događaju nad simbolom tipa dugme. Iz spiska se vidi da su mogućnosti programiranja pre svega bile orijentisane na upravljanje tokom filma (zaustavljanje, kretanje, skokovi na određene frejmove), uz skromno prisustvo komandnih struktura, naredbe grananja i loop petlje. Naredba Call imala je za zadatak poziv bloka komandi pridruženih nekom frejmu, simulirajući na taj način korisničku funkciju. Ovakav pristup sigurno da nije omogućavao komotan rad s programerske tačke gledišta, ali je doveo do pomeranja sa akcenta programa sa animacije ka interakciji, što je za rezultat imalo pojavu šireg spektra aplikacija rađenih u Flashu.[1]

Spisak akcija u Flashu

Peta verzija programa predstavlja kvalitativni pomak u pravcu programiranja, odlučeno je da Flash postane ozbiljan alat za programiranje. U Flashu se pojavljuje ActionScript.

ActionScript je skript jezik čiji je cilj kontrola objekata u Flash filmovima, kreiranje navigacionih i interaktivnih elemenata, i za kreiranje filmova visokog stepena interakcije i web aplikacija.

Script jezik

уреди

Skript jezik je programski jezik koji se koristi za manipulaciju, prilagođenje i automatizaciju postojećeg sistema. U takvim sistemima, funkcionalnost je već obezbeđena putem korisničkog interfejsa, a skript jezik predstavlja mehanizam za proširenje funkcionasti programskom kontrolom. Za postojeći sistem se kaže da obezbeđuje domaćinsko okruženje za objekte i mogućnosti koje kontroliše skript jezik.

Asocijacija evropskih proizvođača kompjutera (ECMA[2] – the European Computers Manufacturers Association, www.ecma.ch) sastavila je dokument pod nazivom ECMA-262 čiji je cilj standardizacija jezika JavaScript. ActionScript zasniva se na specifikaciji ovog dokumenta. -:- https://web.archive.org/web/20140606181403/http://www.ecma.ch/ecma1/STAND/ecma-262.htm

Elementi jezika

уреди

Sintaksa ActionScripta podseća na Javu. Razlika je u tome što jezik upućuje na jednostavnost u korišćenju. Na primer, promenjiva ne mora da ima deklarisan tip niti se tipovi povezuju sa osobinama objekta, a definisane funkcije ne moraju biti deklarisane u tekstu pre njihovog poziva.

ActionScript se zasniva na objektima: osnovni jezik i okruženje Flasha obezbeđuju se putem objekata, a sam program u ActionScriptu je put komunikaciji među objektima. Sam objekat je kolekcija osobina (properties) koje mogu imati atribute koji određuju način korišćenja osobine (na primer – ReadOnly). Osobine su kontejneri koji sadržavaju druge objekte, primitivne vrednosti ili metode. Objekat u ovom smislu predstavlja referencu na objekat, primitivna vrednost je vrednost nekog primitivnog tipa podataka, a metod je funkcija koja se s objektom povezuje putem osobine.

ActionScript 2.0

уреди

ActionScript 2.0 uveden je u septembru 2003god. sa izdavanjem Flash MKS 2004 i njegovog odgovarajućeg plejera, Flash Player 7. Sa ActionScript 2.0 , programeri mogu da ograniče promenljive na određeni tip, neusklađenosti i greške mogu se naći prilikom kompajliranja. ActionScript 2.0 je takođe predstavio class-based sintaksu, tako da su programeri u mogućnosti da kreiraju klase i interfejse. Ova verzija vlada delimično na ECMAScript. Četvrto izdanje draft specifikacije .

Tipovi podataka i promenljive

уреди

Tip podataka predstavlja vrstu informacije koju promenljiva ili element ActionScripta može da sadrži. Tipovi podataka dele se na primitivne i referentne tipove, a postoje i specijalni tipovi podataka.

  • Primitivni tipovi su string, number i boolean
  • Referentni tipovi su object, function i movieClip
  • Specijalni tipovi podataka: null i Undefined

Referentni tipovi kao vrednost imaju adresu svog sadržaja. Tip movieClip je grafička reprezentacija elemenata Flasha.

var myVar;
trace (“typeof (myVar): ” + typeof (myVar)); // undefined
myVar = true;
trace (“typeof (myVar): ” + typeof (myVar)); // boolean
myVar = 0;
trace (“typeof (myVar): ” + typeof (myVar)); // number
myVar = “my String”;
trace (“typeof (myVar): ” + typeof (myVar)); // string
myVar = new Array ();
trace (“typeof (myVar): ” + typeof (myVar)); // object
myVar = trace;
trace (“typeof (myVar): ” + typeof (myVar)); // function
myVar (“typeof (myVar): ” + typeof (myVar)); // function


Promenljiva se može deklarisati sa var. Deklaracija određuje njeno ime i lokalnost, odnosno promenljiva tada postaje lokalna u bloku u kome je deklarisana. U navedenom primeru korištene su funkcije trace, koja služi za ispis string vrednosti izraza svog argumenta u posebni izlazni prozor (korisno pri testiranju programa), i typeof, koja vraća naziv tipa izraza svog argumenta. Dvostruka kosa crta (//) predstavlja početak linijskog komentara, pri interpretaciji se ignorišu svi karakteri u liniji nakon ove oznake (komentar u više linija postavlja se između oznaka /* i */). Prvi poziv funkcije trace u izlazni prozor ispisuje “typeof (myVar): undefined” jer promenljivoj nije dodeljena vrednost, tako da joj nije određen ni tip. Dodela vrednosti određuje tip promenljive. To znači da promenljiva može da menja svoj tip. U primeru, poslednjom dodelom (myVar = trace) je promenljivoj dodeljena funkcija trace, znači ona je tipa function, ona postaje funkcija koja se ponaša na isti način kao i trace, tako da poslednja linija poziva promenljivu myVar kao funkciju i dobija se takođe odziv u izlaznom prozoru.

Promenljiva se ne mora deklarisati. U tom slučaju smatra se za globalnu.

ActionScript vrši automatsku konverziju tipova pri izvođenju operacija, tako da nedefinisane promenljive mogu učestvovati u operacijama, gde se prevode kao neutralni element sabiranja (logičko – false, numerički – 0, string – “”).

Operatori

уреди

ActionScript definiše skup ugrađenih operatora koji se mogu podeliti u sledeće grupe: numerički operatori, operatori poređenja, String operatori, logički operatori, bit-orijentisani operatori, operatori jednakosti i operatori dodele. Kao i u drugim programskim jezicima, operatori su hijerarhijski određeni po prioritetu izvršavanja operacija.

Zanimljivi operatori su, recimo, operatori dodele, što ilustruje sledeći primer:
var myString = “my”;
myString += “ String”;
trace (“myString: “ + myString); // “myString: my String”
Prva linija deklariše promenljivu myString i dodeljuje mu (“obična” dodela) String vrednost “my”. U drugoj linija koda takođe je dodela, ali sa operatorom +=, što semantički predstavlja sledeće: saberi vrednost operanda s leve strane operatora (promenljivu myString) sa operandom s desne strane (“ String”) i rezultat sabiranja dodeli promenljivoj s leve strane.

Drugi primer ilustruje operatore inkrementacije (++):
var myVar = 0;
trace (“myVar: “ + myVar); // “myVar: 0“
trace (“myVar++: “ + myVar++); // “myVar++: 0“
trace (“myVar: “ + myVar); // “myVar: 1“
trace (“++myVar: “ + ++myVar); // “++myVar: 2“
trace (“myVar: “ + myVar); // “myVar: 2“
Post-inkrementacija povećava vrednost promenljive nakon njenog učestvovanja u izrazu, a pre-inkrementacija prvo povećava vrednost promenljive koja daje svoju novu vrednost za izračunavanje izraza.

Treći primer, uslovna dodela:
var myBool = true;
var notBool = !myBool;
trace (“myBool: “ + ((myBool) ? myBool : notBool));
trace (“notBool: “ + ((notBool) ? myBool : notBool));
Uslovna dodela je ternarni operator. Prvi operand je logički izraz koji se izračunava. Ako je izračunao true, operator računa vrednost drugog operanda (iza znaka pitanja) i to vraća kao rezultat, inače (izračunato false) se računa vrednost trećeg operanda (iza dvotačke) i to postaje rezultat. U ovom primeru prvi poziv trace ispisuje “myBool: true”, jer se ispituje uslov myBool (true) i vraća vrednost drugog operanda (myBool ima vrednost true), dok drugi poziv ispisuje “notBool: false” jer je uslov netačan (notBool, pri dodeli je !myBool, negacija od true) pa se vraća vrednost trećeg operanda (notBool je false).

Grananje i petlje

уреди

Naredba if u ActionScriptu ima sledeću sintaksu:

if (condition) {

     //    statements

} else {

     //    statements

}
Ovde je condition logički izraz, obavezno naveden u zagradama, na osnovu kojeg se donosi odluka da li se izvršava kod bloka naredbi unutar vitričastih zagrada. Blok naredbi se uvek navodi unutar vitričastih zagrada, a pojedine naredbe u bloku razdvajaju se tačka-zarezom (;). U slučaju samo jedne naredbe nije neophodno navođenje vitričastih zagrada. Druga grana (else) takođe nije obavezna. U ActionScriptu kod Flasha 5 ne postoji switch naredba za višestruko grananje, a to je jedna od novina koje donosi nova verzija programa, Flash MX[3].

Ponavljanje dela koda obezbeđeno je petljama for, while, do-while i for-in. U svim petljama mogu se koristiti komande continue, za skok na sledeću iteraciju, i break, za napuštanje petlje.

for (init; condition; next) {

     //    statements

}
Slično kao i u jeziku Java, for petlja zadaje se s tri parametra: inicijalna vrednost kontrolne promenljive, izlazni uslov i izraz za izračunavanje pre naredne iteracije. Po definiciji je dozvoljeno izostavljanje bilo kog od ova tri dela (ostaje tačka-zarez). Izraz init se izračunava samo jednom, pre početka prve iteracije, izraz condition mora biti logički i izračunava se pre svake iteracije i odlučuje da li se nastavlja sa iteracijom (izračunato true) ili ne (false), izraz next izračunava se na kraju svake iteracije. Ovakva konstrukcija dozvoljava mnogo veću slobodu pri baratanju petljom u odnosu na, recimo, paskaloliku konstrukciju. Ipak, uobičajeno se koristi baš simulacija te osnovne konstrukcije, postavljanjem inicijalne vrednosti kontrolne promenljive u prvom delu, poređenje kontrolne promenljive s nekom izlaznom vrednošću u drugom delu i inkrementiranje ili dekrementiranje kontrolne promenljive u trećem delu.

while (condition) {

     //    statements

}
Dogod je uslov condition ispunjen izvršava se blok naredbi petlje while. Ovo ispitivanje može biti i numeričko, u kom slučaju se ispituje različitost od vrednosti 0.

do {

     //    statements

} while (condition)
Slično je i kod petlje do-while, s razlikom što se prvo izvršava blok naredbi, pa tek onda proverava uslov (što znači, kod bloka izvršava se bar jednom). Ovo podseća na paskalsko repeat-until, a razlika je kod uslova – do-while radi dok je ispunjen uslov, a repeat-until prekida po ispunjenju uslova.

for (variableiterant in object){

     //    statements

}
Petlja for-in koristi se osobinama objekta. Primer:

myObject = {name:'Tara', age:27, city:'San Francisco'};
for (name in myObject) {

     trace ("myObject." + name + " = " + myObject [name]);

}
Primer je iz rečnika ActionScripta 5. Izlaz izgleda ovako:

myObject.name = Tara
myObject.age = 27
myObject.city = San Francisco
Prva linija koda daje jedan način zadavanja objekta. Objekat myObject ima 3 osobine, svakoj je dodeljena određena vrednost. Promenljivoj name u for-in petlji pridružuju se imena osobina objekta myObject, redom kroz iteracije. Primer takođe prikazuje dva načina pristupa vrednostima osobina objekta. U izlaznom prozoru prikazan je prikaz referenciranja "tačkom", odnosno navodi se ime objekta, tačka i sledi ime osobine. To i jeste uobičajen način referenciranja, ali nije bilo moguće unutar for-in petlje pozvati myObject.name, jer bi se to odnosilo na osobinu name objekta, a ne promenljivu petlje. Stoga je korišćena referenca myObject [name], koja izračunava izraz u uglastim zagradama (vrednost promenljive name) i potom traži vrednost odgovarajuće osobine objekta.

Funkcije

уреди

Definicija funkcije:

function myFunc ([arg0, arg1,...argN]) {

     //    statements

}
// ili
function ([arg0, arg1,...argN]) {

     //    statements

}
Funkcija je blok koda koji se može više puta koristiti pozivom funkcije. Primer poziva bio bi myFunc ([par1, par2,...parN]). U zagradi ovde nalaze se parametri funkcije, koje ona pri izvršavanju ona prima kao argumente. Uglaste zagrade su u primeru navedene u smislu BNF notacije, odnosno ukazuju na opcionu pojavu parametara i argumenata. Funkcija ove parametre vidi kao vrednosne parametre, nema varijabilnih parametara, te se ne mogu menjati vrednosti ovih parametara van lokalnosti funkcije, uz dužnu pažnju referentnim podacima, gde se može direktno pristupati osobinama objekta, na primer.

Ulazne parametre funkcija vidi kao niz arguments, broj deklarisanih imenovanih parametara funkcije ne mora da se poklapa sa brojem argumenata koji se prosleđuju funkciji. Pristup imenovanim parametrima u funkciji moguć je direktno navođenjem imena parametra, a pristup proizvoljnom parametru ostvaruje se kao pristup elementu niza arguments na određenom indeksu. Primer:

function myFunc () {

     var myVar;
for (var i = 0; i < arguments.length; i++) { myVar += arguments [i]; } trace (“myVar: ” + myVar);

}
myFunc (3, 4, “to”, 1, 1); // “myVar: 7to11”
U primeru se lokalna promenjiva myVar samo deklariše, inicijalno nema vrednost, znači tipa je undefined. Prvo sabiranje je sa argumentom tipa number, pa se promenljiva konvertuje u vrednost 0, sabira sa 3 i dobija vrednost 3. Sabiranje sa drugim argumentom je sabiranje dva broja, pa myVar dobija vrednost 7. Treći argument je tipa string, što povlači konverziju myVar u string. Četvrti i peti argument su brojevi, ali se konvertuju u string. Tako myVar na kraju dobija vrednost "7to11".

Funkcija može da vrati vrednost korišćenjem naredbe return returnValue, ovde returnValue predstavlja izraz čiju vrednost funkcija vraća. Korišćenjem same naredbe return (bez izraza) samo se napušta funkcija. Naredba return je opciona u funkciji, a može se pojavljivati na više mesta u kodu funkcije (obično nakon ispunjenja nekog uslova), vraćajući različite vrednosti, čak i različitog tipa. Primer:

function returner (inputValue) {

     if (inputValue < 0) return;
     if (inputValue == 0) return false;
     if (inputValue == 1) return 0;
     if (inputValue == 2) return “”;
     if (inputValue == 3) return new Array ();
     if (inputValue == 4) return trace;

}
for (var i = -1; i < 6; i++) {

     trace (i + “: ” + typeof (returner (i)));

}
/* output:
-1: undefined
0: boolean
1: number
2: string
3: object
4: function
5: undefined
*/
Ovde je izbegnuto duboko ugnježđavanje if-else, jer se iz funkcije izlazi po prvom ispunjenju nekog uslova.

U ActionScriptu postoje predefinisane funkcije, a mogu se definisati i nove. Često se funkcija pridružuje nekom objektu, tada ona postaje metod objekta.

Objekat je skup osobina koje mogu imati vrednosti nekog tipa. Svaki objekat jedinstveno se identifikuje svojim imenom. Već pomenuti primer:

myObject = {name:'Tara', age:27, city:'San Francisco'};
Objekat myObject ima tri osobine i svakoj osobini dodeljena je vrednost. Pristup osobini age, na primer, može se ostvariti sa myObject.age ili myObject [“age”]. Dodavanje nove osobine moguće je: myObject.state = ‘California’, kao i modifikacija postojeće osobine: myObject.age = 28.

function person (name, age, city) {

     this.name = name;
     this.age = age;
     this.city = city;

}
myObject = new person (‘Tara’, 27, ‘San Francisco’);
Ovaj kod kao krajnji rezultat daje takođe objekat myObject sa potpuno istim osobinama i vrednostima osobina kao i prethodni primer. Razlika postoji. Sada je myObject instanca klase person, a funkcija person naziva se konstruktorom klase person. Objekat se instancira pozivanjem ključne reči new i konstruktora. Ključna reč this u konstruktoru referencira na objekat koji se kreira. Sledeći primer dodaje metod klasi person:

function showPerson () {

     var myString = this.name + “, “ + this.age + “, “ + this.city;
     trace (myString);

}
person.prototype.show = showPerson;
myObject.show (); // “Tara, 27, San Francisco”
Sve funkcije poseduju osobinu prototype koja se automatski kreira pri definiciji funkcije. Pri kreiranju novog objekta konstruktorom, sve osobine i metode konstruktorske osobine prototype postaju osobine i metode osobine __proto__ novokreiranog objekta. Kada se referencira neka osobina ili metoda objekta, ActionScript traži postoji li takva osobina ili metoda, ako ne postoji, traži se u okviru osobina i metoda njegovog __proto__ objekta (i dalje __proto__.__proto__, ...). Ovo je nasleđivanje u ActionScriptu. Uobičajena praksa je dodeljivanje metoda osobini prototype konstruktora, kao što i stoji u navedenom primeru.

ActionScript već dolazi sa dobrim skupom predefinisanih objekata.

Postoji skup ugrađenih objekata preuzetih iz ECMA specifikacije:

  • Object – najopštija klasa objekata
  • Array – niz, sa metodama manipulaciju nizom, dodavanje i uzimanje elementa niza sa početka ili kraja, sortiranje itd, osobina length je dužina niza...
  • String – metode za manipulaciju stringovima, podniz, konkatenacija...
  • Boolean
  • Number – konstante, najmanja i najveća vrednost, beskonačnost...
  • Math – aritmetičke i trigonometrijske funkcije, matematičke konstante...
  • Date – datum i vreme

Pored ovih, ugrađeni su i bitni objekti za Flashovo okruženje:

  • MovieClip – osobine od značaja za vizuelnu reprezentaciju objekta, širina, visina, horizontalna i vertikalna pozicija, vidljivost, providnost, rotacija...; metode za kontrolu osobina, za kretanje po vremenskoj osi, kreiranje i uništavanje instanci, prevlačenje objekata...
  • Selection – kontrola tekstualnih polja
  • Mouse – skrivanje i pokazivanje pokazivača miša
  • Key – konstante specijalnih tastera tastature, kodovi karaktera...
  • Color – transformacije boje MovieClip objekata...
  • Sound – kontrola zvuka i zvučnih efekata
  • XML – učitavanje, slanje, parsiranje, izgradnja XML dokumenata...
  • XMLSocket – stalna veza sa serverom, uspostavljanje i prekid veze...

U prvom primeru, pasijans, predstavljen je deo ponašanja koje se realizuje objektom movieClip, a treći primer, web memorija, predstavlja objekte XML i XMLSocket[4].

Programiranje u ActionScriptu

уреди

Programski elementi, akcije, u Flashovom filmu mogu se nalaziti na više mesta. Kako se film odvija po vremenskoj osi podeljenoj na frejmove, delovi koda mogu biti dodeljeni frejmovima. Taj kod izvršava se kada se film nađe na određenom frejmu. Pored toga, instance simbola tipa dugme takođe se mogu programirati za izvođenje određenih akcija pri pojavi nekog događaja, poput pritiska na dugme. Instance simbola tipa filmski klip takođe mogu reagovati na neke događaje ako im se pridruže potrebne akcije. Uz to, simbol tipa filmski klip je takođe film po svojoj definiciji, poseduje svoju vremensku osu, a može sadržavati i druge instance simbola tipa dugme ili filmski klip, pa se cela priča može ponoviti u kontekstu definicije simbola. Ovo daje mogućnost velike zbrke i raštrkavanja koda na sve moguće strane, što s druge strane onemogućava korektno praćenje toka filma, nalaženje grešaka, i slično. Stoga je preporuka držanje koda na manje mesta, pogotovo definicije promenljivih, funkcija i objekata, recimo u prvom frejmu filma ili definicije simbola, dok se za obradu događaja može samo navesti poziv već definisane funkcije ili metoda nekog objekta.

Događaji instanci simbola tipa dugme

уреди

Kod koji se pridružuje instanci simbola tipa dugme nalazi se u hendleru on:

on (mouseEvent) {

     //    statements

}
Za jedno instancu može se postaviti više hendlera, zavisno od događaja mouseEvent. Jedan hendler može opsluživati više događaja razdvojenih zarezom u zaglavlju hendlera. Kod pridružen hendleru izvršava se kada se desi neki od događaja navedenih u zaglavlju hendlera. Sledi opis događaja koje prepoznaje objekat tipa button:

  • press – dugme miša je pritisnuto dok je pokazivač iznad dugmeta
  • release – dugme miša je otpušteno dok je pokazivač iznad dugmeta
  • releaseOutside – dugme miša je otpušteno dok je pokazivač van dugmeta
  • rollOver – pokazivač miša kreće se iznad dugmeta
  • rollOut – pokazivač miša je napustio površinu dugmeta
  • dragOver – dok je pokazivač iznad dugmeta, dugme miša je pritisnuto, pokazivač pomeren van površine dugmeta i potom vraćen iznad
  • dragOut – dok je pokazivač iznad dugmeta, dugme miša je pritisnuto i potom pokazivač pomeren van površine dugmeta
  • keyPress (“key”) – taster key je pritisnut

Događaji instance simbola tipa filmski klip

уреди

Instanca simbola tipa filmski klip takođe reaguje na događaje.

onClipEvent (movieEvent) {

     //    statements

}
Ovde je movieEvent neki od sledećih događaja:

  • load – akcija se inicira instanciranjem objekta njegovom pojavom u vremenskoj osi
  • unload – akcija se inicira u prvom frejmu nakon uklanjanja objekta sa vremenske ose, a izvodi se pre bilo koje akcije vezane za posmatrani frejm
  • enterFrame – akcija se inicira pri svakom frejmu, a izvodi se nakon svih akcija vezanih za posmatrani frejm
  • mouseMove – akcija se inicira pri svakom pomeranju miša
  • mouseDown – akcija se inicira pritiskom na levo dugme miša
  • mouseUp – akcija se inicira otpuštanjem levog dugmeta miša
  • keyDown – akcija se inicira pritiskom na neki taster
  • keyUp – akcija se inicira otpuštanjem tastera
  • data – akcija se inicira prijemom podataka pri učitavanju

Vidi još

уреди

Spoljašnje veze

уреди

Reference

уреди