Distància entre clips i creació de mètodes universals i objectes  
 
 
 

A la primera pràctica d'aquest mòdul, heu vist l'aplicació matemàtica del teorema de Pitàgores per calcular distàncies (mesura de catets i hipotenusa). En aquesta pràctica, utilitzant aquest mateix teorema, podreu veure com podeu crear aplicacions on es pugui necessitar saber en qualsevol moment la distància entre dos clips de pel·lícula. A més a més, creareu unes funcions que us permetran utilitzar-les com a mètodes que qualsevol clip de pel·lícula prendrà com a seus. Es pot dir que serà una funció que desenvoluparà la tasca d'un mètode universal (prototype) per a qualsevol clip de pel·lícula.

A la mateixa pràctica, també veureu com podeu crear objectes definits pel programador amb Flash.

 
      
  En acabar la pràctica, qualsevol programador veurà la importància d'aquesta pràctica on, una vegada es domini la creació de mètodes que serviran per a qualsevol clip i creació d'objectes que poden utilitzar aquest mètodes, extrapolant aquestes accions, podeu arribar a crear el vostre propi llenguatge o dotar de més potència l'ActionScrip.  
  
  
 Desenvolupament de la pràctica  
    
  

» Creeu dos clips de pel·lícula a partir de dos dibuixos i els poseu com a nom d'instància respectivament: p1 i p2.

» Creeu, també, un quadre de text dinàmic amb la variable b per poder visualitzar les dades de la distància entre els dos clips creats.

    
» Inseriu dins cada clip de pel·lícula un botó.
  
