giovedì 17 luglio 2014

Muovere un'immagine

Abbiamo già visto come muovere un'immagine con il comando move relative in questo post; se per esempio noi vogliamo muovere un'immagine rispetto a dove guarda, le cose sono leggermenta più complicate.
Per esempio, immaginiamo didover fare un gioco dove bisogna muovee una macchina usando i tasti fraccia della tastiera e che va spostata relativamente a dove punta il muso della macchina, come nelle macchinine telecomandate.
Prima di tutto mettiamo l'immagine della macchina:
Per ruotarla basta cambiare la proprietà angle dell'immangine.
Finchè rimane in verticale è facile dare le coordinate per spostarla, ma se la inclinassimo di 45°, come dobbiamo scrivere il codice?
Conoscendo un minimo di trigonometria, per muoverla di 5 pixel alla volta, tutto il codice è il seguente:


on arrowkey puls   
   switch puls
      case "up"
         #dobbiamo muoverla in indietro rispetto al verso del muso
         #prendiamo l'angolo della direzione
         put the angle of image "car" into temp         
         #creaimo una strina del tipo x,y
         put -5 * sin( pi / 180 * temp) into movimento
         put "," after movimento
         put -5 * cos( pi / 180 * temp) after movimento
         move image "car" relative movimento      
         break         
      case "down"
         #dobbiamo muoverla in indietro rispetto al verso del muso
         #prendiamo l'angolo della direzione
         put the angle of image "car" into temp         
         #creaimo una strina del tipo x,y
         put 5 * sin( pi / 180 * temp) into movimento
         put "," after movimento
         put 5 * cos( pi / 180 * temp) after movimento
         move image "car" relative movimento      
         break         
      case "left"
         #ruotiamo a sinistra l'immagine
         put the angle of image "car" into temp
         add 1 to temp
         set the angle of image "car" to temp
         break               
      case "right"
         #ruotiamo a destra l'immagine
         put the angle of image "car" into temp
         add -1 to temp      
         set the angle of image "car" to temp
         break                        
   end switch
end arrowkey

Notate che non c'è bisogno di preoccuparsi se angle è più di 360° o meno di zero, livecode ritrasforma l'angolo correttamente. Anche per le coordinate relative non è un problema se non sono degli interi.
L'unica attenzione va fatta nelle funzioni seno e coseno, che accettano come input l'angolo in radianti, mentre l'angolo delle immagini è espresso in gradi. Per questo motivo c'è la motiplicazione per π/180 che fa da conversione.
Per chi è a digiuno di informatica ricordo che il sistema di riferimento X,Y delle finestre, in tutti i linguaggi di programmazione, ha:
  • l'origine nell'angolo in alto a sinistra
  • l'asse X punta verso destra
  • l'asse Y punta verso il basso
In Livecode, inoltre, l'angolo delle immagini parte da zero in alto e va in senso antiorario.
Per chiarezza ecco uno schema riassuntivo: