{"id":3740,"date":"2010-06-23T12:40:31","date_gmt":"2010-06-23T10:40:31","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=3740"},"modified":"2011-04-09T18:38:22","modified_gmt":"2011-04-09T16:38:22","slug":"t056-guessthecolor-impariamo-creando-un-giochino-per-iphone","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t056-guessthecolor-impariamo-creando-un-giochino-per-iphone\/","title":{"rendered":"T#056 &#8211; GuessTheColor: Impariamo creando un giochino per iPhone"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Colouring_pencils.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-3741 alignleft\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Colouring_pencils-300x199.jpg\" alt=\"\" width=\"270\" height=\"179\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Colouring_pencils-300x199.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Colouring_pencils-150x99.jpg 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Colouring_pencils.jpg 320w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><\/a><\/p>\n<p>Ed eccoci ad un nuovo appuntamento con la programmazione per iphone. Oggi vedremo di imparare qualcosa sulla programmazione dei nostri amati melafonini sviluppando un semplice giochino che chiameremo <strong>GuessTheColor<\/strong>.<\/p>\n<h4>Come funziona GuessTheColor?<\/h4>\n<p>Il gioco \u00e8 molto semplice, viene mostrata al giocatore una view colorata per un paio di secondi, dopo di ci\u00f2 l&#8217;utente dovr\u00e0 ricreare il colore che ha visto agendo su 3 slider che regolano la quantit\u00e0 di rosso, di verde e di blu. Semplice, no?<!--more--><\/p>\n<h4>Il progetto<\/h4>\n<p>Questa volta partiamo subito in quarta e apriamo Xcode, scegliamo di creare un progetto di tipo &#8220;view-based application&#8221; e lo chiamiamo <em>guessTheColor<\/em>.<\/p>\n<p>Ci vogliamo semplificare la vita, quindi utilizzeremo una sola classe, nello specifico utilizzeremo la classe guessTheColorViewController.h<\/p>\n<p>Che cosa ci servir\u00e0 in questa classe? Sicuramente i tre <em>UISlider<\/em> per selezionare il colore, poi ci servir\u00e0 una <em>UIView<\/em> dove visualizzare il colore da indovinare (quella che verr\u00e0 nascosta dopo 1 o 2 secondi), ed infine ci serviranno tre valori di tipo <em>float<\/em> (float sono valori con la virgola) per memorizzare le componenti RGB del colore che dobbiamo indovinare.<\/p>\n<h4>COS&#8217;\u00e8 RGB?<\/h4>\n<p>Questa piccola digressione \u00e8 d&#8217;obbligo, sentitevi liberi di andare avanti se sapete gi\u00e0 di cosa stiamo parlando.<\/p>\n<p>RGB sono le iniziali di Red (rosso), Green (verde) e Blue (blu) e, che ci crediate o no, tutti colori che state in questo momento guardando sul vostro schermo sono realizzati dosando opportunamente le percentuali di questi tre colori.<\/p>\n<p>A differenza di quello che avviene quando si mescolano i colori a tempera, con i quali se mescolassimo rosso verde (in realt\u00e0 il giallo :P) e blu in egual misura otterremmo una sorta di marrone scuro, quello che avviene con gli schermi \u00e8 che otteniamo invece il bianco. Questa \u00e8 quella che viene chiamata sintesi additiva.<\/p>\n<p><center><\/p>\n<div id=\"attachment_3744\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/RGB_sintesiAdditiva.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3744\" class=\"size-full wp-image-3744\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/RGB_sintesiAdditiva.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/RGB_sintesiAdditiva.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/RGB_sintesiAdditiva-150x150.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/RGB_sintesiAdditiva-64x64.png 64w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p id=\"caption-attachment-3744\" class=\"wp-caption-text\">Esempio di sintesi additiva con RGB<\/p>\n<\/div>\n<p><\/center><\/p>\n<p>Per specificare un colore, quindi, possiamo semplicemente elencarne le percentuali di rosso, verde e blu.<\/p>\n<p>Storicamente queste percentuali vengono specificate con un intero che va da 0 (0%) a 255 (100%) ma l&#8217;sdk di apple prevede che questi valori vengano forniti come un float che va da 0 (0%) a 1 (100%). Ovviamente non cambia nulla, \u00e8 solo un problema di proporzioni e di scalatura.<\/p>\n<p>Considerando che in molti sono abituati a  pensare ai colori in termini di valori 0-255 alcuni programmatori usano fornire questi valori usando questa notazione: 127\/255. Questo ovviamente da come risultato un float compreso tra 0 e 1 ed ha il vantaggio di essere pi\u00f9 chiaro per chi \u00e8 abituato alla notazione in 255-esimi.<\/p>\n<p>Una piccola nota, puo&#8217; sembrare strano affermare che il bianco \u00e8 fatto da 100% rosso, 100% verde e 100% blu, ma quello che questa notazione vuol dire \u00e8 che nel bianco abbiamo la massima quantit\u00e0 di questi tre colori, cos\u00ec come il colore (100%,100%,50%) ha met\u00e0 blu rispetto alla sua quantit\u00e0 massima.<\/p>\n<h4>TORNIAMO ALLA CREAZIONE DEL NOSTRO GIOCO PER IPHONE<\/h4>\n<p>Stavamo modificando guessTheColorViewController.h, aggiungiamo quindi gli Outlet e le property in questo modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@interface guessTheColorViewController : UIViewController {\r\n\tUIView *secretColorView;\r\n\tUISlider *sliderred;\r\n\tUISlider *slidergreen;\r\n\tUISlider *sliderblue;\r\n\tUILabel *tentativi;\r\n\tfloat red;\r\n\tfloat green;\r\n\tfloat blue;\r\n}\r\n@property (nonatomic, retain) IBOutlet UISlider *sliderred;\r\n@property (nonatomic, retain) IBOutlet UISlider *slidergreen;\r\n@property (nonatomic, retain) IBOutlet UISlider *sliderblue;\r\n@property (nonatomic, retain) IBOutlet UIView\t*secretColorView;\r\n@end\r\n<\/pre>\n<p>Non dimentichiamoci di aggiungere al file &#8220;guessTheColorViewController.m&#8221; la relativa voce &#8220;@synthesize&#8221;<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@synthesize sliderred,slidergreen,sliderblue,secretColorView;\r\n<\/pre>\n<p>A questo punto possiamo creare l&#8217;interfaccia con Interface Builder, trasciniamo i 3 UISlider e colleghiamoli alla nostra classe cliccando con il tasto destro sull&#8217;icona &#8220;file&#8217;s owner&#8221; della documentwindows e trascinando sopra gli slider.<\/p>\n<p>Questa \u00e8 il mio progetto:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColorIB.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-3746\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColorIB-295x300.png\" alt=\"Progetto di GuessTheColor in IB\" width=\"295\" height=\"300\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColorIB-295x300.png 295w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColorIB-64x64.png 64w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColorIB-147x150.png 147w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColorIB.png 572w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Scriviamo ora la funzione che imposti un colore random per la view &#8220;secretColorView&#8221;, questo \u00e8 il codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (IBACTION)showNextColor\r\n{\r\n\tred = ((float)rand()\/ RAND_MAX);\r\n\tgreen = ((float)rand()\/ RAND_MAX);\r\n\tblue = ((float)rand()\/ RAND_MAX);\r\n\t[secretColorView setBackgroundColor:[UIColor colorWithRed:red green:green blue:blue alpha:1]];\r\n\t[self performSelector:@selector(resetView) withObject:nil afterDelay:1.5];\r\n}\r\n<\/pre>\n<p>Questa funzione si occupa di generare tre valori random utilizzando la funzione <em>rand()<\/em> ma poich\u00e8 questi valori non sarebbero compresi nell&#8217;intervallo [0,1] bisogna dividere per la costante <em>RAND_MAX<\/em>.<\/p>\n<p>Impostiamo poi il colore di fondo della view &#8220;secretColorView&#8221; tramite il metodo &#8220;colorWithRed: green: blue: alpha&#8221; della classe <em>UIColor<\/em>.<\/p>\n<p>Questo metodo prende in input tre float che corrispondono alle percentuali dei colori RGB e un altro float per il parametro ALPHA che regola la trasparenza. Con Alpha=0 la view \u00e8 completamente trasparente, con Alpha=1 \u00e8 completamente opaca.<\/p>\n<p>L&#8217;ultima riga di questa funzione utilizza il metodo &#8220;performSelector&#8221;, gia incontrato nell&#8217;applicazione multithread, in questo caso quello che succede \u00e8 che viene invocato il metodo &#8220;resetView&#8221; dopo un ritardo di 1.5 secondi.<\/p>\n<p>Questo \u00e8 un buon sistema quando si vogliono eseguire delle operazioni &#8220;ritardate&#8221; senza voler mettere in ballo NSTimer e altre classi pi\u00f9 complesse.<\/p>\n<p>Ma cosa fa la funzione resetView? semplicemente toglie il colore visualizzato nella view e lo sostituisce con un anonimo grigio medio.<\/p>\n<p>il codice \u00e8 questo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (IBAction)resetView\r\n{\r\n\t[secretColorView setBackgroundColor:[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1]];\r\n}\r\n<\/pre>\n<p>non ci resta che richiamare la funzione &#8220;showNextColor&#8221; all&#8217;avvio dell&#8217;applicazione, magari dentro il metodo viewdidload.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad {\r\n    [super viewDidLoad];\r\n\t[self showNextColor];\r\n}\r\n<\/pre>\n<p>Se proviamo ad eseguire l&#8217;applicazione notiamo una cosa fastidiosa, ad ogni avvio viene visualizzato sempre lo stesso colore.<br \/>\nQuesto \u00e8 dovuto alla funzione rand() un generatore di numeri <em>pseudo-random<\/em> che per funzionare bene necessia che ad ogni avvio venga generato un nuovo seme.<\/p>\n<p>Questa generazione si fa aggiungendo al file <em>main.m<\/em>, (all&#8217;interno del metodo <em>main<\/em>) questa riga di codice prima di ogni altra istruzione:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nsrand(time(NULL))\r\n<\/pre>\n<h4>Proviamo ad indovinare:<\/h4>\n<p>Questa che abbiamo appena realizzato \u00e8 la prima parte dell&#8217;applicazione, ora dobbiamo realizzare la seconda.vogliamo che  scorrendo con gli slide vari in colore della view, quando pensiamo di aver indovinato il colore che abbiamo visto per un secondo clicchiamo sul pulsante <em>GUESS<\/em> e verremo informati di quanto siamo stati bravi nel ricordare il colore.<\/p>\n<p>Abbiamo bisogno quindi di un metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (IBAction)slideChanged:(id)sender\r\n{\r\n\t[secretColorView setBackgroundColor:[UIColor colorWithRed:[sliderred value] green:[slidergreen value] blue:[sliderblue value] alpha=1]];\r\n}\r\n<\/pre>\n<p>Questo metodo non fa altro che impostare il colore della view &#8220;secretColorView&#8221; con il valore presente nei tre slider.<\/p>\n<p>Da interface builder adesso potremo associare all&#8217;evento &#8220;value changed&#8221; degli slider proprio questo metodo.<br \/>\nProviamo ad eseguirlo e vediamo come il cambia il colore della view.<\/p>\n<p>Non ci resta che implementare il metodo per la verifica, vogliamo vedere se l&#8217;utente \u00e8 riuscito a ricordare il colore segreto, per fare questo scriviamo questo metodo e lo associamo all&#8217;evento click sul pulsante &#8220;guess&#8221;:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (IBAction)guessColor:(id)sender\r\n{\r\n\tfloat errorerosso = fabs(sliderred.value - red);\r\n\tfloat erroregreen = fabs(slidergreen.value - green);\r\n\tfloat erroreblue = fabs(sliderblue.value - blue);\r\n\tNSString *msg =[NSString stringWithFormat: @\"ERRORE\\nRED: %d%%\\nGREEN: %d%%\\nBLUE: %d%%\",(int)(errorerosso * 100),\r\n\t\t\t\t\t(int)(erroregreen * 100),\r\n\t\t\t\t\t(int)(erroreblue * 100)];\r\n\tUIAlertView *alert  = [[UIAlertView alloc] initWithTitle:@\"GUESS\" message:msg delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil];\r\n\t<div class=\"alert\"><button type=\"button\" class=\"close\">&#215;<\/button><div class=\"clear\"><\/div><\/div>;\r\n\t<div class=\"alert\"><button type=\"button\" class=\"close\">&#215;<\/button><div class=\"clear\"><\/div><\/div>;\r\n}\r\n<\/pre>\n<p>Calcoliamo per prima cosa quanto i valori che abbiamo selezionato si discostano dai valori che erano stati scelti random, poi creiamo una alertView che ci informi di quanto abbiamo sbagliato.<\/p>\n<p>Con questo la nostra applicazione \u00e8 terminata, spero che la lettura sia stata utile e piacevole. Attendo i vostri commenti.<\/p>\n<p><center><\/p>\n<div id=\"attachment_3750\" style=\"width: 174px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColor.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-3750\" class=\"size-medium wp-image-3750\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColor-164x300.png\" alt=\"\" width=\"164\" height=\"300\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColor-164x300.png 164w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColor-82x150.png 82w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/GuessTheColor.png 407w\" sizes=\"auto, (max-width: 164px) 100vw, 164px\" \/><\/a><\/p>\n<p id=\"caption-attachment-3750\" class=\"wp-caption-text\">Applicazione guessthecolor per devapp<\/p>\n<\/div>\n<p><\/center><\/p>\n<p>PS:Ho effettuato alcune modifiche dell&#8217;ultima ora, ho aggiunto un pulsante per richiedere un nuovo colore, il cui metodo da richiamare \u00e8  semplicemente &#8220;showNextColor&#8221;. e poi ho creato un pulsate &#8220;mi arrendo&#8221; che visualizza qual&#8217;era la corretta posizione degli slide il codice \u00e8 questo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (IBAction)imaloser:(id)sender\r\n{\r\n\t[sliderred setValue:red animated:YES];\r\n\t[slidergreen setValue:green animated:YES];\r\n\t[sliderblue setValue:blue animated:YES];\r\n\t[secretColorView setBackgroundColor:[UIColor colorWithRed:red green:green blue:blue alpha:1]];\r\n}\r\n<\/pre>\n<p>Ed ora un breve video del programma in azione.<\/p>\n<p><center><br \/>\n<object width=\"425\" height=\"344\"><param name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/JGYPbR0EycI&#038;hl=it_IT&#038;fs=1&#038;\"><\/param><param name=\"allowFullScreen\" value=\"true\"><\/param><param name=\"allowscriptaccess\" value=\"always\"><\/param><embed src=\"http:\/\/www.youtube.com\/v\/JGYPbR0EycI&#038;hl=it_IT&#038;fs=1&#038;\" type=\"application\/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"425\" height=\"344\"><\/embed><\/object><br \/>\n<\/center><\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/guessTheColor.zip\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"\" width=\"33\" height=\"40\" align=\"middle\" \/><\/a> Se avete problemi con il tutorial,\u00a0<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/guessTheColor.zip\" target=\"_blank\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ed eccoci ad un nuovo appuntamento con la programmazione per iphone. Oggi vedremo di imparare qualcosa sulla&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[280,40,205,279],"class_list":["post-3740","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-game-development","tag-random","tag-rgb","tag-uislider"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3740","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=3740"}],"version-history":[{"count":16,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3740\/revisions"}],"predecessor-version":[{"id":3755,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3740\/revisions\/3755"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3740"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3740"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3740"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}