|
Cel mai des intalnite tipuri de miscari ale MovieClipurilor, miscari realizate prin intermediul ActionScriptului, sunt cele de miscare incetinita si cele de miscare elastica.
Principiul de functionare a miscarii incetinite este unul destul de simplu: de fiecare data obiectul este mutat la o distanta mai mica fata de punctul final. De exemplu daca obiectul se afla la 100 de puncte fata de punctul final, in primul pas va fi mutat la 50 de puncte, apoi la 25 de puncte, 12 puncte etc. Cu alte cuvinte obiectul este mereu mutat la o distanta egala cu jumatatea distantei ramase pana la punctul final. Teoretic obiectul nu va ajunge niciodata in punctul final dar practic (din cauza ca la un moment dat zecimalele sunt ignorate), Flash-ul nu va mai putea distinge intre punctul final si cel actual. Atunci putem considera ca obiectul a ajuns la destinatie.
Functia de deplasare incetinita o vom numi „smoothMove” pentru a fi in concordanta cu celelalte functii asociate MovieClip-urilor si vom adauga aceasta functie clasei MovieClip asa cum am facut si in cazul curbei bezier. De mentionat este totusi ca aceasta functie va distruge orice functie asociata evenimentului onEnterFrame asociata in prealabil obiectului.
Asadar functia de miscare incetinita este urmatoarea:
MovieClip.prototype.smoothMove = function (x, y, factor){
this.onEnterFrame = function(){
difx = (x-this._x)/factor;
dify = (y-this._y)/factor;
this._x += difx;
this._y += dify;
if (difx+dify == 0){
this.onEnterFrame = null;
}
};
};
Se creeaza o functie care va trata evenimentul intrarii intr-un cadru care are rolul de a calcula distanta la care trebuie repozitionat obiectul – difx, dify (in exemplul dat factorul era 2 deoarece distanta se injumatatea; este preferabil sa utilizati un factor mai mare). In continuare este adaugata pozitiei actuale diferenta calculata si functia este eliminata (this.onEnterFrame = null;) atunci cand diferentele devin ambele nule (deci si suma lor este 0).
Miscarea elastica difera cu putin fata de cea incetinita, principiul de baza fiind acelasi. In miscarea incetinita pozitionam obiectul la o pozitie intermediara intre pozitia anterioara si cea finala. De aceasta data pozitia la care vom pozitiona obiectul este pe linia formata de pozitia curenta si cea finala dar de fiecare data obiectul va fi situat dupa punctul final - evident de fiecare data la o distanta din ce in ce mai mica. Aceasta logica este aplicata atat pe axa oX cat si pe oY.
MovieClip.prototype.elasticMove = function(pozx,pozy,accx,accy,frecare){
vitezax = 0;
vitezay = 0;
this.onEnterFrame = function(){
vitezax += (pozx - this._x)*accx;
vitezax *= frecare;
this._x += vitezax;
vitezay += (pozy – this._y)*accy;
vitezay *= frecare;
this._y += vitezay;
if((Math.abs(vitezax) < 0.3) && (Math.abs(vitezay) < 0.3)){
this.onEnterFrame = null;
}
};
};
Functia de miscare elastica are ca parametri de intrare coordonatele x si y ale pozitiei finale, acceleratia pe cele doua axe si un factor de frecare. Pentru ca miscarea sa aiba o finalitate (obiectul sa ajunga in pozitia x,y si sa se opreasca acolo) trebuie ca macar unu dintre parametri acceleratie sau frecare sa fie subunitar – altfel distanta dintre pozitia obiectului si cea finala nu se va micsora niciodata ci dimpotriva se va mari.
In mod asemanator putem defini o miscare de scalare elastica:
MovieClip.prototype.elasticScale = function (procent_marire, acc, frecare){
Viteza = 0;
this.onEnterFrame = function(){
viteza += (procent_marire - this._xscale)*acc;
viteza *= frecare;
this._xscale = this._yscale += viteza;
if(Math.abs(viteza) < 0.3){
this.onEnterFrame = null;
}
};
};
Si de aceasta data trebuie sa aveti grija ca valorile acceleratiei si a frecarii sa fie subunitare.
|