Treball amb matrius (II)  
 
 
  En aquesta pràctica, es continuarà desenvolupant el programa de la pràctica anterior. Ara que ja teniu creada l'estructura segmentària del cos del ninot, treballareu amb matrius per fer la gravació i la reproducció dels moviments.  
      
Desenvolupament de la pràctica
     
Flash utilitza un objecte per crear el que s'anomenen matrius. La forma de crear aquest objecte és: nom = new Array(); on la paraula nom és el nom de la matriu nova.  
      
  » Recupereu la pel·lícula de la pràctica anterior anomenada cos.fla.  
      
  » Inseriu al fotograma clau de la pel·lícula principal el codi següent:  
      
 

acoscap = new Array();

acap= new Array();

 
      
  Amb aquesta acció, Flash crea dues matrius noves anomenades acoscap i acap. S'han anomenat amb aquests noms perquè es refereixen als clips de pel·lícula coscap i cap, respectivament. Recordeu que el nom coscap correspon al nom de la instància del clip de pel·lícula que engloba el cap, les extremitats superiors i el tronc del ninot. Aquestes matrius us serviran per enregistrar els valors de les rotacions.  
      
» Inseriu, també, en aquest lloc de la pel·lícula principal, el codi següent:
  

_root.gravacio = 0;
_root.anima = 0;
_root.rotacoscap = 0;

      
 

Amb aquest codi que heu afegit, heu creat i inicialitzat tres variables. La primera s'utilitzarà per activar o desactivar la gravació, la segona (_root.anima) us servirà per reproduir l'animació, i la tercera _root.rotacoscap per decidir en quin sentit ha de girar el segment del cos escollit per l'usuari/ària.

 
      
  A continuació, creeu una funció per efectuar la gravació dels moviments.  
      
  » Afegiu aquest codi al final de l'anterior:  
    

 

 

function grava () {
if (_root.gravacio == 1) {
_root.acoscap.push(_root.tot.coscap._rotation);
_root.acap.push(_root.tot.coscap.cap._rotation);
}
}

 
  
  La funció que acabeu de crear primer comprova si la gravació està activada, i després afegeix a cada matriu el valor de la propietat _rotation.
     
  Observeu que heu aplicat un mètode nou a les matrius acoscap i acap. Es tracta del mètode push. Aquest mètode afegeix un valor al final d'una matriu. S'ha d'aclarir que el primer valor d'una matriu té l'índex 0. Recordeu que una matriu és una col·lecció de dades indexades numèricament, és a dir, un conjunt de variables amb el mateix nom, ordenades amb un nombre que serveix d'índex.  
      
  Necessiteu, també, crear una funció per reproduir l'animació.  
      
  » Afegiu aquest codi al final de l'anterior:  
      
 

root.j = 0;
function reproduccio () {

if (_root.anima == 1) {
_root.tot.coscap._rotation = _root.acoscap[_root.j];
_root.tot.coscap.cap._rotation = _root.acap[_root.j];
_root.j++;
}

}

 
      
  Observeu que, a la primera línia, s'ha inicialitzat la variable _root.j. En aquesta variable, s'enregistra un nombre que fa d'índex de la matriu, així, en l'acció _root.acoscap[_root.j], si ens referim al primer element, equival a _root.acoscap[0].  
      
  Per finalitzar la funció, s'incrementa aquest índex en una unitat i, d'aquesta forma, aquesta funció pot assignar, a la propietat _rotation de cadascun dels clips de pel·lícula, els valors enregistrats prèviament a les matrius per a la funció grava().  
  
  Però ara us preguntareu quan es produirà aquesta gravació i reproducció, ja que, de moment, no s'han executat aquestes funcions. Segurament, ja teniu la resposta al cap: necessiteu incloure aquestes funcions en una incidència, i com ja esteu pensant, és la incidència enterFrame la més adequada.  
  
    » Creeu un clip de pel·lícula nou com a contenidor del codi que ara entrareu.  
      
  » Inseriu el codi següent:  
      
 

onClipEvent (enterFrame) {

_root.reproduccio();

if (_root.rotacoscap == 1) {
_root.nom._rotation -= 6;
_root.grava();
}

if (_root.rotacoscap == -1) {
_root.nom._rotation += 6;
_root.grava();
}

}

 
       
  Si estudieu el codi anterior, esbrinareu com funciona el motor principal de gravació i reproducció, dotze vegades per segon es produeix la reproducció en el cas que la variable anima estigui activada.  
      
  En el cas de la gravació, aquesta es produirà també dotze vegades per segon, però amb dues condicions: la primera és que estigui activada la variable gravacio, i la segona és que la variable rotacoscap tingui assignat el valor 1 o el -1. Recordeu que aquests valors determinen el sentit de la rotació, i si aquesta variable té el valor igual a 0, vol dir que no hi ha rotació.  
      
  Us preguntareu, també, què significa la variable nom. Aquesta variable serveix per enregistrar la part del cos que l'usuari/ària ha escollit. Recordeu que, en el programa, l'usuari/ària primer activa la gravació i després fa clic a la part del cos on desitja aplicar l'animació.  
       
  » Una solució per controlar quina part del cos ha escollit l'usuari/ària és programar una incidència mouseUp amb aquest codi:  
      
 

onClipEvent (mouseUp) {

if (_root.tot.coscap.hitTest(_root._xmouse, _root._ymouse, true)) {
_root.nom = _root.tot.coscap;
}
if (_root.tot.coscap.cap.hitTest(_root._xmouse, _root._ymouse, true)) {
_root.nom = _root.tot.coscap.cap;
}

}

 
       
  Observeu com s'utilitza la variable nom per emmagatzemar el nom del clip de pel·lícula on l'usuari/ària ha fet clic amb el ratolí.  
       
 

Per finalitzar, necessiteu crear els botons amb el codi necessari per fer aquests funcions:

      1. Activar la gravació
      2. Activar la reproducció
      3. Activar la rotació a la dreta
      4. Activar la rotació a l'esquerra
 
  » Ara se us demana finalitzar aquest treball, ja que us servirà, també, per fer la pràctica d'aquest mòdul.  
  
» Deseu aquesta pràctica amb el mateix nom.