T#062 – Mostrare un Oggetto in una Vista in una posizione a Random
Salve ragazzi, sono David Pollak e oggi in questo tutorial vi farò vedere come far apparire un oggetto in una posizione random all’interno della vostra View. Tutto questo vi potrà tornare utile, ad esempio, nella creazione di giochi o altri tipi di applicazioni ,proprio recentemente, infatti, ho usato questo codice che mi è servito per realizzare un semplice giochino per iPad che presto vedrà luce in AppStore. Il codice che sto per mostrarvi è abbastanza semplice da capire: in parole povere usiamo 2 file .txt contenenti numeri da 0 a 320 in uno, e da 0 a 480 l’altro (su iPad da 0 a 768 e da 0 a 1024), questi sono di fatto i pixel della risoluzione dei nostri devices da cui estrarremo casualmente un numero per file da usare nei 2 assi (x ed y). Potrete posizionare qualsiasi tipo di oggetto grafico (bottone, immagine, etc). Oggi andremo a posizionare una piccola immagine.
Partiamo con il nostro progetto Xcode
Prima di tutto dobbiamo creare i 2 file di testo .txt con tutti i pixels possibili, io ne ho già usati due per i miei fini quindi faccio che allegarveli qui, non crediate che li abbia scritti io, ho trovato un utilissimo sito che lo ha fatto al posto mio
!
Fattori X iPhone
Fattori Y iPhone
Una volta scaricati i file apriamo XCode, creiamo un nuovo progetto di tipo “view-based application” che chiameremo “RandomPos” e salviamolo da qualche parte (sulla scrivania andrà benissimo). Trascinate quindi i due file con i fattori x e y nella cartella Resources del vostro progetto spuntando l’opzione “Copy items into destination group’s folder (if needed)”.
Passiamo quindi a scrivere un po’ di codice iniziando dal file di intestazione (.h). Dichiariamo quindi variabili ed oggetti:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #import <UIKit/UIKit.h> @interface RandomPosViewController : UIViewController { IBOutlet UIImageView *immagine; NSMutableArray *fattoriX; NSMutableArray *fattoriY; float x; float y; NSString *stringa; NSString *stringa02; } - (IBAction)cambiaPosizione; @end |
Abbiamo semplicemente dichiarato un’UIImageView, due array contenenti i vari fattori, 2 variabili di tipo float (x,y), due NSString che ci serviranno per randomizzare gli elementi provenienti dai due file di testo (.txt), e logicamente un’IBAction per far cambiare la posizione alla nostra immagine.
Come immagine ho creato una sempicissima pallina che vi allego per comodità:

Ed ora iniziamo ad implementare un po’ di codice. Apriamo il file .m e modifichiamolo come segue:
Prima di tutto scommentiamo il metodo viewDidLoad che si trova in basso, togliendo semplicemente /* dall’inizio e */ dalla fine, vi accorgerete che il testo da verde assumerà i classici colori di XCode.
A questo punto andremo a modificare il metodo in questo modo:
1 2 3 4 5 6 7 8 9 10 11 12 13 | - (void)viewDidLoad { [super viewDidLoad]; NSBundle *bundle = [NSBundle mainBundle]; NSString *percorso = [bundle pathForResource:@"fattoriX-iphone" ofType:@"txt"]; NSString *contenuto = [NSString stringWithContentsOfFile:percorso encoding:NSUTF8StringEncoding error:nil]; fattoriX = [[NSMutableArray alloc] initWithArray:[contenuto componentsSeparatedByString:@"\n++"]]; NSBundle *bundle2 = [NSBundle mainBundle]; NSString *percorso2 = [bundle2 pathForResource:@"fattoriY-iphone" ofType:@"txt"]; NSString *contenuto2 = [NSString stringWithContentsOfFile:percorso2 encoding:NSUTF8StringEncoding error:nil]; fattoriY = [[NSMutableArray alloc] initWithArray:[contenuto2 componentsSeparatedByString:@"\n++"]]; } |
Come potete notare abbiamo inserito la stessa cosa due volte, perchè ciò che stiamo facendo è importare tutti gli elementi contenuti nei nostri file .txt verso le due NSMutableArray per poi utilizzarli. Analizzeremo il primo.
Abbiamo dichiarato un oggetto di tipo NSBundle indicandolo come mainBundle, ovvero diciamo di andare a prendere il file nella directory principale; in seguito con l’oggetto percorso di tipo NSString, diamo il nome ed il formato del file che prendiamo e con l’altra NSString creiamo una stringa che prende il contenuto del file nel percorso con l’encoding NSUTF8StringEncoding, poi settiamo l’errore su nil, dato che non ci interessa. Nell’ultima riga di codice inizializziamo l’array fattoriX con il contenuto della stringa precedente (contenuto) e diciamo che gli elementi dell’array sono separati da un invio e ++ (ho messo cosi’ per evitare spiacevoli errori e confusioni).
A questo punto ecco il codice per la nostra azione:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | - (IBAction)cambiaPosizione{ int lunghezza = [fattoriX count]; int selezione = arc4random() % lunghezza; stringa = [fattoriX objectAtIndex: selezione]; x = [stringa floatValue]; int lunghezza02 = [fattoriY count]; int selezione02 = arc4random() % lunghezza02; stringa02 = [fattoriY objectAtIndex: selezione02]; y = [stringa02 floatValue]; immagine.center = CGPointMake(x, y); } |
Qui andiamo a prendere casualmente i due fattori dagli array in questo modo: con una variabile int (lunghezza) contiamo il numero degli elementi dentro all’array, poi con un’altra variabile (selezione), prendiamo casualmente utilizzando il metodo arc4random() un numero dal conteggio fatto in precendenza e abbiniamo il numero all’elemento che poi inseriamo in una NSString (stringa). Cosi’ abbiniamo le variabili float al valore della NSString.
Come ultima cosa, impostiamo le coordinate del centro della nostra immagine inserendo le 2 variabili.
Con il codice abbiamo finito! Passiamo all’interfaccia grafica.
Creiamo l’interfaccia grafica con Interface Builder
Apriamo il file .xib e creiamo la nostra semplice interfaccia grafica. Inserite un RoundedRectButton che collegherete all’azione cambiaPosizione ed un’UIImageView che collegherete all’outlet immagine.

Abbiamo finito, salviamo tutto, clicchiamo su “Build and Run” ed ecco la nostra nuova app!
Cliccate sul bottone e vedrete che l’immagine si spostera’ casualmente.

Spero che il tutorial vi sia piaciuto e vi sia stato utile, alla prossima !

















…ma, non capisco…
che utilita’ c’e’ nel dver usare dei file esterni txt che contengono una lista di numeri da 0 a 320 (per la x),
mettere il contenuto dei txt in array,
per poi usare la funzione arc4random() che restituisce un intero, andare a leggere nell’array alla posizione dell’array stesso (che guarda caso e’ lo stesso intero, sotto forma di stringa), e poi usare questo in forma di numero (float in questo caso) per settare la posizione della ns UIImageView…
non ci sono un po’ di passaggi e oggetti inutili?
arc4random() restituisce numeri
CGPointMake() vuole numeri come parametri…