mercoledì 1 ottobre 2014

Usare accelerometri o giroscopi dei cellulari o tablet

Il seguente post è funziona sia per Android sia per iOS, impareremo a sfruttare i sensori del nostro dispositivo (cellulare o tablet) per creare un semplice passatempo.
Creiamo un nuovo programma e inseriamoci:
  • tre campi testo: px, py e pz
  • un'immagine di una sfera, che chiameremo ball
  • uno slider che chiameremo scrollbar
Più o meno l'aspetto che cerchiamo sarà questo:

Ora inseriamo il seguente codice nella card corrente:


on openCard
   if the environment is "mobile" then
      mobileEnableAccelerometer 20      
      set the width of scrollbar "scrollbar" to the width of me
      set the bottom of scrollbar "scrollbar" to the bottom of me
      set the left of scrollbar "scrollbar" to the left of me
   end if
end openCard

on closeCard
   if the environment is "mobile" then
      mobileDisableAccelerometer
   end if
end closeCard

on accelerationChanged pX, pY, pZ
   put "Asse X: " & pX into field "px"
   put "Asse Y: " & pY into field "py"
   put "Asse Z: " & pZ into field "pz"   
   put the loc of image "ball" into theLoc
   put the thumbPos of scrollbar "scrollbar" into kSensitivity
   add (- pX * kSensitivity) to item 1 of theLoc
   subtract (- pY * kSensitivity) from item 2 of theLoc   
   lock screen
   set the loc of image "ball" to theLoc
   if the left of image "ball" < 0 then set the left of image "ball" to 0
   if the top of image "ball" < 0 then set the top of image "ball" to 0
   if the bottom of image "ball" > the bottom of me then set the bottom of image "ball" to the bottom of me
   if the right of image "ball" > the right of me then set the right of image "ball" to the right of me
   unlock screen
end accelerationChanged

on arrowkey tKey
   switch tKey
      case "up"
         send "accelerationChanged 0,-1,0" to me
         break
      case "down"
         send "accelerationChanged 0, 1,0" to me
         break
      case "left"
         send "accelerationChanged 1,0,0" to me
         break
      case "right"
         send "accelerationChanged -1,0,0" to me
         break         
   end switch
end arrowkey

Finito. Più sotto spiego il codice. Si poteva ottenere lo stesso risultato con molte meno righe di codice, ma così è più "educativo".
Ora abbiamo una sfera che si muove seguendo l'inclinazione del cellulare, lo slider serve a decidere la velocità della sfera.
Il risultato è scaricabile da: http://www.maxvessi.net/livecode/public/ball.livecode

Nel codice ho scritte parecchie cose, alcune vanno oltre quello che volevo trattare in questo posto, quindi le spiego qui per bene passo dopo passo:

OpenCard
Qui c'è un controllo per vedere se siete su un cellulare o un PC, in questo modo evitate messaggi di errore dovuti al fatto che non trova i sensori del cellulare quando lo usate su un PC.
Se siete su un cellulare accende i sensori, con il comando mobileEnableAccelerometer, controllandoli ogni 20 millisecondi.
Inoltre posiziona lo slider in basso in modo da essere largo quanto tutta la larghezza dello schermo. Potevo anche utilizzare altre tecniche con un solo comando.

CloseCard
Qui spengo i sensori quando l'utente chiude l'applicazione. Forse gli fate risparmiare un po' di batteria.

AccelerationChanged
Questo messaggio legge i sensori. Qui prendo i dati dei sensori, che sono i valori di inclinazione dei tre assi (pX,pY,pZ) e li metto nei tre campi di testo presenti. In questo modo vedo se i sensori funzionano correttamente.
Poi uso i valori pX e pY per spostare la palla, mettendo tutta una serie di condizioni per evitare anche che esca fuori dallo schermo. Uso lock screen e unlock screen per non far vedere all'utente gli aggiustamenti della palla che compio per non farla uscire dallo schermo. Anche qui potevo prima calcolare meglio la posizione e poi impostare il loc, ma così è più semplice da leggere.
Lo scrollbar serve per regolare la sensibilità, cioè la velocità dello spostamento della palla, più è alto il valore dello scroller, più la palla andrà veloce.

ArrowKey
Questo non serve per il cellulare, l'ho aggiunto per poter muovere la palla sul PC utilizzando i tasti freccia. Assolutamente superfluo.

Se avete altre domande, potete chiederle nei commenti sotto al post.