» Programeu cada botó perquè es pugui arrossegar per l'escenari.  
      
  Assegureu-vos que els dos clips tinguin el punt de registre just al centre geomètric de la figura que formi el clip, és a dir, amb les coordenades (0, 0) del clip (no de l'escenari).  
      
 

» A aquest efecte, podeu utilitzar el tauler Propiedades de cada clip on, de forma fàcil, podeu modificar les coordenades i la mida, i on podeu ubicar el punt de registre.

 
      
  » Feu doble clic al fotograma clau de la pel·lícula principal per inserir el codi següent:  
      
  Movieclip.prototype.distancia=function(movieclip) {

if(typeof(movieclip) == "string");{
movieclip=eval(movieclip);}
var objecte1=new Object();
objecte1.distx=movieclip._x-_x;
objecte1.disty=movieclip._y-_y;
objecte1.distancia=Math.sqrt((objecte1.distx*objecte1.distx)+
(objecte1.disty*objecte1.disty));
return objecte1.distancia;

}

stop();

 
      
Amb aquest codi, s'aconsegueix crear el mètode distància, que us permetrà utilitzar-lo per a qualsevol clip de pel·lícula que tingueu a l'escenari.

En la primera línia de codi, feu que el movieclip al qual se li aplicarà el mètode distancia creat per la funció prototype, obtingui el resultat de la funció amb el paràmetre que li heu introduït, que és l'altre movieclip.

Es posa la condició que, si el paràmetre que es passa a la funció és del tipus string (cadena), aleshores s'avaluï aquesta entrada i s'assigni aquest nom a la variable movieclip de la mateixa funció.

Després d'aquesta condició, s'assigna a la variable local objecte1 la creació d'un objecte nou: (var objecte1=new Object();)

A les dues línies de codi següents a la creació de l'objecte1, es creen les propietatsdistx, disty amb els valors de les diferències de les seves coordenades i les del clip que entra com a paràmetre.

Es crea, també, la propietat distancia que, utilitzant el teorema de Pitàgores, en calcula el valor. Recordeu de la pràctica anterior que la funció Math.sqrt() calcula l'arrel quadrada. Com a final de la funció, es retorna l'objecte i la seva propietat distancia calculada.

      
  » Perquè es pugui fer la tasca de comprovació de la distància entre els dos clips que es poden arrossegar per l'escenari, creeu un altre clip de pel·lícula fora de l'escenari amb al nom d'instància accions i inseriu-li aquesta incidència:  
       
 

onClipEvent (enterFrame) {
_root.b = _root.p1.distancia(_root.p2);
}

 
  
 

Podeu esbrinar que aquest codi s'executa cada vegada que entri el marc, i posa en la variable b del quadre de text dinàmic la distància que hi ha entre el clip p1 que s'arrossega i el segon clip p2 que entra com a paràmetre.

Recordeu, també, que distancia és ja un mètode que es pot utilitzar en qualsevol clip de pel·lícula que heu creat prèviament.

 
      
  Podeu fer proves amb altres clips i buscar aplicacions possibles on conèixer que la distància és un element essencial.  
       

» Per continuar, creeu una funció prototype nova que us servirà per crear un nou mètode aplicable a qualsevol clip, i la seva funció serà crear un moviment dirigit a unes coordenades específiques, però aquest moviment serà un moviment "elàstic".

Es pot dir que un moviment elàstic no té sempre la mateixa velocitat i fa la sensació òptica de ser elàstic. En el nostre exemple, la velocitat del clip dependrà de la distància que resti de l'objectiu o meta final. A menor distància, la velocitat anirà disminuint.

» Inseriu el codi següent al fotograma de la pel·lícula principal:

  

Movieclip.prototype.movielastic = function(velo,fix,fiy){
var dista_x,dista_y,velo_x,velo_y;
velo = "."+velo;
dista_x = Math.round(fix - _x);
dista_y = Math.round(fiy - _y);
velo_x = dista_x * velo;
velo_y = dista_y * velo;
_x += velo_x;
_y += velo_y;
}

       
 

Si observeu el codi, us adonareu que es tracta d'una funció amb tres paràmetres que corresponen, respectivament, a la velocitat, la coordenada X final i la coordenada Y final on el clip s'ha de dirigir en el seu moviment.

La velocitat serà, en principi, un nombre enter que la funció converteix en decimal. Observeu que, si es crida a la funció amb una velocitat de 10, aquesta la converteix en 0.10 amb l'acció velo="."+velo;

També s'utilitza el mètode round de l'objecte Math per treure la part decimal quan es calcula la distància entre les coordenades dels dos clips de pel·lícula.

Finalment, es crea el tipus de velocitat perquè el moviment sigui elàstic. En aquest cas, es multiplica la distància (dista_x, dista_y) que hi ha entre els dos clips per la velocitat inicial velo.

 
      
Una vegada que ja teniu creada la funció, es tracta d'aplicar-la a un clip de pel·lícula. En el nostre exemple, podeu aplicar aquesta funció al clip que té com a nom d'instància p1.
  
» Inseriu el codi següent a la incidència enterFrame:
  
 

onClipEvent (enterFrame) {
_root.b = _root.p1.distancia(_root.p2);

_root.p1.movielastic(10, _root.p2._x, _root.p2._y);
}

 
 
 
 
 
    
» Proveu el programa arrossegant cada un dels clips de pel·lícula per comprovar-ne el resultat.  
    
  Si us hi fixeu, el clip de pel·lícula p1 no s'orienta (la seva rotació) cap al p2. Per aconseguir això, s'hauria d'aplicar alguna de les funcions trigonomètriques que en la propera pràctica estudiareu.  
      
     
     
   disty = eval("_root.menjar"+_root.n)._y-_root.objeto._y;
distx = eval("_root.menjar"+_root.n)._x-_root.objeto._x;
_root.gir = Math.atan2(disty, distx)*180/(Math.PI);
_root.objeto._rotation = _root.gir;
_root.objeto._x = _root.objeto._x+Math.cos(Math.PI/180*_root.objeto._rotation)*random(13);
_root.objeto._y = _root.objeto._y+Math.sin(Math.PI/180*_root.objeto._rotation)*random(13);