L’accelerometro è uno dei componenti più importanti e di successo del nostro iPhone / iPod Touch (e presto iPad), ad oggi sfruttato in molte applicazioni e videogiochi presenti in App Store. Se vi accingete, infatti, a programmare giochi per iPhone, sicuramente non potete sottovalutare questo componente hardware. Per questo motivo, nel tutorial di oggi, vi guiderò all’uso (semplicissimo) di questo fantastico strumento creando una piccola applicazione che, sfruttando questo componente, vi permetterà di muovere una pallina a seconda dell’inclinazione che darete al vostro dispositivo mobile.

Iniziamo col progettare la nostra piccola applicazione, essendo essa molto semplice ci servirà:

  • un componente che ci dia l’inclinazione, quindi l’accelerometro. Classe: UIAccelerometer;
  • una classe che gestisca il movimento della pallina;
  • la pallina :)

Piccola nota: quasi mai si troverà un programma come Interface Builder che ti costruisce l’interfaccia grafica con il drag&drop quindi, in questo tutorial, creeremo la grafica via codice, il che è più divertente e molto più “dinamico” a mio parere.

Apriamo Xcode e creiamo un nuovo progetto “Window-Based Application”.

Iniziamo con una cosa banale, inseriamo l’immagine della nostra pallina.
Potete usare la mia, che trovate giusto qui sopra, oppure potete crearne una voi, molto più carina!
Inseriamola nella cartella “Resources”.



Creiamo la nostra classe per la gestione del movimento della pallina, quindi aggiungiamo una nuova classe nella cartella “Classes” figlia di UIViewController (quale classe migliore):



Iniziamo a scrivere nel file di intestazione .h (l’header)  i campi che ci serviranno: l’immagine della pallina e una variabile che ci servirà per impostare la sensibilità del nostro accelerometro:



Passiamo quindi al file di implementazione (.m) di questa classe. Notiamo molti metodi già costruiti per noi da Xcode, anche se gran parte di loro sono racchiusi in tag di commenti. Leggendo si può capire a cosa servano, nel nostro caso useremo il metodo -(void)loadView che viene chiamato non appena viene richiesto di visualizzare la view di questo UIViewCotroller. Eliminiamo quindi i tag di commento per questo metodo e scriviamo il codice per inizializzare la vista di questa nostra classe:

- (void)loadView {
	// creiamo l'immagine della pallina
	pallinaView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pallina.png"]];
 
	// creiamo la vista del nostro UIViewController
	UIView *controllerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
 
	// aggiungiamo la pallina alla nostra vista (di modo che sia visibile)
	[controllerView addSubview:pallinaView];
 
	// impostiamo la vista creata, come la vista di questo UIViewController
	[self setView:controllerView];
 
	// rilasciamo l'oggetto che ormai non ci serve più
	[controllerView release]; // notare che l'oggetto rimarrà "vivo" perchè il nostro controller ha fatto un "retain" quando abbiamo fatto "setView:"

Visto che abbiamo allocato la pallinaView e non rilasciata, ricordiamoci di farlo nel dealloc:

- (void)dealloc {
    [pallinaView release];
    [super dealloc];
}

La grafica è fatta! Molto semplice vero? Non è necessario scomodare Interface Builder.

Ora passiamo al cuore dell’applicazione: l’accelerometro! Come si può leggere dalla documentazione Apple, per richiamarlo basta scrivere [UIAccelerometer sharedAccelerometer] e usare uno dei due metodi elencati.

Sempre nel loadView attiviamo l’accelerometro in questo modo:

// attiviamo l'accelerometro
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.001];
 
// impostiamo la sensibilità a 4
sensibilita = 4;
 
}

Impostando il delegato (colui che riceverà i dati dell’accelerometro) a self e compilando a questo punto, ci verrà restituito un warning, per risolvere, basterà correggere l’header in questo modo:



Ora dobbiamo aggiungere il metodo del delegato, cercando nella documentazione Apple eccolo qua:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration;

Ogni volta che l’accelerometro avrà delle informazioni da darci, ce le passerà qui, e noi le sfrutteremo per spostare la pallina.

Per il movimento ho scritto un semplice algoritmo che mi limito a riportare commentato, è molto semplice. Calcola semplicemente la posizione che avrà la pallina e se dovesse uscire dallo schermo la “blocca”. Eccovi il codice:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
	// ricaviamo lo spostamento che avrà la pallina nelle due direzioni
	CGPoint spostamento = CGPointMake(acceleration.x * sensibilita, acceleration.y * sensibilita * -1);
 
	// calcoliamo se la pallina, con tale spostamento, finirà fuori dallo schermo
	CGRect pallinaFrame = pallinaView.frame;
	// impostiamo le coordinate che dovrebbe avere
	pallinaFrame.origin.x += spostamento.x;
	pallinaFrame.origin.y += spostamento.y;
	// se la pallina uscisse a sinistra
	if (pallinaFrame.origin.x < 0)
            pallinaFrame.origin.x = 0;
        // se uscisse a destra
        if (pallinaFrame.origin.x > (pallinaView.superview.frame.size.width - pallinaFrame.size.width))
	    pallinaFrame.origin.x = (pallinaView.superview.frame.size.width - pallinaFrame.size.width);
	// se uscisse in alto
	if (pallinaFrame.origin.y < 0)
            pallinaFrame.origin.y = 0;
        // se uscisse in basso
        if (pallinaFrame.origin.y > (pallinaView.superview.frame.size.height - pallinaFrame.size.height))
            pallinaFrame.origin.y = (pallinaView.superview.frame.size.height - pallinaFrame.size.height);
 
	// sposto la pallina
	pallinaView.frame = pallinaFrame;
 
}

Tutto a posto, ora la classe dovrebbe funzionare a dovere. Ultima cosa da fare è che qualcuno ora la chiami ‘sta classe!

Andiamo quindi in nomeprogettoAppDelegate.h e importiamo la nostra classe:



E implementiamo a dovere:



Ricordatevi, infine, di rilasciare l’oggetto nel dealloc!

Potete scaricare il mio progetto completo da questo link.