{"id":2235,"date":"2010-03-01T10:38:34","date_gmt":"2010-03-01T09:38:34","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=2235"},"modified":"2010-03-01T10:38:34","modified_gmt":"2010-03-01T09:38:34","slug":"t026-creiamo-un-animazione-di-una-palla-con-un-nstimer-by-icodeblog","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t026-creiamo-un-animazione-di-una-palla-con-un-nstimer-by-icodeblog\/","title":{"rendered":"T#026 &#8211; Creiamo un&#8217;Animazione di una Palla con un NSTimer (by iCodeBlog)"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/simulatore.png\" alt=\"\" width=\"64\" height=\"123\" class=\"alignleft size-full wp-image-2269\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/simulatore.png 383w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/simulatore-156x300.png 156w\" sizes=\"auto, (max-width: 64px) 100vw, 64px\" \/> Ancora una volta ringraziamo il Team di <a href=\"http:\/\/icodeblog.com\/\" target=\"_blank\">iCodeBlog<\/a> che ci ha concesso di tradurre e proporre ai nostri utenti i suoi tutorial e le sue guide. In questo nuovo tutorial, di <a href=\"http:\/\/icodeblog.com\/2008\/10\/28\/iphone-programming-tutorial-animating-a-ball-using-an-nstimer\/\" target=\"_blank\">brandontreb<\/a>, vedremo come creare una semplice applicazione in cui una palla si muover\u00e0 automaticamente e &#8220;liberamente&#8221; in tutto lo schermo del vostro iPhone, rimbalzando sui lati. Per creare quest&#8217;animazione utilizzeremo un&#8217;immagine e un oggetto NSTimer. Tutto ci\u00f2 potrebbe tornare  sicuramente utile soprattutto nello sviluppo di giochi, infatti questa \u00e8 una caratteristica principale di famosi giochini che sono passati alla storia, come <em>&#8220;Pong&#8221;<\/em> o <em>&#8220;Hockey da Tavolo&#8221;<\/em> (Air Hockey).<\/p>\n<p>Partiamo aprendo Xcode e creando un nuovo progetto. Dall\u2019elenco dei template disponibili scegliamo &#8220;View-based Application&#8221; e proseguiamo. Diamo ora un nome alla nostra applicazione, ad esempio &#8220;Palla&#8221;, scegliamo la posizione dove salvare il progetto e andiamo avanti.<!--more--><\/p>\n<p>Per questo tutorial avrete bisogno di un&#8217;immagine in formato <strong>.png<\/strong> preferibilmente avente forma circolare, per simulare la presenza di una palla. Io ne ho creata una con il logo di devAPP.it potete scaricarla (tasto destro > &#8220;Salva Immagine con Nome&#8230;.&#8221;) oppure potete creare una vostra come meglio credete:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/palla.png\" alt=\"\" width=\"40\" height=\"40\" class=\"aligncenter size-full wp-image-2247\" \/><br \/>\n<\/center><\/p>\n<p>Una volta scaricata o creata l&#8217;immagine della palla, trascinatela nella cartella &#8220;Resources&#8221; del vostro progetto in Xcode, facendo attenzione di mettere la spunta nell&#8217;opzione &#8220;Copy items into destination&#8217;s group folder (if needed)&#8221;<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/trascinata.png\" alt=\"\" width=\"380\" height=\"354\" class=\"aligncenter size-full wp-image-2251\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/trascinata.png 380w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/trascinata-300x279.png 300w\" sizes=\"auto, (max-width: 380px) 100vw, 380px\" \/><br \/>\n<\/center><\/p>\n<p>Adesso l&#8217;immagine \u00e8 parte del nostro progetto. Clicchiamo sul file &#8220;PallaViewController.h&#8221; ed andiamo a scrivere un po&#8217; di codice. Dichiariamo un oggetto di tipo UIImageView e un oggetto di tipo CGPoint, che useremo per decidere di quanto si dovr\u00e0 muovere la nostra palla (se vogliamo una sorta di velocit\u00e0), infine, dichiariamo la solita @property:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n#import \r\n\r\n@interface PallaViewController : UIViewController {\t\r\n\tIBOutlet UIImageView *palla;\r\n\tCGPoint pos;\r\n}\r\n\r\n@property (nonatomic,retain) IBOutlet UIImageView *palla;\r\n\r\n@end\r\n<\/pre>\n<p>Salviamo il file .h e andiamo a costruire la nostra semplice interfaccia grafica con Interface Builder. Clicchiamo quindi due volte su &#8220;PallaViewController.xib&#8221; e si aprir\u00e0 IB. Ecco la nostra vista principale. Dentro di essa trasciniamo semplicemente una ImageView dalla Library (se non la vedete cliccate in alto su Tools > Library).<\/p>\n<p>Ridimensioniamo l&#8217; ImageView e clicchiamoci sopra. Apriamo quindi l&#8217;Attributes Inspector (Tools > Attribute Inspector) e nel campo image, apriamo la selezione multipla a tendina e scegliamo la nostra immagine dall&#8217;elenco &#8220;palla.png&#8221; (o eventualmente il nome che avete dato alla vostra palla caricata in precedenza).<\/p>\n<p>In questo modo apparir\u00e0 nell&#8217;ImageView proprio l&#8217;immagine della palla che avete incluso prima nel progetto.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/image.png\" alt=\"\" width=\"280\" height=\"446\" class=\"aligncenter size-full wp-image-2256\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/image.png 280w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/image-188x300.png 188w\" sizes=\"auto, (max-width: 280px) 100vw, 280px\" \/><br \/>\n<\/center><\/p>\n<p>A questo punto, sempre selezionando l&#8217;ImageView, clicchiamo contemporaneamente sulla nostra tastiera: <strong>Command<\/strong> e <strong>=<\/strong> (<strong>CMD + =<\/strong>) e i bordi dell&#8217;ImageView si allineeranno perfettamente alla palla. Potete benissimo abbellire la vista con molti elementi, ma noi cambieremo solo il colore di sfondo mettendo un Blu Oceano (per far ci\u00f2 selezionate la vista, cliccate su Attributes Inspector e cliccate accanto a Background)<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bg.png\" alt=\"\" width=\"380\" height=\"486\" class=\"aligncenter size-full wp-image-2258\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bg.png 380w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bg-234x300.png 234w\" sizes=\"auto, (max-width: 380px) 100vw, 380px\" \/><br \/>\n<\/center><\/p>\n<p>Ora dobbiamo collegare l&#8217;immagine a ci\u00f2 che abbiamo dichiarato via codice. Clicchiamo quindi su &#8220;File&#8217;s Owner&#8221;, spostiamoci nel Connections Inspector e colleghiamo l&#8217;oggetto &#8220;palla&#8221; all&#8217;ImageView<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/connection.png\" alt=\"\" width=\"400\" height=\"344\" class=\"aligncenter size-full wp-image-2260\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/connection.png 400w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/connection-300x258.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><br \/>\n<\/center><\/p>\n<p>Per quanto riguarda l&#8217;interfaccia grafica abbiamo finito, salviamo tutto e chiudiamo Interface Builder. Apriamo ora il file &#8220;PallaViewController.m&#8221; e aggiungiamo il solito &#8220;@synthesize&#8221; in questo caso per l&#8217;oggetto &#8220;palla&#8221;.<\/p>\n<p>Scommentiamo il metodo &#8220;viewDidLoad&#8221; e modifichiamo il suo codice come segue:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void)viewDidLoad {\r\n        pos = CGPointMake(14.0, 7.0);\r\n        [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];\r\n}\r\n<\/pre>\n<p>Nella prima linea, settiamo i valori per l&#8217;oggetto pos. Pi\u00f9 questi saranno alti, maggiore sar\u00e0 lo spostamento della palla (vedremo dopo perch\u00e8). Ovviamente questi valori indicheranno anche il modo in cui si muover\u00e0 la nostra palla, in questo caso in modo obliquo. Successivamente creiamo un oggetto NSTimer, settiamo il suo metodo &#8220;scheduledTimerWithTimeInterval&#8221; a 0.05, che indica la velocit\u00e0 con cui si aggiorna costantemente il Timer e, grazie al parametro &#8220;selector&#8221;, diciamo al nostro Timer quale metodo richiamare ad ogni intervallo di tempo trascorso, nel nostro caso &#8220;onTimer&#8221;:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void) onTimer {\r\n\tpalla.center = CGPointMake(palla.center.x+pos.x, palla.center.y+pos.y);\r\n\t\r\n\tif(palla.center.x > 320 || palla.center.x < 0)\r\n              pos.x = -pos.x;\r\n        if(palla.center.y > 460 || palla.center.y < 0)\r\n\t      pos.y = -pos.y;\r\n}\r\n<\/pre>\n<p>Ecco cosa succede. Ad ogni chiamata di questo metodo (onTimer), alla posizione della palla verranno aggiunti i valori settati in pos, quindi la palla si sposter\u00e0 di quei valori (x,y) indicati. Verr\u00e0 quindi verificato se la palla, con questo movimento, ha \"rimbalzato contro le pareti\" dell'iPhone. Se questo dovesse accadere, verranno invertiti i valori della x e rispettivamente della y cos\u00ec da far andare la palla nella direzione opposta, senza uscire quindi dallo schermo.<\/p>\n<p>Per quanto riguarda il codice \u00e8 tutto, clicchiamo su \"Build And Run\" e testiamo la nostra applicazione sul Simulatore, l'applicazione in esecuzione far\u00e0 capire molto meglio quello di cui stiamo parlando. Ecco uno screenshot dell'applicazioni in esecuzione:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/simulatore.png\" alt=\"\" width=\"383\" height=\"733\" class=\"aligncenter size-full wp-image-2269\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/simulatore.png 383w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/simulatore-156x300.png 156w\" sizes=\"auto, (max-width: 383px) 100vw, 383px\" \/><br \/>\n<\/center><\/p>\n<p>Tutorial tradotto da David Pollak (bebus77) per devAPP.it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ancora una volta ringraziamo il Team di iCodeBlog che ci ha concesso di tradurre e proporre ai&#8230;<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[90,124,126,5,120,23],"class_list":["post-2235","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-animazioni","tag-icodeblog","tag-nstimer","tag-objective-c","tag-tutorial","tag-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2235","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\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=2235"}],"version-history":[{"count":36,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2235\/revisions"}],"predecessor-version":[{"id":2297,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2235\/revisions\/2297"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=2235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=2235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=2235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}