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 a calcular distàncias (mesura de catets i hipotenusa). En aquesta pràctica utilitzant aquest mateix teorema per a veure com podeu crear aplicacions on es puguin 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 pendrà com a seus. Podem dir que seria una funció que desenvoluparà la tasca d'un mètode universal (prototype) per a quasevol clip de pel·lícula. En la mateixa pràctica també veureu com podeu crear objectes definits pel programador en Flash. |
||
En acabar la pràctica quasevol programador veurà la importància d'aquesta pràctica on una vegada es domini la creació de mètodes que serviran per a qualevol clip i creació d'objectes que poden utilitzar aquest mètodes, extrapolant aquestes accions podeu arribar a crear el vostrepropi llenguatge o dotar de més potència a l'ActionScrip. | ||
Desenvolupament de la pràctica | ||
» Creeu dos clips de pel·lícula a partir de dos dibuixos i els hi poseu com a nom d'instància respectivament: p1 i p2. » Creeu també un quadre de text dinàmic amb la variable b per tal de poder visualitzar les dades de la distància entre els dos clips creats. |
||
» Inseriu dins de 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 tal efecte podeu utilitzar el plafó Info del menú Ventana/Paneles/Info 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 a inserir el següent codi: | ||
Movieclip.prototype.distancia=function(movieclip)
{
} 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 fem que el propi Movieclip al que se li aplicarà
el mètode distancia creat per la funció prototype,
obtingui el resultat de la funció amb el paràmete que li
hem introduït que és l'altre movieclip. |
||
Es posa la condició de que si el paràmetre que es passa a la funció és del tipus string (cadena), aleshores s'avalui aquesta entrada i s'assigni aquest nom a la variable movieclip de la pròpia funció. Després d'aquesta condició s'assigna a la variable local objecte1 la creació d'un nou objecte. (var objecte1=new Object();) A les dues línies de codi següents a la creació de l'objecte1 es creen les propietats: distx, disty amb els valors de les diferències de les seves cordenades 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 la funció Math.sqrt() calcula l'arrel quadrada. Com a final de la funció es retorna l'objecte i la seva propietat distancia calculada. |
||
» Per a que es pugui realitzar 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 aquest evento: | ||
|
||
Podeu esbrinar que aquest codi s'executa cada vegada que entri el frame i posa en la varible b del quadre de teext 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 quasevol clip de pel·lícula que heu creat prèviament. |
||
Podeu fer proves amb altres clips i buscar possibles aplicacions on conèixer la distància sigui un element essencial. | ||
» Per a continuar creareu una nova funció prototype que us servirà per a 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". Podem dir que un moviment elàstic no té sempre la mateixa velocitat i fa la sensació optica 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 següent codi al fotograma de la pel·lícula principal: |
||
|
||
Si observeu el codi us adonareu que es tracta d'una funció amb tres paràmetres que cooresponen 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. Oberveu 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 a 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 per a que 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ó, ara es tracta d'aplicar-la a un clip de pel·lícula. En el nostre exemple podem aplicar aquesta funció al clip que té com a nom d'instància p1. | ||
» Inseriu el següent codi al evento enterFrame: | ||
onClipEvent (enterFrame)
{ _root.p1.movielastic(10,
_root.p2._x, _root.p2._y); |
||
|
||
|
||
» Proveu el programa arrossegant cadascú dels clips de pel·lícula per comprovar el resultat del programa. | ||
Si us fixeu el clip de pel·lícula p1 no s'orienta (la seva rotació) cap el p2. Per aconsseguir això s'haria 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); |
||
|
||