venerdì 30 gennaio 2015

Ruotare velocemente

Oggi vedremo come creare l'animazione di un oggetto che ruota velocemente. Questo è un argomento dove molto programmatori sono esperti nel codice, ma mancano di senso praticano e si impazziscono per raggiungere prestazioni inutili.
Prima di affrontare questo argomento dal punto di vista informatico, bisogna fare una premessa dal punto di vista tecnico, non ha senso cercare di essere realmente veloci, molte volte basta far sentire la velocità, magari. Inoltre gli schermi hanno una frequenza di aggiornamento di 60Hz, cioè ogni 0.017 secondi, ogni variazione sotto questo tempo è ignorata. Quindi basterà aumentare l'angolo di rotazione ad ogni aggiornamento, invece di aumentare il numero degli aggiornamenti, per avere l'effetto desiderato.
Fatta questa premessa, passiamo al codice.  Creiamo uno stack con un poligono, un pulsante e uno scroller che chiameremo angolo:
Per ruotarlo basta sfruttare la proprietà angle.
Scrivendo questo codice, possiamo ruotare il triangolo ad ogni fotogramma dell'angolo voluto:

on mouseUp
   if the label of me is "START" then
      set the label of me to "STOP"
      ruotafigura
   else
      set the label of me to "START"      
   end if  
end mouseUp

on ruotafigura
   if the label of me is "START" then
      exit ruotafigura
   end if
   put the thumbpos of scrollbar "angolo" into Dangolo
   put the angle of graphic 1 into curangolo
   put dangolo + curangolo into curangolo
   set the angle of graphic 1 to curangolo
   send ruotafigura to me in 0.017 sec #non ha senso scendere sotto questo valore
end ruotafigura

E questo è il risultato:
Notate come se la velocità supera quella del monitor, si creano strani effetti ottici stroboscopici  (ad esempio che sembra ruotare all'indietro), come nella realtà.