<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GoMonkey</title>
	<atom:link href="http://www.gomonkey.it/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gomonkey.it</link>
	<description>Learning cocos2D - game developer - Box2D</description>
	<lastBuildDate>Sat, 19 May 2012 18:33:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Cocos2d: Scrivere testo su diverse righe</title>
		<link>http://www.gomonkey.it/2012/05/cocos2d-scrivere-testo-su-piu-righe/</link>
		<comments>http://www.gomonkey.it/2012/05/cocos2d-scrivere-testo-su-piu-righe/#comments</comments>
		<pubDate>Sun, 13 May 2012 22:24:51 +0000</pubDate>
		<dc:creator>Gabriele Carbonai</dc:creator>
				<category><![CDATA[cocos2D]]></category>
		<category><![CDATA[cclabel new line]]></category>
		<category><![CDATA[CClabelTTF new line]]></category>
		<category><![CDATA[iphone game developer]]></category>
		<category><![CDATA[new lines]]></category>
		<category><![CDATA[programmazione cocos2D]]></category>
		<category><![CDATA[programmazione objective c]]></category>
		<category><![CDATA[tutorial cocos2d]]></category>
		<category><![CDATA[tutorial cocos2d italiano]]></category>
		<category><![CDATA[tutorial italiano cocos2d]]></category>
		<category><![CDATA[tutorial objective c]]></category>
		<category><![CDATA[tutorial objective c italiano]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1908</guid>
		<description><![CDATA[Sembra a primo impatto una cosa semplice e naturale quello di scrivere del testo su più righe, ma così purtroppo non è. Uno dei nostri utenti a riscontrato problemi con il titolo delle domande troppo lunghe del suo personale quiz game, dove ha tratto spunto dal nostro precedente tutorial. In effetti non è stato valutato il ritorno a capo e non ci eravamo posti questo grave problema anche abbastanza molto comune. Vediamo subito come poter [...]]]></description>
			<content:encoded><![CDATA[<p>Sembra a primo impatto una cosa semplice e naturale quello di scrivere del testo su più righe, ma così purtroppo non è.</p>
<p>Uno dei nostri utenti a riscontrato problemi con il titolo delle domande troppo lunghe del suo personale quiz game, dove ha tratto spunto dal nostro precedente <a title="Cocos2D: Creiamo un quiz game utilizzando i file property list" href="http://www.gomonkey.it/2012/05/cocos2d-creiamo-un-quiz-game-utilizzando-i-file-property-list/">tutorial</a>.</p>
<p>In effetti non è stato valutato il ritorno a capo e non ci eravamo posti questo grave problema anche abbastanza molto comune.</p>
<p>Vediamo subito come poter risolvere con poche righe di codice:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span> init
<span class="br0">&#123;</span>
	<span class="co2">// always call &quot;super&quot; init</span>
	<span class="co2">// Apple recommends to re-assign &quot;self&quot; with the &quot;super&quot; return value</span>
	<span class="kw1">if</span><span class="br0">&#40;</span> <span class="br0">&#40;</span>self<span class="sy0">=</span><span class="br0">&#91;</span>super init<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="co2">// Definiamo il testo, in questo caso viene scritto manualmente </span>
        <span class="co2">// ma può essere prelevato anche da un file plist</span>
        <span class="co2">// \n sta per new line, nuova linea</span>
        <span class="kw5">NSString</span> <span class="sy0">*</span>txt <span class="sy0">=</span> <span class="co3">@</span><span class="st0">&quot;Questo testo viene <span class="es0">\n</span> scritto su <span class="es0">\n</span> più righe .&quot;</span>;
&nbsp;
        <span class="co2">//  Misutiamo l'altezza e la larghezza della strinfa</span>
        <span class="kw4">float</span> fontSize <span class="sy0">=</span> <span class="nu0">14</span>;
        CGSize maxSize <span class="sy0">=</span> <span class="br0">&#123;</span> <span class="nu0">450</span>, <span class="nu0">2000</span> <span class="br0">&#125;</span>;		<span class="co2">// inizializziamo l'altezza e la larghezza massima</span>
&nbsp;
        <span class="co2">// Calcoliamo la dimensione effettiva del testo con la dimensione del font e la modalità di interruzione di linea.</span>
        CGSize actualSize <span class="sy0">=</span> <span class="br0">&#91;</span>txt sizeWithFont<span class="sy0">:</span><span class="br0">&#91;</span>UIFont fontWithName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Trebuchet MS&quot;</span> size<span class="sy0">:</span>fontSize<span class="br0">&#93;</span>
                            constrainedToSize<span class="sy0">:</span>maxSize
								lineBreakMode<span class="sy0">:</span>UILineBreakModeWordWrap<span class="br0">&#93;</span>;
&nbsp;
        CGSize containerSize <span class="sy0">=</span> <span class="br0">&#123;</span> actualSize.width, actualSize.height <span class="br0">&#125;</span>;
&nbsp;
        CCLabelTTF  <span class="sy0">*</span>label <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>txt
                                   dimensions<span class="sy0">:</span>containerSize
                                    alignment<span class="sy0">:</span>UITextAlignmentLeft
                                     fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Trebuchet MS&quot;</span>
                                     fontSize<span class="sy0">:</span>fontSize<span class="br0">&#93;</span>;
&nbsp;
		<span class="co2">// ask director the the window size</span>
		CGSize size <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>CCDirector sharedDirector<span class="br0">&#93;</span> winSize<span class="br0">&#93;</span>;
&nbsp;
		<span class="co2">// position the label on the center of the screen</span>
		label.position <span class="sy0">=</span>  ccp<span class="br0">&#40;</span> size.width <span class="sy0">/</span><span class="nu0">2</span> , size.height<span class="sy0">/</span><span class="nu0">2</span> <span class="br0">&#41;</span>;
&nbsp;
		<span class="co2">// add the label as a child to this Layer</span>
		<span class="br0">&#91;</span>self addChild<span class="sy0">:</span> label<span class="br0">&#93;</span>;
	<span class="br0">&#125;</span>
	<span class="kw1">return</span> self;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p><img class="aligncenter size-full wp-image-1911" title="newline" src="http://www.gomonkey.it/wp-content/uploads/2012/05/newline.png" alt="" width="480" height="321" /></p>
<p>Il codice è già commentato per quel poco che serve per capirlo, quindi evito qualsiasi altra spiegazione, se avete dubbi potete sempre commentare il post.</p>
<p>Potete scaricare il codice sorgente</p>
<div class="downloads"><h4>Download <strong>new lines</strong></h4><a href="http://www.gomonkey.it/login/" >Loggati per scaricare il file</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/05/cocos2d-scrivere-testo-su-piu-righe/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Objective-c: il timestamp cosa serve e come usarlo, confrontiamo due date</title>
		<link>http://www.gomonkey.it/2012/05/objective-c-il-timestamp-cosa-serve-e-come-usarlo/</link>
		<comments>http://www.gomonkey.it/2012/05/objective-c-il-timestamp-cosa-serve-e-come-usarlo/#comments</comments>
		<pubDate>Sat, 12 May 2012 22:01:02 +0000</pubDate>
		<dc:creator>Gabriele Carbonai</dc:creator>
				<category><![CDATA[objective-c]]></category>
		<category><![CDATA[differenza timestamp]]></category>
		<category><![CDATA[differenza tra date]]></category>
		<category><![CDATA[intValue]]></category>
		<category><![CDATA[obj-c]]></category>
		<category><![CDATA[objective c]]></category>
		<category><![CDATA[timeIntervalSince1970]]></category>
		<category><![CDATA[timestamp]]></category>
		<category><![CDATA[tutorial obj-c]]></category>
		<category><![CDATA[tutorial objective c]]></category>
		<category><![CDATA[tutorial objective c italiano]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1845</guid>
		<description><![CDATA[Cos&#8217;è il timestamp Il timestamp è una sequenza di caratteri che rappresentano una data e/o un orario per accertare l&#8217;effettivo avvenimento di un certo evento. In programmazione questa data è il primo di gennaio 1970 (1-1-1970). Il timestamp o meglio detto l&#8217;UNIX timestamp corrisponde al numero di secondi trascorsi dalla data Unix Epoch (1 Gennaio 1970). Cosa serve il timestamp Perché ci interessa avere la data del primo di gennaio del 1970?? no no.. effettivamente [...]]]></description>
			<content:encoded><![CDATA[<h3>Cos&#8217;è il timestamp</h3>
<p>Il <strong>timestamp</strong> è una sequenza di caratteri che rappresentano una data e/o un orario per accertare l&#8217;effettivo avvenimento di un certo evento.</p>
<p>In programmazione questa data è il primo di gennaio 1970 (1-1-1970).</p>
<p>Il timestamp o meglio detto l&#8217;UNIX timestamp corrisponde al numero di secondi trascorsi dalla data Unix Epoch (1 Gennaio 1970).</p>
<h3>Cosa serve il timestamp</h3>
<p>Perché ci interessa avere la data del primo di gennaio del 1970?? no no.. effettivamente non ci interessa, quello è solo un punto di partenza.</p>
<p>più che altro ci interessa avere due date differenti da confrontare.</p>
<p>pensate a Farmville e a tutti quei giochi dove continuano a funzionare pur avendo il computer spento..<br />
Credete che veramente il mondo del contadinotto di farmville vada realmente avanti?</p>
<p>è proprio qui, in questi casi, che si utilizza il timestamp, ovvero memorizziamo la data di un avvenuto evento, come può essere la seminagione di una pianta di pomodori e poi andiamo a confrontare il timestamp dal momento in cui è stata piantata fino al momento che viene riaccesa l&#8217;applicazione.</p>
<p>In questo caso tramite un controllo di flusso possiamo verificare se il tempo trascorso e avviare un azione, che può essere la maturazione del pomodoro o peggio ancora, ritrovarsi con una pianta marcia.</p>
<p>ecco a cosa serve il timestamp: verificare due o più date!</p>
<h3>Come usare il timestamp in objective-c</h3>
<p>è relativamente semplice, prima vi incollo tutto il metodo init:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span> init
<span class="br0">&#123;</span>
	<span class="co2">// always call &quot;super&quot; init</span>
	<span class="co2">// Apple recommends to re-assign &quot;self&quot; with the &quot;super&quot; return value</span>
	<span class="kw1">if</span><span class="br0">&#40;</span> <span class="br0">&#40;</span>self<span class="sy0">=</span><span class="br0">&#91;</span>super init<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="co2">// Utilizzo del timestamp</span>
        <span class="kw5">NSString</span> <span class="sy0">*</span>timestamp <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;%d&quot;</span>, <span class="br0">&#40;</span><span class="kw4">long</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><span class="kw5">NSDate</span> date<span class="br0">&#93;</span> timeIntervalSince1970<span class="br0">&#93;</span><span class="br0">&#93;</span>;
&nbsp;
	<span class="co2">// create and initialize a Label</span>
	CCLabelTTF <span class="sy0">*</span>label <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>timestamp fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">32</span><span class="br0">&#93;</span>;
&nbsp;
	<span class="co2">// ask director the the window size</span>
	CGSize size <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>CCDirector sharedDirector<span class="br0">&#93;</span> winSize<span class="br0">&#93;</span>;
&nbsp;
	<span class="co2">// position the label on the center of the screen</span>
	label.position <span class="sy0">=</span>  ccp<span class="br0">&#40;</span> size.width <span class="sy0">/</span><span class="nu0">2</span> , size.height<span class="sy0">/</span><span class="nu0">2</span> <span class="br0">&#41;</span>;
&nbsp;
	<span class="co2">// add the label as a child to this Layer</span>
	<span class="br0">&#91;</span>self addChild<span class="sy0">:</span> label<span class="br0">&#93;</span>;
	<span class="br0">&#125;</span>
	<span class="kw1">return</span> self;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Ora vediamo l&#8217;unica riga che ci genera il timestamp</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="kw5">NSString</span> <span class="sy0">*</span>timestamp <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;%d&quot;</span>, <span class="br0">&#40;</span><span class="kw4">long</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><span class="kw5">NSDate</span> date<span class="br0">&#93;</span> timeIntervalSince1970<span class="br0">&#93;</span><span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>la parte più importante, che genera il timestamp è: <strong>timeIntervalSince1970</strong></p>
<p>un intervallo di tempo dal 1970, questa è la definizione in Italiano.</p>
<h3>Creiamo ora un applicazione di esempio</h3>
<p>Per vedere il reale funzionamento, creiamo una semplice applicazione dove memorizza in una variabile il timestamp di apertura, poi un pulsante che se premuto visualizza il timestamp del momento ed infine una label che mostra la differenza trascorsa dal momento dell&#8217;apertura dell&#8217;applicazione e il momento in cui è stato premuto il pulsante.</p>
<p>partiamo subito aprendo il file helloWorldLayer.h, per chi non lo sapesse gomonkey tratta Cocos2D e tutte le applicazioni vengono realizzate con questo tipo di template.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="co2">// When you import this file, you import all the cocos2d classes</span>
<span class="co1">#import &quot;cocos2d.h&quot;</span>
&nbsp;
<span class="co2">// HelloWorldLayer</span>
<span class="kw1">@interface</span> HelloWorldLayer <span class="sy0">:</span> CCLayer
<span class="br0">&#123;</span>
    CGSize size;
    <span class="kw5">NSString</span> <span class="sy0">*</span>timestamp;
    <span class="kw5">NSString</span> <span class="sy0">*</span>timestampPulsantePremuto;
    CCLabelTTF <span class="sy0">*</span>labelAperturaApplicazione;
    CCLabelTTF <span class="sy0">*</span>labelPulsantePremuto;
    CCLabelTTF <span class="sy0">*</span>labelDifferenza; 
&nbsp;
    CCMenuItem <span class="sy0">*</span>item;
    CCMenu <span class="sy0">*</span>menu;
<span class="br0">&#125;</span>
&nbsp;
<span class="co2">// returns a CCScene that contains the HelloWorldLayer as the only child</span>
<span class="sy0">+</span><span class="br0">&#40;</span>CCScene <span class="sy0">*</span><span class="br0">&#41;</span> scene;
&nbsp;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>prelevaTimestamp;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>differenzeTraTimestamp;
&nbsp;
<span class="kw1">@end</span></pre></div></div></div></div></div></div></div>


<p>Abbiamo creato due stringhe e label per stampare a schermo il timestamp attuale, quindi il menu per cliccare e visualizzare la differenza infine i due metodi che andremo ad utilizzare.</p>
<p><strong>helloWorldLayer.m</strong></p>
<p>partiamo subito dal <strong>metodo init</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span> init
<span class="br0">&#123;</span>
	<span class="co2">// always call &quot;super&quot; init</span>
	<span class="co2">// Apple recommends to re-assign &quot;self&quot; with the &quot;super&quot; return value</span>
	<span class="kw1">if</span><span class="br0">&#40;</span> <span class="br0">&#40;</span>self<span class="sy0">=</span><span class="br0">&#91;</span>super init<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="co2">// ask director the the window size</span>
		size <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>CCDirector sharedDirector<span class="br0">&#93;</span> winSize<span class="br0">&#93;</span>;
&nbsp;
        <span class="co2">// Utilizzo del timestamp</span>
        timestamp <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;%d&quot;</span>, <span class="br0">&#40;</span><span class="kw4">long</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><span class="kw5">NSDate</span> date<span class="br0">&#93;</span> timeIntervalSince1970<span class="br0">&#93;</span><span class="br0">&#93;</span>;
&nbsp;
		<span class="co2">// create and initialize a Label</span>
		labelAperturaApplicazione <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>timestamp fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">32</span><span class="br0">&#93;</span>;
&nbsp;
		<span class="co2">// position the label on the center of the screen</span>
		labelAperturaApplicazione.position <span class="sy0">=</span>  ccp<span class="br0">&#40;</span> size.width <span class="sy0">/</span><span class="nu0">2</span> , <span class="nu0">280</span> <span class="br0">&#41;</span>;
&nbsp;
		<span class="co2">// add the label as a child to this Layer</span>
		<span class="br0">&#91;</span>self addChild<span class="sy0">:</span> labelAperturaApplicazione<span class="br0">&#93;</span>;
&nbsp;
        item <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Click&quot;</span> target<span class="sy0">:</span>self selector<span class="sy0">:</span> <span class="kw1">@selector</span><span class="br0">&#40;</span>prelevaTimestamp<span class="br0">&#41;</span><span class="br0">&#93;</span>;
&nbsp;
        menu <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenu menuWithItems<span class="sy0">:</span>item, <span class="kw2">nil</span><span class="br0">&#93;</span>;
&nbsp;
        menu.position <span class="sy0">=</span> ccp<span class="br0">&#40;</span>size.width<span class="sy0">/</span><span class="nu0">2</span>, <span class="nu0">100</span><span class="br0">&#41;</span>;
&nbsp;
        <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>menu<span class="br0">&#93;</span>;
	<span class="br0">&#125;</span>
	<span class="kw1">return</span> self;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Abbiamo solamente <strong>eliminato</strong> le dichiarazione perché le abbiamo spostate nel file header, dato che le riutilizzeremo e aggiunto il menu.</p>
<p>ora creiamo il metodo -(void)prelevaTimestamp che si farà la stessa identica cosa del metodo init ma solamente quando verrà premuto il pulsante &#8220;Click&#8221;</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>prelevaTimestamp<span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">if</span> <span class="br0">&#40;</span>labelPulsantePremuto<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="br0">&#91;</span>self removeChild<span class="sy0">:</span>labelPulsantePremuto cleanup<span class="sy0">:</span><span class="kw2">YES</span><span class="br0">&#93;</span>;
    <span class="br0">&#125;</span>
&nbsp;
    timestampPulsantePremuto <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;%d&quot;</span>, <span class="br0">&#40;</span><span class="kw4">long</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><span class="kw5">NSDate</span> date<span class="br0">&#93;</span> timeIntervalSince1970<span class="br0">&#93;</span><span class="br0">&#93;</span>;
&nbsp;
    labelPulsantePremuto <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>timestampPulsantePremuto fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">32</span><span class="br0">&#93;</span>;
&nbsp;
    labelPulsantePremuto.position <span class="sy0">=</span> ccp<span class="br0">&#40;</span>size.width<span class="sy0">/</span><span class="nu0">2</span>, <span class="nu0">240</span><span class="br0">&#41;</span>;
&nbsp;
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>labelPulsantePremuto<span class="br0">&#93;</span>;
    <span class="br0">&#91;</span>self differenzeTraTimestamp<span class="br0">&#93;</span>;
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Unica nota di merito un IF iniziale che controlla se la variabile labelPulsantePremuto è piena e se lo è prima di procedere la svuota, altrimenti andremmo a scriverci sopra del testo illeggibile.</p>
<p>infine chiamiamo l&#8217;ultimo metodo</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>differenzeTraTimestamp<span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">if</span> <span class="br0">&#40;</span>labelDifferenza<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="br0">&#91;</span>self removeChild<span class="sy0">:</span>labelDifferenza cleanup<span class="sy0">:</span><span class="kw2">YES</span><span class="br0">&#93;</span>;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw4">int</span> primo <span class="sy0">=</span> <span class="br0">&#91;</span>timestamp intValue<span class="br0">&#93;</span>;
    <span class="kw4">int</span> secondo <span class="sy0">=</span> <span class="br0">&#91;</span>timestampPulsantePremuto intValue<span class="br0">&#93;</span>;
&nbsp;
    <span class="kw5">NSString</span> <span class="sy0">*</span>differenza <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;secondi trascorsi: %d&quot;</span>, secondo <span class="sy0">-</span> primo<span class="br0">&#93;</span>;
&nbsp;
    labelDifferenza <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>differenza fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">32</span><span class="br0">&#93;</span>;
&nbsp;
    labelDifferenza.position <span class="sy0">=</span> ccp<span class="br0">&#40;</span>size.width<span class="sy0">/</span><span class="nu0">2</span>, <span class="nu0">200</span><span class="br0">&#41;</span>;
&nbsp;
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>labelDifferenza<span class="br0">&#93;</span>;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Prima cosa: Noi abbiamo memorizzato il timestamp in una variabile di tipo NSString, questo non va assolutamente bene, però non vogliamo trasformare la semplicità del codice su più righe e abbiamo deciso di continuare usando una stringa e non un intero.</p>
<p>Però non possiamo, quindi ci viene in aiuto <strong>intValue</strong> che trasforma la nostra stringa in intero.</p>
<p>ora creiamo solamente una nuova label e al suo interno ci mettiamo una sottrazione tra il secondo intero e il primo intero.</p>
<p>Non è al contrario&#8230; ho deciso così solo perché il timestampPulsantePremuto viene creato dopo, però è maggiore del primo e al contrario avremmo avuto un calcolo passivo.</p>
<p>Ora premiamo run per vedere il risultato</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/timestamp1.png" alt="" title="timestamp" width="480" height="320" class="aligncenter size-full wp-image-1850" /></p>
<p>Potete scaricare il file sorgente del progetto</p>
<div class="downloads"><h4>Download <strong>timestamp differenza tra date</strong></h4><a href="http://www.gomonkey.it/login/" >Loggati per scaricare il file</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/05/objective-c-il-timestamp-cosa-serve-e-come-usarlo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objective-c: Formattiamo le date e gli orari.</title>
		<link>http://www.gomonkey.it/2012/05/objective-c-formattiamo-le-date-e-gli-orari/</link>
		<comments>http://www.gomonkey.it/2012/05/objective-c-formattiamo-le-date-e-gli-orari/#comments</comments>
		<pubDate>Sat, 12 May 2012 20:01:00 +0000</pubDate>
		<dc:creator>Gabriele Carbonai</dc:creator>
				<category><![CDATA[objective-c]]></category>
		<category><![CDATA[cocos2d NSDateFormatter]]></category>
		<category><![CDATA[cocos2d setDateFormat]]></category>
		<category><![CDATA[NSDateFormatter]]></category>
		<category><![CDATA[objective-c NSDateFormatter]]></category>
		<category><![CDATA[objective-c setDateFormat]]></category>
		<category><![CDATA[setDateFormat]]></category>
		<category><![CDATA[tutorial ita objective-c]]></category>
		<category><![CDATA[tutrorial objective c]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1836</guid>
		<description><![CDATA[Introduciamo oggi una nuova sezione: Objective-c. Però non vedremo come programmare con xCode, ma solo linguaggio puro. Questo ci servirà comunque perché Cocos2d alla fine è un framework grafico di objective-c e spesso dobbiamo far uso del linguaggio puro. Vediamo come impostare una data e un orario con objective-c. Naturalmente noi creiamo un nuovo progetto in Cocos2D e lavoriamo con il template grafico. Apriamo il file helloWorldLayer e all&#8217;interno del metodo init aggiungiamo la parte [...]]]></description>
			<content:encoded><![CDATA[<p>Introduciamo oggi una nuova sezione: <strong>Objective-c</strong>.<br />
Però non vedremo come programmare con xCode, ma solo linguaggio puro.</p>
<p>Questo ci servirà comunque perché <strong>Cocos2d</strong> alla fine è un framework grafico di objective-c e spesso dobbiamo far uso del linguaggio puro.</p>
<p>Vediamo come impostare una data e un orario con objective-c.</p>
<p>Naturalmente noi creiamo un nuovo progetto in Cocos2D e lavoriamo con il template grafico.</p>
<p>Apriamo il file helloWorldLayer e all&#8217;interno del metodo init aggiungiamo la parte di codice che gestisce la data, tenendo tutto il resto modificando solo la dimensione del carattere e sostituendo la scritta Hello World con il nome della variabile str senza chiocciola e apici.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span> init
<span class="br0">&#123;</span>
	<span class="co2">// always call &quot;super&quot; init</span>
	<span class="co2">// Apple recommends to re-assign &quot;self&quot; with the &quot;super&quot; return value</span>
	<span class="kw1">if</span><span class="br0">&#40;</span> <span class="br0">&#40;</span>self<span class="sy0">=</span><span class="br0">&#91;</span>super init<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        <span class="co2">// Implementiamo il codice che gestisce la data in objective-c</span>
        <span class="kw5">NSDate</span> <span class="sy0">*</span>date <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSDate</span> date<span class="br0">&#93;</span>;
&nbsp;
        <span class="co2">//Creiamo l'oggetto dateformatter </span>
&nbsp;
        <span class="kw5">NSDateFormatter</span> <span class="sy0">*</span>formatter <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span><span class="br0">&#91;</span><span class="kw5">NSDateFormatter</span> alloc<span class="br0">&#93;</span> init<span class="br0">&#93;</span> autorelease<span class="br0">&#93;</span>;
&nbsp;
        <span class="co2">//Settiamo la data</span>
&nbsp;
        <span class="br0">&#91;</span>formatter setDateFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;'data:' dd-MM-yyyy ' ora:' HH-mm&quot;</span><span class="br0">&#93;</span>;
&nbsp;
        <span class="co2">//Preleviamo la data tramite stringa NSString</span>
&nbsp;
        <span class="kw5">NSString</span> <span class="sy0">*</span>str <span class="sy0">=</span> <span class="br0">&#91;</span>formatter stringFromDate<span class="sy0">:</span>date<span class="br0">&#93;</span>;
&nbsp;
	<span class="co2">// create and initialize a Label</span>
	CCLabelTTF <span class="sy0">*</span>label <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>str fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">32</span><span class="br0">&#93;</span>;
&nbsp;
	<span class="co2">// ask director the the window size</span>
	CGSize size <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>CCDirector sharedDirector<span class="br0">&#93;</span> winSize<span class="br0">&#93;</span>;
&nbsp;
	<span class="co2">// position the label on the center of the screen</span>
	label.position <span class="sy0">=</span>  ccp<span class="br0">&#40;</span> size.width <span class="sy0">/</span><span class="nu0">2</span> , size.height<span class="sy0">/</span><span class="nu0">2</span> <span class="br0">&#41;</span>;
&nbsp;
	<span class="co2">// add the label as a child to this Layer</span>
	<span class="br0">&#91;</span>self addChild<span class="sy0">:</span> label<span class="br0">&#93;</span>;
	<span class="br0">&#125;</span>
	<span class="kw1">return</span> self;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Clicchiamo su run per vedere apparire come da immagine:</p>
<p> <a href="http://www.gomonkey.it/wp-content/uploads/2012/05/data.png"><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/data-e1336852626298.png" alt="" title="data" width="550" height="284" class="aligncenter size-full wp-image-1837" /></a></p>
<p>La stringa che formatta la data è la seguente:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="br0">&#91;</span>formatter setDateFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;'data:' dd-MM-yyyy ' ora:' HH-mm&quot;</span><span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Dove formatter è di tipo <strong>NSDateFormatter</strong></p>
<p><strong>Fate molta attenzione agli apici</strong>, infatti i testi data e ora con rispettivi doppi punti sono all&#8217;interno di due apici singoli, questo per differenziare la data dal normale testo</p>
<p>Andiamo a vedere ora come possiamo gestire la data in vari formati:</p>
<h3>Data:</h3>
<table>
<tr>
<td width="120px"><strong>dd-MM-yyyy</strong></td>
<td> stampa: 12-05-2012</td>
</tr>
<tr>
<td>
<strong>dd-MM-yy</strong> </td>
<td> stampa: 12-05-12</td>
</tr>
<tr>
<td>
<strong>dd-M-yy</strong></td>
<td>  stampa: 12-5-12</td>
</tr>
<tr>
<td>
<strong>dd-MMMM-yyyy</strong> </td>
<td> stampa: 12-May-2012</td>
</tr>
<tr>
<td>
<strong>EE-dd-MM-yyyy</strong> </td>
<td> stampa: Sat-12-05-2012 (Sat uguale Saturday, sabato)</td>
</tr>
<tr>
<td>
<strong>EEEE-MM-yyyy</strong> </td>
<td> stampa: Saturday-12-05-2012</td>
</tr>
<tr>
<td>
<strong>DD-MM-yyyy</strong> </td>
<td> stampa: 133-05-2012 (133 sono i giorni passati dal primo gennaio)</td>
</tr>
</table>
<h3>Ora</h3>
<table class='tabella'>
<tr>
<td width="120px">
<strong>HH-mm-ss</strong> </td>
<td> stampa: 21-55-27 (ora in formato 24 &#8211; minuti &#8211; secondi)</td>
</tr>
<tr>
<td>
<strong>hh-mm-ss</strong>  </td>
<td>stampa: 09-55-27 (ora in formato 12 &#8211; minuti &#8211; secondi)</td>
</tr>
<tr>
<td>
<strong>hh-mm-ss a</strong>  </td>
<td>stampa: 09-55-27 PM (in questo caso le 21) </td>
</tr>
</table>
<h3>Conclusione</h3>
<p>Potrebbe tornarci utile sapere come gestire le date in vari formati per poter memorizzarle all&#8217;interno della nostra applicazione e poi confrontarle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/05/objective-c-formattiamo-le-date-e-gli-orari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cocos2D: Salvare il punteggio scrivendo in un file plist</title>
		<link>http://www.gomonkey.it/2012/05/cocos2d-salvare-il-punteggio-scrivendo-in-un-file-plist/</link>
		<comments>http://www.gomonkey.it/2012/05/cocos2d-salvare-il-punteggio-scrivendo-in-un-file-plist/#comments</comments>
		<pubDate>Sat, 12 May 2012 09:29:30 +0000</pubDate>
		<dc:creator>Mario</dc:creator>
				<category><![CDATA[cocos2D]]></category>
		<category><![CDATA[.plist]]></category>
		<category><![CDATA[cocos2d menu]]></category>
		<category><![CDATA[cocos2d plist]]></category>
		<category><![CDATA[cocos2d quiz game]]></category>
		<category><![CDATA[cocos2d tutorial quiz game]]></category>
		<category><![CDATA[file plist]]></category>
		<category><![CDATA[games tutorial]]></category>
		<category><![CDATA[intValue]]></category>
		<category><![CDATA[iphone game developer]]></category>
		<category><![CDATA[itemFromString]]></category>
		<category><![CDATA[menu cocos2d]]></category>
		<category><![CDATA[plist menu]]></category>
		<category><![CDATA[programmazione cocos2D]]></category>
		<category><![CDATA[programmazione iphone]]></category>
		<category><![CDATA[programmazione objective c]]></category>
		<category><![CDATA[property list]]></category>
		<category><![CDATA[property list menu]]></category>
		<category><![CDATA[tutorial cocos2d]]></category>
		<category><![CDATA[tutorial cocos2d italiano]]></category>
		<category><![CDATA[tutorial gioco completo]]></category>
		<category><![CDATA[tutorial italiano cocos2d]]></category>
		<category><![CDATA[tutorial plist]]></category>
		<category><![CDATA[valueForKey]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1823</guid>
		<description><![CDATA[Oggi vedremo come salvare il punteggio del nostro gioco in un file plist. Iniziamo aggiungendo nel file .h tutti gli oggetti che ci serviranno CCMenuItemFont *aumenta; CCMenuItemFont *reset; CCMenuItemFont *salva; CCMenu *menu; &#160; CCLabelTTF *punteggio; NSString *stringa; &#160; int score; Abbiamo aggiunto tre menu che serviranno appunto per aumentare resettare e salvare il punteggio, poi abbiamo aggiunto un label e una stringa che ci mostreranno il punteggio e infine l&#8217;integer che conterrà il punteggio vero [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi vedremo come salvare il punteggio del nostro gioco in un file plist.</p>
<p>Iniziamo aggiungendo nel file .h tutti gli oggetti che ci serviranno</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">CCMenuItemFont <span class="sy0">*</span>aumenta;
CCMenuItemFont <span class="sy0">*</span>reset;
CCMenuItemFont <span class="sy0">*</span>salva;
CCMenu <span class="sy0">*</span>menu;
&nbsp;
CCLabelTTF <span class="sy0">*</span>punteggio;
<span class="kw5">NSString</span> <span class="sy0">*</span>stringa;
&nbsp;
<span class="kw4">int</span> score;</pre></div></div></div></div></div></div></div>


<p>Abbiamo aggiunto tre menu che serviranno appunto per aumentare resettare e salvare il punteggio, poi abbiamo aggiunto un label e una stringa che ci mostreranno il punteggio e infine l&#8217;integer che conterrà il punteggio vero e proprio.</p>
<p>Ora che abbiamo tutto spostiamoci nel file .m ed aggiungiamo i nostri menu:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">aumenta <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Aumenta Punteggio&quot;</span> target<span class="sy0">:</span>self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>aum<span class="br0">&#41;</span><span class="br0">&#93;</span>;
reset <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Reset&quot;</span> target<span class="sy0">:</span>self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>res<span class="br0">&#41;</span><span class="br0">&#93;</span>;
salva <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Salva&quot;</span> target<span class="sy0">:</span> self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>sal<span class="br0">&#41;</span><span class="br0">&#93;</span>;
menu <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenu menuWithItems<span class="sy0">:</span>aumenta,reset,salva, <span class="kw2">nil</span><span class="br0">&#93;</span>;
<span class="br0">&#91;</span>menu alignItemsVertically<span class="br0">&#93;</span>;
<span class="br0">&#91;</span>self addChild<span class="sy0">:</span>menu<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Perfetto ora aggiungiamo la stringa che conterrà l&#8217;integer score e la inseriamo nel label, in questo modo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">stringa <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Punteggio: %d&quot;</span>,score<span class="br0">&#93;</span>;
punteggio <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>stringa fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">24</span><span class="br0">&#93;</span>;
punteggio.position<span class="sy0">=</span>ccp<span class="br0">&#40;</span><span class="nu0">400</span>,<span class="nu0">300</span><span class="br0">&#41;</span>;
<span class="br0">&#91;</span>self addChild<span class="sy0">:</span>punteggio<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Ok, adesso aggiungiamo i tre metodi che abbiamo chiamato nei menu: il primo servirà ad aumentare il punteggio</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>aum<span class="br0">&#123;</span>
score<span class="sy0">++</span>;
stringa <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Punteggio: %d&quot;</span>,score<span class="br0">&#93;</span>;
<span class="br0">&#91;</span>punteggio setString<span class="sy0">:</span>stringa<span class="br0">&#93;</span>;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Il secondo ci metterà il punteggio a zero:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>res<span class="br0">&#123;</span>
score<span class="sy0">=</span><span class="nu0">0</span>;
stringa <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Punteggio: %d&quot;</span>,score<span class="br0">&#93;</span>;
<span class="br0">&#91;</span>punteggio setString<span class="sy0">:</span>stringa<span class="br0">&#93;</span>;   
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Ed infine il terzo ci salverà il punteggio in un plist utilizzando NSUserDefaults:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>sal<span class="br0">&#123;</span>
<span class="kw5">NSUserDefaults</span> <span class="sy0">*</span>ud<span class="sy0">=</span><span class="br0">&#91;</span><span class="kw5">NSUserDefaults</span> standardUserDefaults<span class="br0">&#93;</span>;
<span class="br0">&#91;</span>ud setInteger<span class="sy0">:</span>score forKey<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Punteggio&quot;</span><span class="br0">&#93;</span>;
<span class="br0">&#91;</span>ud synchronize<span class="br0">&#93;</span>;   
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>In questo modo gli abbiamo detto di inserire l&#8217;integer score all&#8217;interno della chiave Punteggio nel plist.</p>
<p>Ora abbiamo tutto, dobbiamo solo fare in modo che il punteggio venga letto ogni volta che avviamo l&#8217;applicazione, quindi andremo ad aggiungere questo codice nel metodo init appena sotto i menu:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="kw5">NSUserDefaults</span> <span class="sy0">*</span>ud <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSUserDefaults</span> standardUserDefaults<span class="br0">&#93;</span>;
score<span class="sy0">=</span><span class="br0">&#91;</span>ud integerForKey<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Punteggio&quot;</span><span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Perfetto in questo modo gli abbiamo detto di prendere il contenuto del plist e di inserirlo nell&#8217;integer score, che essendo a sua volta inserito nella stringa ci mostrerà il punteggio salvato ogni volta che avvieremo l&#8217;app.</p>
<p>Ovviamente in questo modo potremmo salvare non solo il punteggio ma qualsiasi cosa come impostazioni o altro&#8230;</p>
<p>Se avete dubbi potete scaricare il file in allegato</p>
<div class="downloads">
<h4>Download <strong>Score</strong></h4>
<p><a title="Click to download this file" href="http://www.gomonkey.it/wp-content/uploads/2012/05/Score.zip">Score</a></p>
<p class="dlb_linklove">
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/05/cocos2d-salvare-il-punteggio-scrivendo-in-un-file-plist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A caccia di errori</title>
		<link>http://www.gomonkey.it/2012/05/a-caccia-di-errori/</link>
		<comments>http://www.gomonkey.it/2012/05/a-caccia-di-errori/#comments</comments>
		<pubDate>Tue, 08 May 2012 01:37:08 +0000</pubDate>
		<dc:creator>Gabriele Carbonai</dc:creator>
				<category><![CDATA[Problemi da sviluppatore]]></category>
		<category><![CDATA[breakPoint]]></category>
		<category><![CDATA[cclog]]></category>
		<category><![CDATA[console errori]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[sigabrt]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1797</guid>
		<description><![CDATA[Quante volte sarà capitato che la nostra applicazione se ne vada sorprendentemente in crash? Rimaniamo per qualche secondo a bocca aperta increduli e senza nessuna idea del motivo, eppure qualcosa che non funziona, qualcosa di sbagliato nel codice ci deve essere per forza. Molti programmatori novizi odiano la parola SIGABRT, e condivido immagini in rete chiedendo il motivo!! Scordatevelo!!! nessuno mai vi darà la soluzione. A volte invece è a portata di mano, basterebbe apri [...]]]></description>
			<content:encoded><![CDATA[<p>Quante volte sarà capitato che la nostra applicazione se ne vada sorprendentemente in crash?</p>
<p>Rimaniamo per qualche secondo a bocca aperta increduli e senza nessuna idea del motivo, eppure qualcosa che non funziona, qualcosa di sbagliato nel codice ci deve essere per forza.</p>
<p>Molti programmatori novizi odiano la parola <strong>SIGABRT</strong>, e condivido immagini in rete chiedendo il motivo!!</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/sigabrt-e1336437052877.png" alt="" title="sigabrt" width="550" height="94" class="aligncenter size-full wp-image-1798" /></p>
<p><strong>Scordatevelo!!!</strong> nessuno mai vi darà la soluzione.</p>
<p>A volte invece è a portata di mano, basterebbe apri il log, premendo sul pulsante in alto a destra come da immagine</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/log.png" alt="" title="log" width="287" height="71" class="aligncenter size-full wp-image-1799" /> </p>
<p>Per scoprire che come ad esempio (solo come esempio) manca l&#8217;immagine:</p>
<p> <img src="http://www.gomonkey.it/wp-content/uploads/2012/05/error-e1336437083389.png" alt="" title="error" width="550" height="212" class="aligncenter size-full wp-image-1800" /></p>
<p>Quindi effettivamente xCode ci viene in aiuto.</p>
<p>Il segreto è principale o la prima cosa da fare comunque è quello di andare a leggere il log di xCode.</p>
<p>Però ad essere sinceri non sempre si riesce a capire quale sia il problema o dove viene generato, a volte addirittura nemmeno xCode è in grado di aiutarci, ma allora come possiamo fare?</p>
<p>In questo caso, dobbiamo utilizzare un agente segreto che ci aiuterà a scoprire il motivo del nostro errore.</p>
<p>il nostro 007 viene chiamato CCLog();</p>
<p>Lo utilizzeremo per stampare qualsiasi cosa in qualsiasi punto del codice, sia all&#8217;interno delle istruzioni IF-ELSE, sia nei cicli oppure nei vari metodi.</p>
<p>Piazzeremo la nostra spia nei punti più segreti del nostro codice per poi andare le informazioni che ci riporta.</p>
<p>Ma lo dobbiamo fare con testa per non incasinarci maggiormente.</p>
<p>esempio in un ciclo for potremmo passargli il numero dell&#8217;intero in modo da capire fino a che punto cicla o se ha blocchi dovuti ad altra parte di codice all&#8217;interno del ciclo stesso.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="kw1">for</span> <span class="br0">&#40;</span> <span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span>; i&lt;<span class="nu0">10</span>; i<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
CCLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;i = %i&quot;</span>, i<span class="br0">&#41;</span>;
&nbsp;
<span class="co2">// Altro codice all'interno del ciclo.</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Ora all&#8217;avvio della nostra applicazione, se all&#8217;interno del log vengono stampati i numeri dallo zero al nove significa che all&#8217;interno di quel ciclo non vi sono errori.</p>
<p>Altro metodo potrebbe essere all&#8217;interno di un istruzione IF-ELSE.</p>
<p>Se noi ci aspettiamo che il codice entra all&#8217;interno dell&#8217;istruzione IF perché la riteniamo vera allora dovrà stamparci una riga nel log come da esempio</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>condizioneValida<span class="br0">&#41;</span><span class="br0">&#123;</span>
CCLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;Sono all'interno dell'istruzione IF&quot;</span><span class="br0">&#41;</span>;
<span class="co2">// Altro codice all'interno dell'istruzione if.</span>
<span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span>
CCLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;condizioneValida risulta falsa&quot;</span><span class="br0">&#41;</span>;
<span class="co2">// Codice che viene stampato se if risulta falso</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Ora se salta l&#8217;istruzione IF vuol dire che la condizione è falsa, e se noi non volevamo questo dovremmo rivedere la variabile condizioneValida.</p>
<p>Altro sistema è controllare i metodi</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>mioMetodo<span class="br0">&#123;</span>
CCLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;Sono all'interno di mioMetodo&quot;</span><span class="br0">&#41;</span>;
<span class="co2">// Altro codice all'interno del metodo</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Anche qui se ci aspettiamo di entrare nel metodo ma non succede all&#8217;ora c&#8217;è un errore.</p>
<p>Per capire quest&#8217;ultimo vi faccio un esempio di errore che xCode <strong>non segnalerà mai</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span> <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>ccTouchesBegan<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw5">NSSet</span> <span class="sy0">*</span><span class="br0">&#41;</span>touches withEvent<span class="sy0">:</span><span class="br0">&#40;</span>UIEvent <span class="sy0">*</span><span class="br0">&#41;</span>event <span class="br0">&#123;</span>
CCLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;Ho toccato lo schermo&quot;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="co2">// Altro codice all'interno del metodo</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Perfetto, sappiamo che se tocchiamo lo schermo il log deve stampare quella scritta.</p>
<p>Ma se questo non avviene? semplicemente potremmo esserci scordati di inserire questo codice all&#8217;interno del metodo init</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">self.isTouchEnabled <span class="sy0">=</span> <span class="kw2">YES</span>;</pre></div></div></div></div></div></div></div>


<p>Avete visto come una dimenticanza se pur semplice non genererebbe nessun errore e vi farebbe impazzire?</p>
<p>Andiamo a vedere un applicazione reale.</p>
<p>Abbiamo da poco realizzato il tutorial <a href="http://www.gomonkey.it/2012/05/cocos2d-creiamo-un-quiz-game-utilizzando-i-file-property-list/" title="Cocos2D: Creiamo un quiz game utilizzando i file property list">quiz game</a>, quest&#8217;ultimo andava in crash e l&#8217;errore del log era questo: <em>value lenght must be greater than 0</em></p>
<p>Vediamo in che modo è stato risolto attraverso l&#8217;utilizzo del nostro agente spia.</p>
<p>Questo il metodo completo creaDomanda, il primo ad essere maggiormente indiziato</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>creaDomanda<span class="br0">&#123;</span>
&nbsp;
    <span class="kw4">int</span> randomValue <span class="sy0">=</span>  <span class="br0">&#40;</span>arc4random<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="nu0">5</span><span class="br0">&#41;</span>; 
&nbsp;
    <span class="kw5">NSString</span> <span class="sy0">*</span>stringa <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Domanda%i&quot;</span>, randomValue<span class="br0">&#93;</span>;
&nbsp;
    CCLOG<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;%@&quot;</span>,stringa<span class="br0">&#41;</span>;
&nbsp;
    <span class="co2">// Apre il dictionary</span>
    dictionary <span class="sy0">=</span> <span class="br0">&#91;</span>plistData objectForKey<span class="sy0">:</span>stringa<span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Preleva la domanda</span>
    domanda <span class="sy0">=</span> <span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Titolo&quot;</span><span class="br0">&#93;</span>;
&nbsp;
    labelDomanda <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>domanda fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">24</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// position the label on the center of the screen</span>
    labelDomanda.position <span class="sy0">=</span>  ccp<span class="br0">&#40;</span> size.width <span class="sy0">/</span><span class="nu0">2</span> , <span class="nu0">280</span> <span class="br0">&#41;</span>;
&nbsp;
    <span class="co2">// add the label as a child to this Layer</span>
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span> labelDomanda<span class="br0">&#93;</span>;
&nbsp;
&nbsp;
    <span class="co2">// Estraggo la risposta esatta dal file plist e lo converto da number ad intero</span>
    <span class="kw4">int</span> rispostaEsatta <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Soluzione&quot;</span><span class="br0">&#93;</span> intValue<span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Creiamo il menu dinamicamente</span>
&nbsp;
    menu <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenu menuWithItems<span class="sy0">:</span><span class="kw2">nil</span><span class="br0">&#93;</span>;
&nbsp;
   CCLOG<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;prima del ciclo for&quot;</span><span class="br0">&#41;</span>; 
&nbsp;
    <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">1</span>; i&lt;<span class="nu0">5</span>;i<span class="sy0">++</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
&nbsp;
        CCLOG<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;ciclo for %i&quot;</span>, i<span class="br0">&#41;</span>;
&nbsp;
        <span class="kw1">if</span><span class="br0">&#40;</span>rispostaEsatta <span class="sy0">==</span> i<span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
            <span class="co2">// La risposta che viene stampata è quella corretta quindi lo mandiamo in un metodo di vincita</span>
&nbsp;
            item <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span>
                                                               <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Risposta%i&quot;</span>,i<span class="br0">&#93;</span> <span class="br0">&#93;</span>
                                                       target<span class="sy0">:</span>self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>corretto<span class="br0">&#41;</span><span class="br0">&#93;</span>;
&nbsp;
        <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span>
&nbsp;
            <span class="co2">// La risposta che viene stampata non è corretta e quini lo mandiamo in un metodo di errore</span>
            item <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span>
                                                               <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Risposta%i&quot;</span>,i<span class="br0">&#93;</span> <span class="br0">&#93;</span>
                                                       target<span class="sy0">:</span>self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>sbagliato<span class="br0">&#41;</span><span class="br0">&#93;</span>;
        <span class="br0">&#125;</span>
&nbsp;
        <span class="br0">&#91;</span>menu addChild<span class="sy0">:</span>item<span class="br0">&#93;</span>;
&nbsp;
    <span class="br0">&#125;</span>
    <span class="br0">&#91;</span>menu alignItemsVertically<span class="br0">&#93;</span>;
&nbsp;
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>menu<span class="br0">&#93;</span>;
&nbsp;
&nbsp;
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Non sappiamo ancora dove sia il problema, sappiamo solo cosa fa il metodo:</p>
<p>1. Preleva una domanda con risposte dal file plist tramite dictionary<br />
2. stampa la domanda<br />
3. stampa le risposte tramite ciclo</p>
<p>abbiamo per prima cosa inserito un CCLog per scoprire il nome della domanda</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">CCLOG<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;%@&quot;</span>,stringa<span class="br0">&#41;</span>;</pre></div></div></div></div></div></div></div>


<p>in questo modo all&#8217;interno del log ogni volta che apparirà una nuova domanda ci verrà stampato nel log la chiave del dizionario che può essere Domanda1, Domanda2 e così via.</p>
<p>Seconda spia l&#8217;abbiamo messa poco prima del ciclo, per vedere se si interrompeva prima dell&#8217;ingresso</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">CCLOG<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;prima del ciclo for&quot;</span><span class="br0">&#41;</span>;</pre></div></div></div></div></div></div></div>


<p>un semplice testo, nulla di più.</p>
<p>L&#8217;ultima la siamo andati a mettere all&#8217;interno del ciclo per verificare se una volta al suo interno portasse a termine il suo compito, se così non fosse sarebbe indubbiamente al suo interno.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">CCLOG<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;ciclo for %i&quot;</span>, i<span class="br0">&#41;</span>;</pre></div></div></div></div></div></div></div>


<p>Stampa semplicemente la sequenza di numeri dall&#8217;uno al quattro.</p>
<p>Avviando l&#8217;applicazione e giocandoci su un paio di volte sempre con il log aperto scopriamo che al momento non vi è nulla di anomalo, ma dobbiamo proseguire fino a quando l&#8217;app non va in crash.</p>
<p>Non ci ha fatto attendere molto, giusto tre o quattro risposte per aver a portata di mano la nostra soluzione.</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/erroreScoperto-e1336439064763.png" alt="" title="erroreScoperto" width="550" height="104" class="aligncenter size-full wp-image-1806" /></p>
<p>Adesso è tutto veramente <strong>molto</strong> più chiaro..</p>
<p>Ci stampa Domanda0, questo significa che sta cercando all&#8217;interno del nostro plist una chiave che non esiste, quindi capiamo che la generazione del numero casuale si comporta in maniera errata e va modificata in questo modo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="kw4">int</span> randomValue <span class="sy0">=</span>  <span class="br0">&#40;</span>arc4random<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="nu0">4</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="nu0">1</span>;</pre></div></div></div></div></div></div></div>


<p>Perfetto abbiamo risolto il mistero e sistemato l&#8217;applicazione che ora è funzionante.</p>
<h3>Non sempre abbiamo vita semplice</h3>
<p>Abbiamo trovato un errore in un applicazione dove è composto da un solo file di 210 righe con tanto di spazi.</p>
<p>Certo, ricordarsi di scrivere è senza dubbio un grande aiuto nel proseguimento dell&#8217;opera, però a volte se si ha a che fare con grandi progetti che implementano più file e classi, la ricerca dell&#8217;errore può risultare molto più complesso e portare via molto più tempo.</p>
<p>Diciamocelo, scrivere troppi CCLog ci potrebbe mandare in confusione e porterebbe via <strong>memoria</strong> preziosa alla nostra applicazione che verrà ospitata comunque da dei piccoli device come l&#8217;iPhone, quindi dovremmo eliminare tutto prima della pubblicazione.</p>
<p>Come fare quindi quando si ha a che fare con applicazioni di un certo livello?</p>
<p>prima cosa scriviamo del codice con <strong>stile</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">CCLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;nomeClasse nomeMetodo descrizione&quot;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>In questo modo sappiamo sempre da dove nasce anche quando dovremmo riprendere ed eliminare quella riga con il passare del tempo, e vi assicuro che ci scordiamo.</p>
<p>Ora però il difficile.</p>
<p>Dovremmo aver in mente più o meno come si comporta e che flusso ha la nostra applicazione perché l&#8217;abbiamo creata noi.</p>
<p>Dovremmo sapere più o meno cosa viene richiamato facendo delle determinate azioni e che flusso prende, quali metodi o classi va a toccare.</p>
<p>Quindi blocchiamola noi l&#8217;applicazione fino a che non ci porta in errore.</p>
<p>Utilizziamo i break, cliccando sui bordi delle righe</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/impostazioneBreak-e1336440118407.png" alt="" title="impostazioneBreak" width="550" height="391" class="aligncenter size-full wp-image-1809" /></p>
<p>Naturalmente questo in foto è un esempio ed è basato su uno spazio breve per mostrarvi il funzionamento, ma pensate se lo facessimo all&#8217;inizio di ogni metodo chiamato in causa, vedremmo il reale flusso della nostra applicazione</p>
<p>ora facciamo partire l&#8217;applicazione</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/Breaking-e1336440292397.png" alt="" title="Breaking" width="550" height="69" class="aligncenter size-full wp-image-1810" /></p>
<p>si è bloccata l&#8217;applicazione, ma non è un errore, è voluto da noi</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/stoppedBreak1.png" alt="" title="stoppedBreak1" width="364" height="68" class="aligncenter size-full wp-image-1811" /></p>
<p>non ci ha dato <strong>nessun errore</strong> quindi proseguiamo cliccando su play:</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/play.png" alt="" title="play" width="194" height="39" class="aligncenter size-full wp-image-1812" /></p>
<p>e di nuovo abbiamo un blocco di numero due:</p>
<p><img src="http://www.gomonkey.it/wp-content/uploads/2012/05/stoppedBreak21.png" alt="" title="stoppedBreak2" width="364" height="68" class="aligncenter size-full wp-image-1814" /></p>
<p>e così avanti fino a quando non troviamo l&#8217;errore.</p>
<p>Potremmo una volta entrati nel metodo che ci genera l&#8217;errore bloccarlo riga per riga fino ad arrivare alla riga incriminata, oppure utilizzare i CCLog per capire il reale motivo di questo crash</p>
<p>Per togliere i break dobbiamo cliccare nuovamente sulla freccia di colore blu facendola diventare azzurra.</p>
<p>Rimane azzurra solo come pro memoria, per eliminarla definitivamente cliccare con il tasto destro sopra il break e quindi delete breakpoint</p>
<h3>Cosa abbiamo imparato</h3>
<p>La vita del programmatore è spesso quella di trovare soluzioni e ingegnarsi ma a volte potrebbe risultare più noiosa che divertente.<br />
Con questo tutorial abbiamo capito come risparmiare tempo prezioso e andare a caccia del problema.<br />
Spero di essere stato di aiuto sopratutto a chi si avvicina alla programmazione e non ha esperienza tale da risolversi da solo i vari problemi.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/05/a-caccia-di-errori/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CoronaSDK #2 &#8211; Immagini e testi</title>
		<link>http://www.gomonkey.it/2012/05/coronasdk-2-immagini-e-testi/</link>
		<comments>http://www.gomonkey.it/2012/05/coronasdk-2-immagini-e-testi/#comments</comments>
		<pubDate>Mon, 07 May 2012 13:43:33 +0000</pubDate>
		<dc:creator>Alexain</dc:creator>
				<category><![CDATA[Corona SDK]]></category>
		<category><![CDATA[corona sdk]]></category>
		<category><![CDATA[tutorial corona sdk italiano]]></category>
		<category><![CDATA[tutorial italiano corona sdk]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1769</guid>
		<description><![CDATA[Il nostro primo progetto In questo secondo tutorial impareremo ad inserire immagini e testi sullo schermo del nostro device preferito tramite l&#8217;uso del comando display. Potete scaricare il progetto completo con le risorse utilizzate in questo tutorial Innanzitutto creiamo una cartella, metteteci dentro il file immagine che avete appena scaricato e il nostro bel main.lua, che come abbiamo detto nel tutorial precedente, è il file principale che serve a CoronaSDK per avviare l&#8217;app, iniziamo quindi [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: x-large;"><strong>Il nostro primo progetto</strong></span></p>
<p>In questo secondo tutorial impareremo ad inserire immagini e testi sullo schermo del nostro device preferito tramite l&#8217;uso del comando display. Potete scaricare il progetto completo con le risorse utilizzate in questo tutorial</p>
<div class="downloads"><h4>Download <strong>progetto</strong></h4><a href="http://www.gomonkey.it/login/" >Loggati per scaricare il file</a></div>
<p>Innanzitutto creiamo una cartella, metteteci dentro il file immagine che avete appena scaricato e il nostro bel <em>main.lua</em>, che come abbiamo detto nel tutorial precedente, è il file principale che serve a CoronaSDK per avviare l&#8217;app, iniziamo quindi scrivendo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lua"><pre class="de1"><span class="kw1">local</span> background <span class="sy0">=</span> display<span class="sy0">.</span>newImage<span class="br0">&#40;</span><span class="st0">&quot;landscape.jpg&quot;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>In questo modo non facciamo altro che visualizzare sul display una nuova immagine di nome <em>landscape.jpg</em> associandola ad una variabile locale di nome <strong>background</strong>. Se compilate e avviate il progetto, vi apparirà una schermata come questa:</p>
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/05/tut2-img1.png"><img class="alignnone size-full wp-image-1775" src="http://www.gomonkey.it/wp-content/uploads/2012/05/tut2-img1.png" alt="" width="300" height="539" /></a></p>
<p>Continuiamo ora aggiungendo le seguenti righe:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lua"><pre class="de1"><span class="kw1">local</span> mioTesto <span class="sy0">=</span> display<span class="sy0">.</span>newText<span class="br0">&#40;</span><span class="st0">&quot;Ciao Mondo!&quot;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="kw4">nil</span><span class="sy0">,</span> <span class="nu0">40</span><span class="br0">&#41;</span>
mioTesto<span class="sy0">.</span>x <span class="sy0">=</span> display<span class="sy0">.</span>contentWidth <span class="sy0">/</span> <span class="nu0">2</span>
mioTesto<span class="sy0">.</span>y <span class="sy0">=</span> display<span class="sy0">.</span>contentHeight <span class="sy0">/</span> <span class="nu0">4</span>
mioTesto<span class="sy0">:</span>setTextColor<span class="br0">&#40;</span><span class="nu0">255</span><span class="sy0">,</span> <span class="nu0">255</span><span class="sy0">,</span> <span class="nu0">80</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Anche qua come prima creiamo una variabile locale di nome <strong>mioTesto</strong>, solo che anziché una immagine ci mettiamo dentro un testo col comando <em>display.newText</em>, al quale passiamo anche degli altri valori oltre al testo da visualizzare. In particolare i primi due sono il posizionamento X e Y prendendo come riferimento l&#8217;angolo in alto a sinistra del testo, gli diamo 0 perché lo posizionamo dopo con un altro metodo, il terzo è il tipo di carattere da usare, in questo caso <em>nil</em> perché vogliamo usare il font standard del sistema, e l&#8217;ultimo è la grandezza in pixel del carattere.</p>
<p>Nella seconda e terza riga posizioniamo il testo in orizzontale tramite le proprietà x e y della variabile appena creata, ma come potete notare non gli diamo un valore assoluto di posizionamento, bensì gli facciamo calcolare la larghezza (<em>display.contentWidth</em>) o l&#8217;altezza (<em>display.contentHeight</em>) dello schermo, e poi dividiamo il primo per due in modo da centrare il testo orizzontalmente, e per quattro il secondo in modo da averlo esattamente ad un quarto di distanza dal bordo superiore. Utilizziamo questo sistema perché così avremo lo stesso risultato sia se la nostra app viene eseguita su iPhone, sia sugli smartphone Android che hanno varie misure di schermo.</p>
<p>Nell&#8217;ultima riga scritta richiamiamo il metodo <em>setTextColor</em>, che ci permette di impostare il colore del testo passandogli i tre valori rgb standard da 0 a 255 per ogni colore primario. Da notare come in Lua i metodi vengano richiamati utilizzando il simbolo dei due punti:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lua"><pre class="de1">variabile<span class="sy0">:</span>metodo<span class="br0">&#40;</span>valore<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>in objective-C questo tipo di comando sarebbe stato dato sotto questa forma:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="obj-c"><pre class="de1">[variabile metodo:valore]</pre></div></div></div></div></div></div></div>


<p>Se proviamo ora a far partire l&#8217;emulatore avremo una scritta giallina sull&#8217;immagina di sfondo in questo modo:</p>
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/05/tut2-img2.png"><img class="alignnone size-full wp-image-1778" src="http://www.gomonkey.it/wp-content/uploads/2012/05/tut2-img2.png" alt="" width="300" height="539" /></a></p>
<p>Proviamo ora ad aggiungere un secondo testo più piccolo e bianco sotto il primo, usando una forma diversa, cioè dichiariamo prima due variabili che contengono il testo da visualizzare:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lua"><pre class="de1"><span class="kw1">local</span> testoSaluto <span class="sy0">=</span> <span class="st0">&quot;Saluti da&quot;</span>
<span class="kw1">local</span> testoNome <span class="sy0">=</span> <span class="st0">&quot;GoMonkey.it&quot;</span></pre></div></div></div></div></div></div></div>


<p>e poi usando gli stessi comandi di prima per visualizzare, posizionare e colorare il nuovo testo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lua"><pre class="de1"><span class="kw1">local</span> secondoTesto <span class="sy0">=</span> display<span class="sy0">.</span>newText<span class="br0">&#40;</span>testoSaluto <span class="sy0">..</span> <span class="st0">&quot; &quot;</span> <span class="sy0">..</span> testoNome<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> native<span class="sy0">.</span>systemFont<span class="sy0">,</span> <span class="nu0">20</span><span class="br0">&#41;</span>
secondoTesto<span class="sy0">.</span>x <span class="sy0">=</span> display<span class="sy0">.</span>contentWidth <span class="sy0">/</span> <span class="nu0">2</span>
secondoTesto<span class="sy0">.</span>y <span class="sy0">=</span> display<span class="sy0">.</span>contentHeight<span class="sy0">/</span> <span class="nu0">3</span>
secondoTesto<span class="sy0">:</span>setTextColor<span class="br0">&#40;</span><span class="nu0">255</span><span class="sy0">,</span> <span class="nu0">255</span><span class="sy0">,</span> <span class="nu0">255</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Come avrete notato abbiamo usato i nomi delle variabili questa volta, concatenando le due scritte tra loro ed uno spazio in mezzo, tramite il comando di concatenamento delle stringhe, che in Lua sono due punti affiancati; inoltre questa volta abbiamo dichiarato esplicitamente il font da usare per il testo, che è sempre il font di sistema, quindi avremmo potuto usare <em>nil</em> anche qua. Le restanti righe sono simili alle precedenti ma con un posizionamento diverso e un colore bianco puro.</p>
<p>Ricompiliamo ancora una volta e avremo la nostra schermata finale:</p>
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/05/tut2-img3.png"><img class="alignnone size-full wp-image-1777" src="http://www.gomonkey.it/wp-content/uploads/2012/05/tut2-img3.png" alt="" width="300" height="539" /></a></p>
<p>Non mi resta che salutarvi e ricordarvi che se avete bisogno di chiarimenti potete scrivere nei commenti. A presto col prossimo tutorial!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/05/coronasdk-2-immagini-e-testi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cocos2D: Creiamo un quiz game utilizzando i file property list</title>
		<link>http://www.gomonkey.it/2012/05/cocos2d-creiamo-un-quiz-game-utilizzando-i-file-property-list/</link>
		<comments>http://www.gomonkey.it/2012/05/cocos2d-creiamo-un-quiz-game-utilizzando-i-file-property-list/#comments</comments>
		<pubDate>Sun, 06 May 2012 23:23:04 +0000</pubDate>
		<dc:creator>Gabriele Carbonai</dc:creator>
				<category><![CDATA[cocos2D]]></category>
		<category><![CDATA[.plist]]></category>
		<category><![CDATA[cocos2d menu]]></category>
		<category><![CDATA[cocos2d plist]]></category>
		<category><![CDATA[cocos2d quiz game]]></category>
		<category><![CDATA[cocos2d tutorial quiz game]]></category>
		<category><![CDATA[file plist]]></category>
		<category><![CDATA[games tutorial]]></category>
		<category><![CDATA[intValue]]></category>
		<category><![CDATA[iphone game developer]]></category>
		<category><![CDATA[itemFromString]]></category>
		<category><![CDATA[menu cocos2d]]></category>
		<category><![CDATA[plist menu]]></category>
		<category><![CDATA[programmazione cocos2D]]></category>
		<category><![CDATA[programmazione iphone]]></category>
		<category><![CDATA[programmazione objective c]]></category>
		<category><![CDATA[property list]]></category>
		<category><![CDATA[property list menu]]></category>
		<category><![CDATA[tutorial cocos2d]]></category>
		<category><![CDATA[tutorial cocos2d italiano]]></category>
		<category><![CDATA[tutorial gioco completo]]></category>
		<category><![CDATA[tutorial italiano cocos2d]]></category>
		<category><![CDATA[tutorial plist]]></category>
		<category><![CDATA[valueForKey]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1741</guid>
		<description><![CDATA[Oggi su richiesta di un nostro utente vi mostriamo come realizzare un quiz game utilizzando i file property list come una sorta di base dati. Il file property è a tutti gli effetti un file XML. Iniziamo con il creare un nuovo progetto cocos2d, io l&#8217;ho chiamato semplicemente &#8220;quiz game&#8221; Creazione del file Property list Per prima dobbiamo aggiungere un nuovo file plist, per fare questo andiamo sul menu di destra con tutti i nostri [...]]]></description>
			<content:encoded><![CDATA[<p>Oggi su richiesta di un nostro utente vi mostriamo come realizzare un quiz game utilizzando i file property list come una sorta di base dati.</p>
<p>Il file property è a tutti gli effetti un file XML.</p>
<p>Iniziamo con il creare un nuovo progetto <strong>cocos2d</strong>, io l&#8217;ho chiamato semplicemente &#8220;quiz game&#8221;</p>
<h3>Creazione del file Property list</h3>
<p>Per prima dobbiamo aggiungere un nuovo file plist, per fare questo andiamo sul menu di destra con tutti i nostri file e clicchiamo con il tasto destro (ctrl + click) sulla cartella del progetto e quando apparirà il menu clicchiamo su &#8220;New File&#8221;</p>
<p><img class="aligncenter size-full wp-image-1742" title="newFile" src="http://www.gomonkey.it/wp-content/uploads/2012/05/newFile.png" alt="" width="356" height="418" /></p>
<p>Scegliamo dunque di creare un nuovo file <strong>Property List</strong> cliccando sul menu di sinistra Resource in IOS</p>
<p><img class="aligncenter size-full wp-image-1744" title="propertiList" src="http://www.gomonkey.it/wp-content/uploads/2012/05/propertiList-e1336318078643.png" alt="" width="550" height="373" /></p>
<p>Infine salviamo il file dopo che è stato rinominato, in questo caso l&#8217;ho semplicemente chiamato &#8220;Domande&#8221;</p>
<p><img class="aligncenter size-full wp-image-1745" title="save" src="http://www.gomonkey.it/wp-content/uploads/2012/05/save.png" alt="" width="541" height="468" /></p>
<p>Il nostro menu ora apparirà come in foto</p>
<p><img class="aligncenter size-full wp-image-1743" title="menuConPlist" src="http://www.gomonkey.it/wp-content/uploads/2012/05/menuConPlist.png" alt="" width="260" height="593" /></p>
<h3>Lavoriamo con le Property List</h3>
<p>Ora apriamo il file Domande.plist, vi apparirà un quadro totalmente bianco, ma non abbiate paura perché è semplicemente vuoto e noi ora lo andiamo a riempire.</p>
<p>Clicchiamo con il tasto destro in un punto qualsiasi del file bianco e all&#8217;apertura del menu clicchiamo su <strong>Add Row</strong> che in Italiano significa nuova riga</p>
<p><img class="aligncenter size-full wp-image-1746" title="Domanda1" src="http://www.gomonkey.it/wp-content/uploads/2012/05/Domanda1-e1336318144714.png" alt="" width="550" height="187" /></p>
<p>Al posto di <strong>New Item</strong> inseriamo il testo Domanda 1 e in type mettiamo <strong>Dictionary</strong> dal menu a tendina.</p>
<p>Ora ripetiamo le operazioni per quattro volte in modo da avere quattro domande.</p>
<p>Ci sono due metodi, o facciamo come sopra oppure basterebbe semplicemente cliccare sul tasto con il simbolo più (+) che trovate nella prima riga.</p>
<p>Fate però attenzione che se decidete di cliccare sul tasto + la freccia sulla sinistra deve puntare a destra, se puntasse in basso saremmo all&#8217;interno di quella riga e quindi andremmo ad aggiungere dei nuovi record alla domanda uno e questo lo faremo più avanti.</p>
<p><img class="aligncenter size-full wp-image-1747" title="DomandeCompleto" src="http://www.gomonkey.it/wp-content/uploads/2012/05/DomandeCompleto-e1336318173853.png" alt="" width="550" height="216" /></p>
<p>Ora passiamo all&#8217;inserimento dei record, ovvero:</p>
<ul>
<li>La domanda</li>
<li>Le quattro possibilità di risposta</li>
<li>La risposta esatta</li>
</ul>
<p>Prima avevo detto di stare attenti alla freccia affianco alla domanda 1, ora clicchiamo sopra quella freccia e attendiamo che cambi posizione da destra verso il basso, una volta che questo è avvenuto clicchiamo il simbolo più (+) sulla riga della domanda in modo da creare una nuova riga ma all&#8217;interno della domanda.</p>
<p>Le domande sono di tipo <strong>Dictionary</strong> e questo è importante ma presto parleremo anche dei vari tipi disponibili per i file plist.</p>
<p>Alla nuova riga creiamo la domanda chiamandola <strong>Titolo</strong> lasciando come <strong>type</strong> il valore default che è string e in value un testo che sarà la nostra domanda: Domanda numero 1 va più che bene per capire cosa stiamo facendo.</p>
<p>Se fate attenzione questa nuova riga non ha la freccia sulla sinistra, questo perché non è del tipo dictionary.</p>
<p>Ora clicchiamo nuovamente sul pulsante più.</p>
<p>Possiamo decidere se farlo sulla riga appena creata oppure sulla riga madre baste che quest&#8217;ultima sia aperta con freccia che guarda verso il basso.</p>
<p>Ora dobbiamo creare le seguenti righe:</p>
<ul>
<li>Risposta1 di tipo string con value: Risposta prima</li>
<li>Risposta2 di tipo string con value: Risposta seconda</li>
<li>Risposta3 di tipo string con value: Risposta terza</li>
<li>Risposta4 di tipo string con value: Risposta quarta</li>
<li>Soluzione di tipo number con value: 1</li>
</ul>
<p>Infine abbiamo 6 righe dove le prime cinque contengono delle stringe mentre l&#8217;ultima riga è di tipo <strong>number</strong> e contiene un numero, in questo caso è 1.</p>
<p>La scelta del numero 1 è dovuto al fatto di evitare confusione nel tutorial, in pratica la prima domanda sarà quella corretta mentre le altre saranno sbagliate.</p>
<p>Nelle prossime domande invece il valore sarà rispettivo al numero di domanda in modo che quando andremo a testare l&#8217;applicazione sappiamo che alla domanda terza la risposta corretta sarà la terza.</p>
<p>Ripetiamo ora tutte le operazioni con le altre tre domande mancanti fino ad aver un risultato del genere:</p>
<p><img class="aligncenter size-full wp-image-1751" title="PlistCompleto" src="http://www.gomonkey.it/wp-content/uploads/2012/05/PlistCompleto.png" alt="" width="603" height="675" /></p>
<h3>I Tipi nelle property</h3>
<p>Meglio fare un attimo di chiarezza su i tipi che mette a disposizione le property list, fino ad ora abbiamo visto dictionary, string e number, ma cosa fanno e quanti altri ce ne sono?</p>
<p><strong>Dictionary</strong> è praticamente il contenitore di quello che andremo mettere al suo interno, una scatola contenente tutte le altre righe.</p>
<p><strong>Array</strong> Possibilità di creare array anche utilizzando i plist</p>
<p><strong>String</strong> se di questo tipo vi andrà al suo interno del testo</p>
<p><strong>Number</strong> Contiene numeri sia di tipo <strong>intero</strong> sia <strong>float</strong> separati da una virgola</p>
<p><strong>Date</strong> Stampa la data con ora in questo formato: 06/mag/2012 17.57.55</p>
<p><strong>Data</strong> è un tipo di dato codificato in ascii <a title="Base64" href="http://it.wikipedia.org/wiki/Base64">Wikipedia Base64</a></p>
<p><strong>Boolean</strong> è per verificare se la condizione è vera o falsa</p>
<p>per altre informazioni sui file plist vi rimando alla <a title="property list wikipedia" href="http://en.wikipedia.org/wiki/Property_list">pagina di wikipedia</a></p>
<h3>Organizziamo il progetto</h3>
<p>Prima di iniziare a scrivere il codice dobbiamo capire cosa vogliamo fare.</p>
<p>Dobbiamo stampare una domanda e quattro risposte, sapere sin da subito quale delle risposte è esatta e pilotare la risposta data dall&#8217;utente e segnargli il risultato.</p>
<p>Infine aggiungere un punteggio incrementando di 50 punti per ogni risposta corretta e decrementare di 20 punti per ogni risposta sbagliate e cambiare colore al punteggio in verde se il punteggio è attivo, in rosso invece se è passivo.</p>
<h3>I metodi necessari</h3>
<p>Sembra strano ma non faremo molto codice, comunque abbiamo bisogno di alcuni metodi e questi sono:</p>
<ul>
<li>eliminaLabel</li>
<li>corretto</li>
<li>sbagliato</li>
<li>creaDomanda</li>
<li>init</li>
<li>dealloc</li>
</ul>
<h3>helloWorldLayer.h</h3>
<p>All&#8217;interno dell&#8217;interface incollare quanto segue:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">    CGSize size;
&nbsp;
    <span class="kw5">NSString</span> <span class="sy0">*</span>path;
    <span class="kw5">NSString</span> <span class="sy0">*</span>finalPath; 
    <span class="kw5">NSString</span> <span class="sy0">*</span>domanda;
&nbsp;
    <span class="kw5">NSDictionary</span> <span class="sy0">*</span>plistData;
&nbsp;
    <span class="kw5">NSArray</span> <span class="sy0">*</span>dictionary;
&nbsp;
    <span class="kw4">int</span> increment;
&nbsp;
    CCMenuItem <span class="sy0">*</span>item;
    CCMenu <span class="sy0">*</span>menu;
&nbsp;
    CCLabelTTF <span class="sy0">*</span>labelRisultato;
    CCLabelTTF <span class="sy0">*</span>labelDomanda;
    CCLabelTTF <span class="sy0">*</span>pointLabel;</pre></div></div></div></div></div></div></div>


<p>CGSize ci servirà per posizionare gli elementi sullo schermo prendendo la dimensione del device.</p>
<p>Poi abbiamo tre variabili di tipo NSString un NSDictionary e infine un NSArray che ci serviranno per leggere il file .plist</p>
<p>una variabile di tipo integer che utilizzeremo per il punteggio.</p>
<p>Infine tre label che usiamo per le domande, le risposte e la stampa del punteggio.</p>
<p>All&#8217;esterno subito dopo la dichiarazione di scena inseriamo questo metodo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>creaDomanda;</pre></div></div></div></div></div></div></div>


<h3>Il cuore dell&#8217;applicazione</h3>
<p>Partiamo con il scrivere per prima cosa tutti i metodi lasciandoli vuoti.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>eliminaLabel<span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>corretto<span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>sbagliato<span class="br0">&#123;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>creaDomanda<span class="br0">&#123;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Tutto va sopra il metodo <strong>init</strong>.</p>
<p>Entriamo ora nel metodo init eliminando tutto quanto di default e incollando il seguente codice:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">size <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>CCDirector sharedDirector<span class="br0">&#93;</span> winSize<span class="br0">&#93;</span>;
&nbsp;
        <span class="co2">// Apre il file plist</span>
        path <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span><span class="kw5">NSBundle</span> mainBundle<span class="br0">&#93;</span> bundlePath<span class="br0">&#93;</span>;
        finalPath <span class="sy0">=</span> <span class="br0">&#91;</span>path stringByAppendingPathComponent<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Domande.plist&quot;</span><span class="br0">&#93;</span>;
        plistData <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span><span class="kw5">NSDictionary</span> dictionaryWithContentsOfFile<span class="sy0">:</span>finalPath<span class="br0">&#93;</span> retain<span class="br0">&#93;</span>;
&nbsp;
<span class="br0">&#91;</span>self creaDomanda<span class="br0">&#93;</span>;
&nbsp;
        <span class="co2">// Punteggio</span>
        pointLabel <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Points: 0&quot;</span> fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">18</span><span class="br0">&#93;</span>;
        pointLabel.position <span class="sy0">=</span>  ccp<span class="br0">&#40;</span> size.width <span class="sy0">-</span> <span class="nu0">60</span> , size.height <span class="sy0">-</span> <span class="nu0">18</span> <span class="br0">&#41;</span>;
        <span class="br0">&#91;</span>self addChild<span class="sy0">:</span> pointLabel<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Il codice è diviso in tre parti.</p>
<p>1. Andiamo ad aprire il file plist;<br />
2. richiamiamo il metodo creaDomanda<br />
3. Aggiungiamo la label del punteggio con valore 0</p>
<h3>Metodo creaDomanda</h3>
<p><strong>N.B.</strong> è stato riveduto un bug in questa parte di codice, puoi trovare la spiegazione all&#8217;errore all&#8217;interno di questo <a href="http://www.gomonkey.it/forum/programmazione-video-giochi-group1/framework-cocos2d-forum1/problema-con-il-tutorial-quiz-game-thread60.0/#postid-242">post nel forum</a></p>
<hr />
<p>Passiamo ora al metodo che gestisce la creazione della domanda:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>creaDomanda<span class="br0">&#123;</span>
&nbsp;
    <span class="kw4">int</span> randomValue <span class="sy0">=</span>  <span class="br0">&#40;</span>arc4random<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="nu0">4</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="nu0">1</span>;
&nbsp;
    <span class="kw5">NSString</span> <span class="sy0">*</span>stringa <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Domanda%i&quot;</span>, randomValue<span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Apre il dictionary</span>
    dictionary <span class="sy0">=</span> <span class="br0">&#91;</span>plistData objectForKey<span class="sy0">:</span>stringa<span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Preleva la domanda</span>
    domanda <span class="sy0">=</span> <span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Titolo&quot;</span><span class="br0">&#93;</span>;
&nbsp;
    labelDomanda <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>domanda fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">24</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// position the label on the center of the screen</span>
    labelDomanda.position <span class="sy0">=</span>  ccp<span class="br0">&#40;</span> size.width <span class="sy0">/</span><span class="nu0">2</span> , <span class="nu0">280</span> <span class="br0">&#41;</span>;
&nbsp;
    <span class="co2">// add the label as a child to this Layer</span>
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span> labelDomanda<span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Estraggo la risposta esatta dal file plist e lo converto da number ad intero</span>
    <span class="kw4">int</span> rispostaEsatta <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Soluzione&quot;</span><span class="br0">&#93;</span> intValue<span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Creiamo il menu dinamicamente</span>
&nbsp;
    menu <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenu menuWithItems<span class="sy0">:</span><span class="kw2">nil</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">1</span>; i&lt;<span class="nu0">5</span>;i<span class="sy0">++</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span class="kw1">if</span><span class="br0">&#40;</span>rispostaEsatta <span class="sy0">==</span> i<span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
            <span class="co2">// La risposta che viene stampata è quella corretta quindi lo mandiamo in un metodo di vincita</span>
&nbsp;
            item <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span>
                                                               <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Risposta%i&quot;</span>,i<span class="br0">&#93;</span> <span class="br0">&#93;</span>
                                                       target<span class="sy0">:</span>self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>corretto<span class="br0">&#41;</span><span class="br0">&#93;</span>;
&nbsp;
        <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span>
&nbsp;
            <span class="co2">// La risposta che viene stampata non è corretta e quini lo mandiamo in un metodo di errore</span>
            item <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span>
                                                               <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Risposta%i&quot;</span>,i<span class="br0">&#93;</span> <span class="br0">&#93;</span>
                                                       target<span class="sy0">:</span>self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>sbagliato<span class="br0">&#41;</span><span class="br0">&#93;</span>;
        <span class="br0">&#125;</span>
&nbsp;
        <span class="br0">&#91;</span>menu addChild<span class="sy0">:</span>item<span class="br0">&#93;</span>;
&nbsp;
    <span class="br0">&#125;</span>
    <span class="br0">&#91;</span>menu alignItemsVertically<span class="br0">&#93;</span>;
&nbsp;
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>menu<span class="br0">&#93;</span>;
&nbsp;
&nbsp;
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Per prima cosa abbiamo bisogno di un numero random per capire quale delle quattro domande dobbiamo andare a leggere e abbiamo fatto in questo modo utilizzando arc4random()</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="kw4">int</span> randomValue <span class="sy0">=</span>  <span class="br0">&#40;</span>arc4random<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">%</span> <span class="nu0">5</span><span class="br0">&#41;</span>;</pre></div></div></div></div></div></div></div>


<p>preleva un numero che va da 1 a 4.</p>
<p>Ricordiamo che all&#8217;interno del file property abbiamo quattro righe di tipo dictionary che si chiamano Domanda1, Domanda2, Domanda3 e Domanda4.</p>
<p>I numeri li abbiamo estratti casualmente nella prima riga, ora invece dobbiamo concatenare il testo al numero in modo da andare ad aprire uno solo dei dictionary e lo facciamo in questo modo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"> <span class="kw5">NSString</span> <span class="sy0">*</span>stringa <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Domanda%i&quot;</span>, randomValue<span class="br0">&#93;</span>;
dictionary <span class="sy0">=</span> <span class="br0">&#91;</span>plistData objectForKey<span class="sy0">:</span>stringa<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Ora abbiamo aperto uno dei quattro dizionari.</p>
<p>Ci manca solo da stampare a schermo la domanda e le quattro risposte e vedere quale di queste è la risposta corretta.</p>
<p>tramite <strong>valueForKey</strong> preleviamo il testo della domanda e successivamente faremo la stessa cosa per le risposte</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="co2">// Preleva la domanda</span>
    domanda <span class="sy0">=</span> <span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Titolo&quot;</span><span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>infine stampiamo a monitor</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">labelDomanda <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>domanda fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">24</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// position the label on the center of the screen</span>
    labelDomanda.position <span class="sy0">=</span>  ccp<span class="br0">&#40;</span> size.width <span class="sy0">/</span><span class="nu0">2</span> , <span class="nu0">280</span> <span class="br0">&#41;</span>;
&nbsp;
    <span class="co2">// add the label as a child to this Layer</span>
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span> labelDomanda<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Ora estraiamo il numero della risposta esatta. Ricordate? abbiamo pensato giusto di mettere come risposta lo stesso numero della domanda, quindi se la domanda sarà la seconda, la risposta corretta sarà la seconda.</p>
<p>Abbiamo un problema&#8230; in plist la risposta equivale a number ma noi per poter verificare se è corretta abbiamo più avanti la necessità di utilizzare un intero, quindi ci comportiamo di conseguenza:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"> <span class="co2">// Estraggo la risposta esatta dal file plist e lo converto da number ad intero</span>
    <span class="kw4">int</span> rispostaEsatta <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Soluzione&quot;</span><span class="br0">&#93;</span> intValue<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>tramite <strong>intValue</strong> abbiamo trasformato il nostro number in int e quindi possiamo proseguire tranquillamente.</p>
<p>Creiamo il menu <strong>dinamicamente</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">    menu <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenu menuWithItems<span class="sy0">:</span><span class="kw2">nil</span><span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Al contrario di come abbiamo sempre fatto ora il menu è senza items perché li andremo ad aggiungere dinamicamente tramite <strong>ciclo for</strong></p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">1</span>; i</pre></div></div></div></div></div></div></div>


<p>Prima cosa da notare, il ciclo parte da 1 e continuerà fino a quando il valore della variabile i sarà minore di 5, quindi a 4.</p>
<p>Solitamente nei tutorial si vede questo valore partire da 0, ma sono solo scelte, noi abbiamo bisogno del valore 1 altrimenti ci genererà un errore al programma.</p>
<p>Vediamo ora se la risposta è esatta tramite un controllo di flusso IF-ELSE</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>rispostaEsatta <span class="sy0">==</span> i<span class="br0">&#41;</span><span class="br0">&#123;</span></pre></div></div></div></div></div></div></div>


<p><strong>rispostaEsatta</strong> contiene il numero della risposta corretta che abbiamo precedentemente prelevato e trasformato in intero, proprio per poter far funzionare questa porzione di codice.</p>
<p>Ora mentre il programma cicla la variabile i si incrementa di uno e andrà a stampare le risposte, se la risposta che viene stampata è quella corretta allora l&#8217;istruzione risulterà vera ed entrerà nel ciclo, altrimenti salta il blocco e passa oltre.</p>
<p>Le items vengono create dinamicamente come già detto, ma vediamo nel dettaglio:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">item <span class="sy0">=</span> <span class="br0">&#91;</span>CCMenuItemFont itemFromString<span class="sy0">:</span><span class="br0">&#91;</span>dictionary valueForKey<span class="sy0">:</span><span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Risposta%i&quot;</span>,i<span class="br0">&#93;</span> <span class="br0">&#93;</span>target<span class="sy0">:</span>self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>corretto<span class="br0">&#41;</span><span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Una sola riga per fare innumerevoli items dinamicamente, credo sia fantastico!</p>
<p>da notare solo una cosa: <strong>itemFromString</strong> dove solitamente avremmo fatto in questo modo: itemFromString:@&#8221;nome menu&#8221;, genera ora il testo dinamicamente andando a prelevare all&#8217;interno del file plist la nostra risposta utilizzando la parola chiave Risposta più il numero di risposta che in questo caso ci viene dato dal ciclo e dalla variabile int i.</p>
<p>Infine nel selector rimandiamo al metodo <strong>corretto</strong>, questo perché siamo all&#8217;interno dell&#8217;istruzione IF mentre nel blocco ELSE che genera gli altri tre items rimandiamo al metodo <strong>sbagliato</strong></p>
<p>Quindi ora non ci tocca che aggiungere gli items al menu in questo modo, sempre all&#8217;interno del ciclo for:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="br0">&#91;</span>menu addChild<span class="sy0">:</span>item<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>e per finire subito all&#8217;esterno del ciclo for creiamo il menu</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="br0">&#91;</span>menu alignItemsVertically<span class="br0">&#93;</span>;
<span class="br0">&#91;</span>self addChild<span class="sy0">:</span>menu<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Non ho pensato a nessun settaggio di posizione e colore.</p>
<p>Per questo metodo abbiamo concluso.</p>
<h3>Se sbagliamo abbiamo bisogno di avvisare il giocatore</h3>
<p>Passiamo ora al metodo di nome sbagliato</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>sbagliato<span class="br0">&#123;</span>
    CCLOG<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;Sbagliato&quot;</span><span class="br0">&#41;</span>;
&nbsp;
    labelRisultato <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Hai sbagliato!&quot;</span>
    fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">24</span><span class="br0">&#93;</span>;
    <span class="br0">&#91;</span>labelRisultato setColor<span class="sy0">:</span>ccc3<span class="br0">&#40;</span><span class="nu0">255</span>, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#93;</span>;
    labelRisultato.position <span class="sy0">=</span> ccp<span class="br0">&#40;</span>size.width <span class="sy0">/</span> <span class="nu0">2</span>, <span class="nu0">40</span><span class="br0">&#41;</span>;
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>labelRisultato<span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Richiamiamo il metodo per eliminare la label dopo 0,3 secondi</span>
    <span class="br0">&#91;</span>self performSelector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>eliminaLabel<span class="br0">&#41;</span> withObject<span class="sy0">:</span><span class="kw2">nil</span> afterDelay<span class="sy0">:</span><span class="nu0">0.3</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Punteggio</span>
    increment <span class="sy0">=</span> increment <span class="sy0">-</span> <span class="nu0">20</span>;
    <span class="br0">&#91;</span>pointLabel setString<span class="sy0">:</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span> <span class="co3">@</span><span class="st0">&quot;Points: %i&quot;</span>, increment<span class="br0">&#93;</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="kw1">if</span><span class="br0">&#40;</span> increment &lt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>        
   pointLabel.color <span class="sy0">=</span> ccc3<span class="br0">&#40;</span><span class="nu0">255</span>, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span>; <span class="co2">// COLORE ROSSO    </span>
     <span class="br0">&#125;</span><span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>increment &gt; <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
        pointLabel.color <span class="sy0">=</span> ccc3<span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">255</span>, <span class="nu0">1</span><span class="br0">&#41;</span>; <span class="co2">// COLORE VERDE</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Le prime quattro righe generano una label di colore rosso posizionato sotto le risposte che avvisano il giocatore che ha sbagliato la risposta.</p>
<p>Quindi andiamo a chiamare il metodo che elimina la label dopo 0,3 secondi</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="br0">&#91;</span>self performSelector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>eliminaLabel<span class="br0">&#41;</span> withObject<span class="sy0">:</span><span class="kw2">nil</span> afterDelay<span class="sy0">:</span><span class="nu0">0.3</span><span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>infine settiamo il punteggio togliendo 20 punti per ogni risposta sbagliata.</p>
<p>Ultimo passaggio controlliamo tramite un controllo di flusso IF-ELSE se il punteggio è maggiore o minore di 0 e settiamo il colore della label a seconda se siamo in attivo o in positivo.</p>
<h3>Quando è giusto abbiamo un comportamento simile ma diverso</h3>
<p>Controlliamo come è stato sviluppato il metodo di nome corretto:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>corretto<span class="br0">&#123;</span>
    CCLOG<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;Corretto&quot;</span><span class="br0">&#41;</span>;
&nbsp;
    <span class="kw1">if</span> <span class="br0">&#40;</span>menu<span class="br0">&#41;</span> <span class="br0">&#91;</span>self removeChild<span class="sy0">:</span>menu cleanup<span class="sy0">:</span><span class="kw2">YES</span><span class="br0">&#93;</span>; 
&nbsp;
    <span class="kw1">if</span> <span class="br0">&#40;</span>labelDomanda<span class="br0">&#41;</span> <span class="br0">&#91;</span>self removeChild<span class="sy0">:</span>labelDomanda cleanup<span class="sy0">:</span><span class="kw2">YES</span><span class="br0">&#93;</span>;
&nbsp;
    labelRisultato <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Corretto!&quot;</span> fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">34</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="br0">&#91;</span>labelRisultato setColor<span class="sy0">:</span>ccc3<span class="br0">&#40;</span><span class="nu0">255</span>, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#93;</span>;
&nbsp;
    labelRisultato.position <span class="sy0">=</span> ccp<span class="br0">&#40;</span>size.width <span class="sy0">/</span> <span class="nu0">2</span>, size.height <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;
&nbsp;
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>labelRisultato<span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Richiamiamo il metodo per eliminare la label dopo un secondo</span>
    <span class="br0">&#91;</span>self performSelector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>eliminaLabel<span class="br0">&#41;</span> withObject<span class="sy0">:</span><span class="kw2">nil</span> afterDelay<span class="sy0">:</span><span class="nu0">1.0</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Richiamiamo una nuova domanda dopo un secondo</span>
    <span class="br0">&#91;</span>self performSelector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>creaDomanda<span class="br0">&#41;</span> withObject<span class="sy0">:</span><span class="kw2">nil</span> afterDelay<span class="sy0">:</span><span class="nu0">1.0</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="co2">// Punteggio</span>
    increment <span class="sy0">=</span> increment <span class="sy0">+</span> <span class="nu0">50</span>;
    <span class="br0">&#91;</span>pointLabel setString<span class="sy0">:</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span> <span class="co3">@</span><span class="st0">&quot;Points: %i&quot;</span>, increment<span class="br0">&#93;</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="kw1">if</span><span class="br0">&#40;</span> increment &lt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>          
     pointLabel.color <span class="sy0">=</span> ccc3<span class="br0">&#40;</span><span class="nu0">255</span>, <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span>; <span class="co2">// COLORE ROSSO     </span>
      <span class="br0">&#125;</span><span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>increment &gt; <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
        pointLabel.color <span class="sy0">=</span> ccc3<span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">255</span>, <span class="nu0">1</span><span class="br0">&#41;</span>; <span class="co2">// COLORE VERDE</span>
&nbsp;
    <span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Prima preoccupazione, eliminiamo se esistente sia il menu che la label della domanda.</p>
<p>Creiamo un label con scritto &#8220;corretto&#8221; posizionandola in centro e con un carattere maggiore, tanto abbiamo spazio in quanto tutto è sparito.</p>
<p>Quindi eliminiamo la label e creiamo una nuova domanda</p>
<p>infine incrementiamo il punteggio di 50.</p>
<h3>Ultimo passaggio: eliminiamo le label</h3>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>eliminaLabel<span class="br0">&#123;</span>
&nbsp;
    <span class="br0">&#91;</span>self removeChild<span class="sy0">:</span>labelRisultato cleanup<span class="sy0">:</span><span class="kw2">YES</span><span class="br0">&#93;</span>;
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Penso che non ci siano parole per descrivere cosa fa questo metodo.</p>
<h3>Di cosa non mi sono preoccupato</h3>
<p>Non ho pensato a mettere un controllo di domande e quindi sicuramente si ripeteranno, ma credo che se si fa un buon lavoro e si scrivono centinaia e centinaia di domande, il ripetersi di una inizi a diventare veramente difficile.</p>
<h3>Conclusioni</h3>
<p>Spero veramente di aver risolto i problemi di molti di loro che in questi tempi mi hanno chiesto tutorial sui file plist e su come creare dei quiz game.</p>
<p>Auguro a tutti voi di creare degli ottimi quiz game partendo da questa base e se vi farà piacere potrete mettere gomonkey tra i credits.</p>
<p><div class="downloads"><h4>Download <strong>Quiz game</strong></h4><a href="http://www.gomonkey.it/login/" >Loggati per scaricare il file</a></div>QuizGame</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/05/cocos2d-creiamo-un-quiz-game-utilizzando-i-file-property-list/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CoronaSDK #1: Primi passi con l&#8217;SDK</title>
		<link>http://www.gomonkey.it/2012/04/coronasdk-1-primi-passi-con-lsdk/</link>
		<comments>http://www.gomonkey.it/2012/04/coronasdk-1-primi-passi-con-lsdk/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 19:32:51 +0000</pubDate>
		<dc:creator>Alexain</dc:creator>
				<category><![CDATA[Corona SDK]]></category>
		<category><![CDATA[corona sdk]]></category>
		<category><![CDATA[tutorial corona sdk italiano]]></category>
		<category><![CDATA[tutorial italiano corona sdk]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1726</guid>
		<description><![CDATA[Introduzione Corona SDK è un eccellente tool di sviluppo per giochi e applicazioni mobile. Il vantaggio principale nell&#8217;usare questo SDK anziché quello ufficiale stà nella possibilità di poter compilare nativamente app per iPhone, iPad, Kindle Fire, Nook Color, smartphone e tablet Android in modo tale che l&#8217;eseguibile finale sia al 100% Objective-C o C++, a differenza di altri strumenti cross-platform (es. PhoneGap, GameSalad, Marmalade) che utilizzano l&#8217;HTML5 embeddato in una schermata web. E&#8217; possibile sfruttare [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: x-large"><strong>Introduzione</strong></span></p>
<p>Corona SDK è un eccellente tool di sviluppo per giochi e applicazioni mobile. Il vantaggio principale nell&#8217;usare questo SDK anziché quello ufficiale stà nella possibilità di poter compilare nativamente app per <strong>iPhone, iPad, Kindle Fire, Nook Color, smartphone e tablet Android</strong> in modo tale che l&#8217;eseguibile finale sia al 100% Objective-C o C++, a differenza di altri strumenti cross-platform (es. PhoneGap, GameSalad, Marmalade) che utilizzano l&#8217;HTML5 embeddato in una schermata web. E&#8217; possibile sfruttare tutte le caratteristiche hardware dei dispositivi come fotocamera, accellerometro, GPS, ecc; nonché accedere alle funzionalità uniche di ogni sistema operativo come, nel caso di iOS, al MapKit, GameKit, acquisti in-app, notifiche push e altro. Gli sviluppatori di Corona hanno anche inserito dei comandi per interfacciarsi a servizi esterni (Facebook, OpenFeint, Flurry Analytics), il tutto programmabile in modo molto semplice grazie ad un linguaggio di nome <strong>Lua</strong>, molto simile ad ActionScript o Javascript, che consente di essere produttivi in pochissimo tempo, lasciando la gestione di altri compiti (es. gestione della memoria, ciclo di vita dell&#8217;app) al compilatore di CoronaSDK.</p>
<p>Purtroppo c&#8217;è anche l&#8217;altro lato della medaglia. Sebbene sia possibile scaricarlo gratuitamente, il compilatore è utilizzabile solamente con il suo simulatore integrato, oppure per testare le app su un dispositivo fisico, ma per creare i pacchetti da inviare all&#8217;AppStore o all&#8217;AndroidMarket bisogna pagare un abbonamento annuale i cui costi sono:</p>
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/04/costicorona.png"><img class="alignnone size-full wp-image-1730" src="http://www.gomonkey.it/wp-content/uploads/2012/04/costicorona.png" alt="" width="600" height="430" /></a></p>
<p>Come ultimo avviso bisogna tener presente che alcune caratteristiche proprietarie dei sistemi non sono ancora disponibili, come iAD per iOS e le notifichePush per Android, ma gli sviluppatori hanno assicurato che anche queste funzioni verranno implementate quanto prima.</p>
<p>&nbsp;</p>
<p><span style="font-size: x-large"><strong>Installazione e utilizzo del compilatore</strong></span></p>
<p>CoronaSDK è disponibile sia per Windows che per Mac, ma solo su quest&#8217;ultimo è possibile sviluppare sia per iOS che per Android. Su piattaforma Windows si può sviluppare solo per Android, questo perché la compilazione su iOS avviene tramite Xcode che, come sappiamo, è disponibile solo su Mac.</p>
<p>La prima cosa da fare è registrarsi sul <a href="http://www.anscamobile.com/corona/">sito ufficiale di CoronaSDK</a> e poi scaricare il tool per il sistema che andremo ad utilizzare, ed una volta installato, nella versione Windows dovremmo lanciare <em>Corona Simulator</em>, mentre nella versione Mac abbiamo la possibilità di lanciare o <em>Corona Simulator</em> o <em>Corona Termina</em>l, e in questo secondo caso andremo sempre a lanciare la versione &#8220;terminal&#8221; di Corona. Questo perché su mac, lanciando solo il simulatore non avremo la possibilità di visionare una console di log per controllare eventuali errori o messaggi del compilatore (presente invece nella versione windows), invece avviando <em>corona terminal</em> si avvierà oltre al simulatore, anche una finestra del terminale di OS X che ci servirà appunto come console di log.</p>
<p>&nbsp;</p>
<p><span style="font-size: x-large"><strong>Ciao Mondo!</strong></span></p>
<p>Il tool che abbiamo scaricato è solo un compilatore, NON include un editor per scrivere il codice, per cui dovremo utilizzarne uno esterno. Possiamo usare qualunque editor di testo, quello che preferiamo, ma io suggerisco di usarne uno che abbia il syntax highlighting del Lua, in particolare sotto Windows consiglio <strong><a href="http://notepad-plus-plus.org/">Notepad++</a></strong> e sotto mac invece <strong><a href="http://www.barebones.com/products/textwrangler/">TextWrangler</a></strong>, entrambi free. La prima cosa a cui dobbiamo fare attenzione è il nome del file che andremo a creare: in CoronaSDK il file principale di ogni applicazione si deve chiamare obbligatoriamente<em> main.lua</em>, quindi ogni nostra applicazione dovrà contenere almeno questo file. Apriamo quindi il nostro editor di testo e scriviamo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="lua"><pre class="de1"><span class="kw3">print</span><span class="br0">&#40;</span><span class="st0">&quot;Ciao Mondo!&quot;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>salviamo col nome <em>main.lua</em>, poi dal compilatore CoronaSDK selezioniamo &#8220;open&#8221; ed andiamo ad aprire il file che abbiamo appena creato. A questo punto si aprirà il simulatore del dispositivo, che però rimarrà vuoto a schermo nero, mentre nella finestra del terminale apparirà il nostro &#8220;Ciao Mondo!&#8221; in maniera simile a questa immagine:</p>
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/04/terminale.png"><img class="alignnone size-full wp-image-1732" src="http://www.gomonkey.it/wp-content/uploads/2012/04/terminale.png" alt="" width="598" height="396" /></a></p>
<p>Il comando print in Lua invia il testo scritto fra virgolette alla console di log; è in pratica l&#8217;equivalente di <em>CCLog</em> in Cocos2D o di <em>NSLog</em> in Objective-C.</p>
<p>Se tutto è andato a buon fine vuol dire che abbiamo installato correttamente il compilatore e siamo pronti a sviluppare con CoronaSDK.</p>
<p>&nbsp;</p>
<p><span style="font-size: x-large"><strong>Considerazioni</strong></span></p>
<p>Facciamo alcune considerazioni su cose che ho volutamente tralasciato, ma che sicuramente non sarà sfuggito a chi già programma in altri linguaggi o utilizza altri sistemi di sviluppo. Per prima cosa molti avranno notato che alla fine del comando print non c&#8217;è il punto e virgola, infatti non è obbligatorio ma si può comunque usare, soprattutto da chi è sovente inserire più comandi sulla stessa riga. Altro accorgimento da ricordare è quello di creare sempre una cartella col nome dell&#8217;app che andremo a sviluppare, all&#8217;interno della quale metteremo il nostro <em>main.lua</em> e tutti i file che serviranno al nostro gioco o app: quindi immagini, suoni, font, altri eventuali file .lua, creando anche ulteriori sottocartelle se necessarie per tenere ordinati i progetti con molti files.<br />
Infine avrete notato come il codice del nostro primo programmino sia una sola riga, a differenza del codice dell&#8217;SDK standard dove ci sono più file e più righe anche a progetto vuoto, che a volte confondono gli sviluppatori, soprattutto quelli alle prime armi, mentre qua moltre di quelle funzioni verranno gestite in automatico del compilatore di CoronaSDK.</p>
<p>Siamo giunti alla fine della prima lezione che ci è servita a conoscere meglio questo nuovo mondo, mentre dalla prossima entreremo nel vivo del linguaggio e daremo uno sguardo più approfondito a come funziona la sintassi del Lua. A presto!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/04/coronasdk-1-primi-passi-con-lsdk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I tool per fare videogiochi su iOS (parte 1)</title>
		<link>http://www.gomonkey.it/2012/04/i-tool-per-fare-videogiochi-su-ios-parte-1/</link>
		<comments>http://www.gomonkey.it/2012/04/i-tool-per-fare-videogiochi-su-ios-parte-1/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 14:25:52 +0000</pubDate>
		<dc:creator>Alexain</dc:creator>
				<category><![CDATA[Developer Software]]></category>
		<category><![CDATA[cocos2D]]></category>
		<category><![CDATA[cocos2dx]]></category>
		<category><![CDATA[codea]]></category>
		<category><![CDATA[corona sdk]]></category>
		<category><![CDATA[framework di programmazione]]></category>
		<category><![CDATA[framework programmazione giochi]]></category>
		<category><![CDATA[game salad]]></category>
		<category><![CDATA[gamesalad]]></category>
		<category><![CDATA[tools di programmazione]]></category>
		<category><![CDATA[unity 3d]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1690</guid>
		<description><![CDATA[Cari amici, questo per me è il primo articolo su GoMonkey, e come avevo promesso ad un nostro utente su facebook, ho deciso di fare una carrellata dei principali engine grafici e tool di sviluppo per creare videogiochi su piattaforma iOS (e Android eventualmente), per illustrare i pro e i contro di ognuno e dare la possibilità di scegliere il modo di sviluppare che più preferite. In questa prima parte vedremo i più famosi ed [...]]]></description>
			<content:encoded><![CDATA[<p>Cari amici, questo per me è il primo articolo su GoMonkey, e come avevo promesso ad un nostro utente su facebook, ho deciso di fare una carrellata dei principali engine grafici e tool di sviluppo per creare videogiochi su piattaforma iOS (e Android eventualmente), per illustrare i pro e i contro di ognuno e dare la possibilità di scegliere il modo di sviluppare che più preferite. In questa prima parte vedremo i più famosi ed i più usati dalla community.</p>
<p>Buona lettura!</p>
<p>&nbsp;</p>
<hr />
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/04/download-1.png"><img class="alignnone size-medium wp-image-1691" src="http://www.gomonkey.it/wp-content/uploads/2012/04/download-1-300x97.png" alt="" width="300" height="97" /></a></p>
<p>Il più diffuso engine grafico tra gli sviluppatori indipendenti, e soprattutto tra chi inizia, grazie alla perfetta integrazione con Xcode, cocos2D è un framework, ovvero un insieme di librerie Objective-C che facilitano la programmazione di elementi grafici ed animazioni in OpenGL. Il suo più grosso vantaggio è il fatto che sia open-source, ciò significa che può essere liberamente scaricato, utilizzato, e volendo anche modificarlo a proprio piacimento da tutti, e questo significa zero spese aggiuntive per chi è alle prime armi; inoltre si programma in <strong>objective-C</strong> che è il linguaggio standard per programmare le app iOS, rendendolo vantaggioso per chiunque sia già alle prese con lo sviluppo di altre app. Come da nome nasce prettamente per la creazione di videogiochi 2D, anche se esiste una sua variante chiamata Cocos3D ancora in beta per la gestione di oggetti 3D, ed integra un framework per la gestione semplificata dell’audio (<strong>CocosDenshion</strong>) e due engine fisici, <strong>Chipmunk</strong> che però non ha la gestione ad oggetti e va programmato in C classico, e <strong>Box2D</strong> le cui librerie sono in C++ e comporta un cambio di linguaggio per la sua implementazione.</p>
<p><em>pro:</em></p>
<ul>
<li>Open-source e completamente gratuito</li>
<li>Si integra perfettamente con Xcode</li>
<li>Abbastanza completo per sviluppare qualunque tipo di videogioco 2D</li>
</ul>
<p><em>contro</em>:</p>
<ul>
<li>Bisogna avere una conoscenza discreta dell’Objective-C</li>
<li>Supporta solo il 2D su OpenGL 1.1 al momento</li>
</ul>
<p><em>sito di riferimento:</em> <a href="http://www.cocos2d-iphone.org/">www.cocos2d-iphone.org</a></p>
<hr />
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/04/cocos2dx.png"><img class="alignnone size-full wp-image-1695" src="http://www.gomonkey.it/wp-content/uploads/2012/04/cocos2dx.png" alt="" width="274" height="73" /></a></p>
<p>Porting di Cocos2D completamente riscritto in <strong>C++</strong>, il cui più grosso vantaggio è quello di essere totalmente cross-platform, ciò significa che i videogiochi sviluppati con questo framework possono essere compilati per quasi tutti i più comuni sistemi mobile: <strong>iOS, Android, Samsung Bada, Blackberry OS</strong> e altri. E’ ancora in beta ed è perfettamente identico per prestazioni e potenzialità al suo fratello maggiore in objective-C.</p>
<p><em>pro</em>:</p>
<ul>
<li>Open-source e gratuito come il fratello</li>
<li>Possibilità di compilare e distribuire i giochi su più piattaforme</li>
<li>Utilizza i linguaggi C++ e/o Lua per lo sviluppo che sono i più diffusi</li>
</ul>
<p><em> contro:</em></p>
<ul>
<li>Bisogna avere una conoscenza discreta del C++</li>
<li>Supporta solo il 2D su OpenGL 1.1</li>
<li>Per interfacciarsi con le UIKit di iOS bisogna comunque usare e conoscere l’Objective-C</li>
</ul>
<p><em>sito di riferimento:</em> <a href="www.cocos2d-x.org">www.cocos2d-x.org</a></p>
<hr />
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/04/coronasdk.png"><img class="alignnone  wp-image-1700" src="http://www.gomonkey.it/wp-content/uploads/2012/04/coronasdk-300x41.png" alt="" width="330" height="45" /></a></p>
<p>Questo SDK è uno dei più potenti e versatili per lo sviluppo di videogiochi e app multimediali su <strong>iOS</strong> e Android<strong>,</strong> il cui vantaggio maggiore è quello di utilizzare come linguaggio il <strong>Lua</strong>, che è notevolmente più semplice del tradizionale Objective-C, ed inoltre al suo interno integra già tantissime API come l’engine fisico <strong>Box2D</strong>, <strong>Facebook Connect</strong>, <strong>OpenFeint</strong> e <strong>Flurry Analytics</strong> pienamente utilizzabili nell’SDK senza dover ricorrere ad API esterne. Per contro non è gratuito ma bisogna pagare <strong>199$ l’anno</strong> per poter inviare la propria app sull’AppStore o sull’AndroidMarket, oppure<strong> 349$</strong> per entrambi, anche se è possibile scaricare gratuitamente l’SDK sul proprio computer per poter iniziare a sviluppare testando i risultati su una macchina virtuale.</p>
<p><em>pro</em>:</p>
<ul>
<li>SDK disponibile per Mac e Windows</li>
<li>Sviluppo cross-platform per iOS e Android</li>
<li>Utilizzo del linguaggio Lua</li>
</ul>
<p><em>contro</em>:</p>
<ul>
<li>Costo annuale aggiuntivo considerevole per poter vendere il proprio gioco</li>
<li>Quando escono funzionalità nuove dei dispositivi bisogna attendere gli aggiornamenti</li>
</ul>
<p><em>sito di riferimento:</em> <a href="http://www.anscamobile.com/corona/">www.anscamobile.com/corona</a></p>
<hr />
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/04/gamesalad.png"><img class="alignnone size-full wp-image-1703" src="http://www.gomonkey.it/wp-content/uploads/2012/04/gamesalad.png" alt="" width="370" height="97" /></a></p>
<p>Gamesalad è un tool di sviluppo per <em>“non-programmatori”</em>, cioè l’ambiente è totalmente drag’n’drop per consentire la creazione di videogiochi anche a chi è completamente a digiuno di programmazione informatica, ovviamente ciò implica alcuni limiti ma si riescono comunque ad ottenere buoni risultati. Il tool è gratuito, ha un suo engine fisico integrato, e si possono anche pubblicare i giochi su Appstore, ma per accedere alle funzioni avanzate (<strong>Gamecenter</strong>, <strong>iAD</strong>, <strong>in-app purchase</strong>, pubblicazione anche su <strong>AndroidMarket</strong>, ecc) è necessario pagare <strong>299$ l’anno</strong>, inoltre i videogiochi non girano nativamente, ma sono in <strong>HTML5</strong> ed embeddati all’interno di un web-browser sul dispositivo, per cui non è, e non sara mai possibile accedere a funzionalità grafiche avanzate come shader particellari e oggetti 3D, né si possono utilizzare API esterne.</p>
<p><em>pro</em>:</p>
<ul>
<li>Semplicissimo da usare anche per i neofiti</li>
<li>Nessun costo per la creazione di semplici giochi</li>
<li>Possibilità cross-platform su Android a pagamento</li>
</ul>
<p><em>contro</em>:</p>
<ul>
<li>Costo annuale aggiuntivo considerevole per sbloccare tutte le funzioni</li>
<li>Non è possibile accedere a tutte le funzioni del dispositivo né usare API esterne</li>
<li>Giochi non nativi con possibile decadimento delle prestazioni</li>
</ul>
<p><em>sito di riferimento:</em> <a href="http://www.gamesalad.com">www.gamesalad.com</a></p>
<hr />
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/04/codea.png"><img class="alignnone size-full wp-image-1706" src="http://www.gomonkey.it/wp-content/uploads/2012/04/codea.png" alt="" width="342" height="97" /></a></p>
<p>E’ un’app per iPad disponibile su Appstore a <strong>7,99€</strong> che consente la creazione di videogiochi direttamente all’interno di un iPad. Sfrutta il linguaggio Lua ma non è possibile al momento accedere a tutte le funzionalità del dispositivo, inoltre i giochi creati per ora sono solo per iPad e non possono essere inviati su Appstore, ma la società che l’ha creato ha dichiarato che stanno lavorando per superare questi due limiti (è stato anche rilasciato da loro un gioco free su Appstore, <a title="cargobot" href="http://twolivesleft.com/CargoBot/"><strong>Cargobot</strong></a>, interamente creato con Codea). Al momento supporta solo la grafica 2D ma l’app è molto semplice ed abbastanza potente per creare anche giochi anche con complessi effetti particellari.</p>
<p><em>pro</em>:</p>
<ul>
<li>Costo accessibile da tutti</li>
<li>Utilizzo del linguaggio Lua</li>
<li>Estremamente  potente nonostante la sua semplicità d’uso</li>
</ul>
<p><em>contro</em>:</p>
<ul>
<li>I giochi creati girano solo all’interno dell’app, ma in futuro…</li>
<li>Potrebbe essere scomodo programmare per ore su un iPad</li>
</ul>
<p><em>sito di riferimento:</em> <a href="http://twolivesleft.com/Codea">twolivesleft.com/Codea</a></p>
<hr />
<p><a href="http://www.gomonkey.it/wp-content/uploads/2012/04/unity3d.png"><img class="alignnone size-full wp-image-1717" src="http://www.gomonkey.it/wp-content/uploads/2012/04/unity3d.png" alt="" width="259" height="110" /></a></p>
<p>Giunto alla versione 3.5, è un ambiente di sviluppo completo per la creazione di videogiochi 3D su qualunque piattaforma esistente:<strong> Mac, Windows, Linux, Nintendo Wii, Sony PS3, Xbox360, iOS, Android</strong> fino a <strong>flash</strong> sul web, per cui è possibile, una volta realizzato il gioco, farlo girare su tutte queste piattaforme senza dover cambiare una virgola. Assieme all’UDK è probabilmente il più potente tool per la creazione di videogiochi 3D perché nel suo motore grafico integra le più moderne tecnologie, utilizza <strong>OpenGl ES 2.0</strong> con tutti gli effetti possibili: lightmapping, HDR, ombre in tempo reale ed altro. Integra inoltre un generatore di terreni naturali (con sassi, alberi, atmosfera, ecc), l’engine fisico <strong>PhysX</strong> di nVidia, l’engine audio <strong>FMOD</strong> e il supporto al gaming multiplayer; per la programmazione supporta tre linguaggi: <strong>javascript</strong>, <strong>C#</strong> e un dialetto di Python chiamato <strong>Boo</strong>, ed è possibile integrare qualunque libreria .NET esterna. Il software è scaricabile gratuitamente, ma purtroppo non tutte queste funzionalità sono disponibile nella versione free e la versione Pro costa <strong>1.500$</strong>, inoltre il software può esportare solo per Win/Mac/Linux, se si vuole esportare per altri dispositivi (iOS, Android, Wii, ecc) bisogna acquistare l’export a parte, ed ognuno costa <strong>400$</strong> se si ha la versione free o <strong>1.500$</strong> se si ha la versione Pro.</p>
<p><em>pro</em>:</p>
<ul>
<li>Uno dei più completi tool per Videogiochi 3D</li>
<li>L’ambiente di sviluppo è disponibile sia per Windows che per Mac</li>
<li>Supporta tutte le tecnologie grafiche più moderne esistenti</li>
<li>Disponibile una versione free abbastanza completa per chi inizia</li>
</ul>
<p><em>contro</em>:</p>
<ul>
<li>Costo complessivo della versione Pro accessibile solo ai professionisti</li>
<li>Bisogna avere un’ottima conoscenza di uno dei linguaggi supportati per lavorare bene</li>
<li>Supporta solo il 3D</li>
</ul>
<p><em>sito di riferimento:</em> <a href="http://www.unity3d.com">www.unity3d.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/04/i-tool-per-fare-videogiochi-su-ios-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: punteggio e display layer</title>
		<link>http://www.gomonkey.it/2012/04/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-punteggio-e-display-layer/</link>
		<comments>http://www.gomonkey.it/2012/04/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-punteggio-e-display-layer/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 21:08:44 +0000</pubDate>
		<dc:creator>Gabriele Carbonai</dc:creator>
				<category><![CDATA[box2D]]></category>
		<category><![CDATA[box2d jetpack]]></category>
		<category><![CDATA[box2d tutorial]]></category>
		<category><![CDATA[box2d tutorial in italiano]]></category>
		<category><![CDATA[cocos2D]]></category>
		<category><![CDATA[cocos2d jetpack]]></category>
		<category><![CDATA[games ios]]></category>
		<category><![CDATA[games tutorial]]></category>
		<category><![CDATA[iphone game developer]]></category>
		<category><![CDATA[Jetpack]]></category>
		<category><![CDATA[jetpack tutorial]]></category>
		<category><![CDATA[jetpack tutorial box2d italiano]]></category>
		<category><![CDATA[jetpack tutorial cocos2d]]></category>
		<category><![CDATA[LevelHelper]]></category>
		<category><![CDATA[programmazione cocos2D]]></category>
		<category><![CDATA[SpriteHelper]]></category>
		<category><![CDATA[tutorial cocos2d]]></category>
		<category><![CDATA[tutorial cocos2d italiano]]></category>
		<category><![CDATA[tutorial gioco completo]]></category>
		<category><![CDATA[tutorial italiano cocos2d]]></category>
		<category><![CDATA[tutorial jetpack]]></category>
		<category><![CDATA[tutorial levelhelper]]></category>
		<category><![CDATA[tutorial LevelHelper in italiano]]></category>
		<category><![CDATA[tutorial spriteHelper]]></category>
		<category><![CDATA[tutorial spriteHelper in italiano]]></category>

		<guid isPermaLink="false">http://www.gomonkey.it/?p=1616</guid>
		<description><![CDATA[Prefazione: Questi tutorial sono stati tradotti dall&#8217;Inglese all&#8217;Italiano sotto gentile concessione di ray Wenderlich. Il link originale e i crediti li trovate a fondo di ogni articolo. Per una comodità di impaginazione i tutorial sono stati divisi in più parti Siamo arrivati all&#8217;ultima parte di questo stupendo tutorial che ci vede impegnati a creare un gioco in stile jetpack utilizzando LevelHelper e SpriteHelper. In questa parte andremo ad aggiungere il punteggio al gioco e la [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Prefazione:</strong> Questi tutorial sono stati tradotti dall&#8217;Inglese all&#8217;Italiano sotto gentile concessione di<br />
<strong>ray Wenderlich</strong>. Il link originale e i crediti li trovate a fondo di ogni articolo.<br />
Per una comodità di impaginazione i tutorial sono stati divisi in più parti</p>
<hr />
<p><img class="aligncenter size-full wp-image-1675" title="bg1Parrallax-159x500" src="http://www.gomonkey.it/wp-content/uploads/2012/04/bg1Parrallax-159x500.png" alt="" width="159" height="500" />Siamo arrivati all&#8217;ultima parte di questo stupendo tutorial che ci vede impegnati a creare un gioco in stile jetpack utilizzando LevelHelper e SpriteHelper.</p>
<p>In questa parte andremo ad aggiungere il punteggio al gioco e la scena visibile all&#8217;esterno delle finestre.</p>
<h3>Visualizzazione punteggio</h3>
<p>Stiamo per creare una visualizzazione di punteggio in modo dinamico. Invece di avere un display fisso nella parte superiore o inferiore dello schermo, andremo a mostrare il punteggio in una finestra temporanea (pop-up) ogni volta che l&#8217;utente accumula un punteggio.</p>
<p>Iniziare con l&#8217;aggiunta del seguente codice all&#8217;interno HelloWorldScene.h:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">CCLabelTTF <span class="sy0">*</span>scoreText;</pre></div></div></div></div></div></div></div>


<p>Ora, definire questo nuovo metodo da qualche parte sopra il metodo init all&#8217;interno HelloWorldScene.mm:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> setupScore
<span class="br0">&#123;</span>
    score <span class="sy0">=</span> <span class="nu0">0</span>;
&nbsp;
    CGSize winSize <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>CCDirector sharedDirector<span class="br0">&#93;</span> winSize<span class="br0">&#93;</span>;
    scoreText <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Score: 0&quot;</span> dimensions<span class="sy0">:</span>CGSizeMake<span class="br0">&#40;</span><span class="nu0">200</span>, <span class="nu0">50</span><span class="br0">&#41;</span> alignment<span class="sy0">:</span>UITextAlignmentLeft fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Arial&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">22</span><span class="br0">&#93;</span>;
    scoreText.color <span class="sy0">=</span> ccWHITE;
    scoreText.position <span class="sy0">=</span> ccp<span class="br0">&#40;</span><span class="nu0">100</span>, winSize.height<span class="sy0">-</span><span class="nu0">25</span><span class="br0">&#41;</span>;
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>scoreText z<span class="sy0">:</span><span class="nu0">20</span><span class="br0">&#93;</span>;    
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Qui si crea una nuova etichetta e si assegna la nostra variabile scoreText. Abbiamo poi aggiungto l&#8217;etichetta al livello e impostato la posizione dell&#8217;etichetta in alto a sinistra.</p>
<p>Ora, chiamiamo questo nuovo metodo all&#8217;interno del metodo init subito dopo la chiamata a setupAudio:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="br0">&#91;</span>self setupScore<span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Questo è un bene, ma adesso non stiamo mostrando il punteggio effettivo per l&#8217;utente. Stiamo mostrando solo una parte di testo. Facciamo in modo che venga modificato il testo quando l&#8217;utente accumula i punti.</p>
<p>Modifichiamo il metodo scoreHitAtPosition in questo modo:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>scoreHitAtPosition<span class="sy0">:</span><span class="br0">&#40;</span>CGPoint<span class="br0">&#41;</span>position withPoints<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>points
<span class="br0">&#123;</span>
    score <span class="sy0">+=</span> points;
    <span class="br0">&#91;</span>scoreText setString<span class="sy0">:</span><span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Score: %d&quot;</span>, score<span class="br0">&#93;</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="kw5">NSString</span><span class="sy0">*</span> curScoreTxt <span class="sy0">=</span> <span class="br0">&#91;</span><span class="kw5">NSString</span> stringWithFormat<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;+ %d&quot;</span>, points<span class="br0">&#93;</span>;
    CCLabelTTF <span class="sy0">*</span>curScore <span class="sy0">=</span> <span class="br0">&#91;</span>CCLabelTTF labelWithString<span class="sy0">:</span>curScoreTxt fontName<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Marker Felt&quot;</span> fontSize<span class="sy0">:</span><span class="nu0">24</span><span class="br0">&#93;</span>;
    curScore.color <span class="sy0">=</span> ccWHITE;
    curScore.position <span class="sy0">=</span> position;
    <span class="br0">&#91;</span>self addChild<span class="sy0">:</span>curScore z<span class="sy0">:</span><span class="nu0">20</span><span class="br0">&#93;</span>;
&nbsp;
    <span class="kw4">id</span> opacityAct1 <span class="sy0">=</span> <span class="br0">&#91;</span>CCActionTween actionWithDuration<span class="sy0">:</span><span class="nu0">1</span> key<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;opacity&quot;</span> from<span class="sy0">:</span><span class="nu0">255</span> to<span class="sy0">:</span><span class="nu0">0</span><span class="br0">&#93;</span>;
    <span class="kw4">id</span> actionCallFunc <span class="sy0">=</span> <span class="br0">&#91;</span>CCCallFuncN actionWithTarget<span class="sy0">:</span>self selector<span class="sy0">:</span><span class="kw1">@selector</span><span class="br0">&#40;</span>removeScoreText<span class="sy0">:</span><span class="br0">&#41;</span><span class="br0">&#93;</span>;
    <span class="kw4">id</span> seq <span class="sy0">=</span> <span class="br0">&#91;</span>CCSequence actionOne<span class="sy0">:</span>opacityAct1 two<span class="sy0">:</span>actionCallFunc<span class="br0">&#93;</span>;
    <span class="br0">&#91;</span>curScore runAction<span class="sy0">:</span>seq<span class="br0">&#93;</span>;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Qui si aggiungono i nuovi punti alla variabile punteggio. Poi si aggiorna il testo della nostra etichetta punteggio.</p>
<p>Abbiamo quindi creato una nuova etichetta che verrà visualizzato nella posizione dell&#8217;attributo ottenuto da questo metodo. Come mostrato nel codice, questa è la posizione della moneta o del coniglio. La moneta o coniglio scompare in caso di collisione con il giocatore, e il display del punteggio appare temporaneamente al suo posto.</p>
<p>Aggiungiamo la nuova etichetta al livello. Dobbiamo quindi creare due azioni. La prima azione rende l&#8217;etichetta una nuova partitura scomparendo in un secondo e modificando la proprietà dell&#8217;opacità dello sprite da 255 (massima visibilità) a 0 (non visibile). La seconda azione prevede un nuovo metodo, removeScoreText.</p>
<p>Infine, creiamo una sequenza utilizzando le due azioni definite ed eseguiamo la sequenza sullo sprite della nuova etichetta.</p>
<p>Dobbiamo ancora definire il metodo removeScoreText chiamato dalla seconda azione. Aggiungere il seguente codice sopra il metodo scoreHitAtPosition:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>removeScoreText<span class="sy0">:</span><span class="br0">&#40;</span>CCLabelTTF<span class="sy0">*</span><span class="br0">&#41;</span>scoreLabel
<span class="br0">&#123;</span>
    <span class="br0">&#91;</span>scoreLabel removeFromParentAndCleanup<span class="sy0">:</span><span class="kw2">YES</span><span class="br0">&#93;</span>;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Questo nuovo metodo rimuove solo la visualizzazione del punteggio dallo strato.</p>
<p>Eseguire ora il gioco e vedere che il tutto funziona bene. Ogni volta che il giocatore entra in contatto con una moneta o un coniglio, una etichetta si apre mostrando il punteggio aggiornato, viene visualizzato per un secondo, poi scompare.</p>
<p><img class="aligncenter size-full wp-image-1618" title="ScoreDisplayed" src="http://www.gomonkey.it/wp-content/uploads/2012/04/ScoreDisplayed.png" alt="" width="480" height="320" /></p>
<h3>Aggiungiamo il layer esterno</h3>
<p>La nostra ultima modifica: una scena &#8220;outdoor&#8221; che sarà visibile attraverso lo scorrimento delle finestre del livello, aggiungendo un bel senso di profondità al gameplay.</p>
<p>Apriamo SpriteHelper e creiamo una nuova scena con File\New. Poi con il Finder aperto, passare alla cartella ArtPack, selezionare il bgWindow, window_background, e le immagini window_foreground, e trascinarle sulla finestra SpriteHelper.</p>
<p><img class="aligncenter size-full wp-image-1619" title="dragOutsideLayer-500x341" src="http://www.gomonkey.it/wp-content/uploads/2012/04/dragOutsideLayer-500x341.png" alt="" width="500" height="341" /></p>
<p>Clicchiamo su Pack Sprites per imballare i sprite nuovi. Perché una delle immagini non ha l&#8217;alpha, una nuova finestra vi chiederà se si desidera ritagliare l&#8217;immagine utilizzando un colore selezionato. Scegliere &#8220;Don’t Crop&#8221;.</p>
<p><img class="aligncenter size-full wp-image-1620" title="dontCropArt-500x188" src="http://www.gomonkey.it/wp-content/uploads/2012/04/dontCropArt-500x188.png" alt="" width="500" height="188" /></p>
<p>Selezioniamo tutti gli sprite e impostiamo l&#8217;opzione &#8220;No Physics&#8221;. Salviamo la scena come &#8220;outside&#8221; e inseriamola nella cartella Immagini.</p>
<p><img class="aligncenter size-full wp-image-1627" title="saveOutside-500x341" src="http://www.gomonkey.it/wp-content/uploads/2012/04/saveOutside-500x341.png" alt="" width="500" height="341" /></p>
<p>In LevelHelper, creiamo un nuovo livello per vedere i passaggi. Con level03 aperto, premi Command-Maiuscole-S per salvare il livello come un nuovo. Nominiamolo level04 e salviamolo all&#8217;interno della cartella Levels.</p>
<p><img class="aligncenter size-full wp-image-1628" title="saveLevel-500x342" src="http://www.gomonkey.it/wp-content/uploads/2012/04/saveLevel-500x342.png" alt="" width="500" height="342" /></p>
<p>Ora all&#8217;interno della livello, selezioniamo tutte le finestre degli sprite così come tutti gli sprite del background.</p>
<p><img class="aligncenter size-full wp-image-1629" title="removeBackground" src="http://www.gomonkey.it/wp-content/uploads/2012/04/removeBackground.png" alt="" width="242" height="420" /></p>
<p>Eliminiamo lo sprite premendo il tasto Canc o fare clic sul pulsante rosso con il segno meno sulla sinistra.</p>
<p><img class="aligncenter size-full wp-image-1630" title="removeSelected" src="http://www.gomonkey.it/wp-content/uploads/2012/04/removeSelected.png" alt="" width="187" height="181" /></p>
<p>Dopo la rimozione di questi sprite, la scena dovrebbe essere simile a questa:</p>
<p><img class="aligncenter size-full wp-image-1631" title="afterRemoval" src="http://www.gomonkey.it/wp-content/uploads/2012/04/afterRemoval.png" alt="" width="233" height="430" /></p>
<p>Ora filtrare gli sprite fuori selezionando l&#8217;opzione &#8220;filter&#8221; accanto a outside.png. Questo farà in modo che noi vediamo solo le sprites da quella immagine nella lista. Impostiamo l&#8217;ordine del valore z per outside.png a -1 a mettiamo tutti gli sprite in outside.png dietro tutto il resto.</p>
<p><img class="aligncenter size-full wp-image-1632" title="filterSprites-170x500" src="http://www.gomonkey.it/wp-content/uploads/2012/04/filterSprites-170x500.png" alt="" width="170" height="500" /></p>
<p>Successivamente, trasciniamo lo sprite bgWindow e mettiamolo negli spazi vuoti lasciati dalle finestre rimosse.</p>
<p><img class="aligncenter size-full wp-image-1633" title="dragEmptyWindow-500x437" src="http://www.gomonkey.it/wp-content/uploads/2012/04/dragEmptyWindow-500x437.png" alt="" width="500" height="437" /></p>
<p>Quando siete pronti, selezioniamo tutti i nuovi sprite con il taglio della finestra (tutti gli sprite bgWindow) e diamo a loro Ordine Z del valore di<img class="aligncenter size-full wp-image-1635" title="zForWindows-335x500" src="http://www.gomonkey.it/wp-content/uploads/2012/04/zForWindows-335x500.png" alt="" width="335" height="500" /> 1.</p>
<p>Aggiungiamo questi nuovi sprite alla parallasse e impostiamo il componente X del rapporto movimento a 1. Salviamo il livello.</p>
<p>Premiamo il pulsante Livello di prova per eseguire la scena all&#8217;interno del Tester.<br />
Si possono notare delle imperfezioni dei nuovi sprites che non sono allineati correttamente con quelli inseriti nei precedenti tutorial.</p>
<p>Ci sono due modi per risolvere questo problema:</p>
<p>1. Regolando ogni disadattamento individuale selezionando ogni sprite e spostando la sprite usando i tasti freccia fino a quando non si allinea correttamente con gli altri sprite.</p>
<p>2. Selezionare tutte le sprites disallineati e impostare Scale X nel menu General Propriety a 1,01, o un valore tale da risolvere il problema.</p>
<p>Salviamo il livello quando si è pienamente soddisfatti.</p>
<p>Ora che tutto è a posto, creiamo uno sfondo che si muove ad una velocità diversa dal resto della parallasse.</p>
<p>Prima di tutto blocchiamo gli sprite nel livello in modo di non spostarli accidentalmente. Per fare questo, selezionare tutti gli sprite dalla lista a sinistra, e fare clic sul pulsante Blocca.</p>
<p><img class="aligncenter size-full wp-image-1670" title="lockSprites-150x500" src="http://www.gomonkey.it/wp-content/uploads/2012/04/lockSprites-150x500.png" alt="" width="150" height="500" /></p>
<p><strong>Nota:</strong> Per sbloccare gli sprite, selezionarli nuovamente dalla lista e premere il pulsante blocca</p>
<p>Con gli sprite bloccati, trascinare lo sprite window_background nella scena e posizionarlo sopra lo schermo principale. Assicurarsi che il bordo sinistro verticale della sprite window_background sia allineata esattamente con quella dello schermo principale.</p>
<p><img class="aligncenter size-full wp-image-1671" title="dragBg1-500x406" src="http://www.gomonkey.it/wp-content/uploads/2012/04/dragBg1-500x406.png" alt="" width="500" height="406" /></p>
<p>Ora assicurarsi che la sprite window_background sia selezionata, e duplicare a destra fino alla fine dello schema di gioco tramite il tasto verde + (o premendo Command-D). Assicurarsi di avere il punto di ancoraggio corretto selezionato.</p>
<p><img class="aligncenter size-full wp-image-1672" title="cloneBg1-500x279" src="http://www.gomonkey.it/wp-content/uploads/2012/04/cloneBg1-500x279.png" alt="" width="500" height="279" /></p>
<p>Il livello dovrebbe essere simile a questo quando hai finito:</p>
<p><img class="aligncenter size-full wp-image-1673" title="levelBg1-500x77" src="http://www.gomonkey.it/wp-content/uploads/2012/04/levelBg1-500x77.png" alt="" width="500" height="77" /></p>
<p>Ora selezioniamo tutti gli sprite window_background e aggiungiamoli alla parallasse. Impostiamo la componente X del rapporto movimento a 0,3.</p>
<p>Ripetiamo il processo per gli sprite window_foreground</p>
<p>Trasciniamo nella scena lo sprite window_background come da immagine:</p>
<p><img class="aligncenter size-full wp-image-1676" title="dragBg2-500x377" src="http://www.gomonkey.it/wp-content/uploads/2012/04/dragBg2-500x377.png" alt="" width="500" height="377" /></p>
<p>Cloniamo come sopra e per tutta la mappa di gioco</p>
<p><img class="aligncenter size-full wp-image-1677" title="levelBg2-500x106" src="http://www.gomonkey.it/wp-content/uploads/2012/04/levelBg2-500x106.png" alt="" width="500" height="106" /></p>
<p>aggiungiamo alla parallasse e impostiamo il componente X del rapporto movimento a 0.7:</p>
<p><img class="aligncenter size-full wp-image-1678" title="bg2Parallax-154x500" src="http://www.gomonkey.it/wp-content/uploads/2012/04/bg2Parallax-154x500.png" alt="" width="154" height="500" /></p>
<p>Ora selezioniamo tutti gli sprite window_background e trasciniamoli verso il basso sulla scena principale in modo che si può vedere attraverso la finestra.</p>
<p><img class="aligncenter size-full wp-image-1679" title="dragBg1Window" src="http://www.gomonkey.it/wp-content/uploads/2012/04/dragBg1Window.png" alt="" width="325" height="213" /></p>
<p>Ripetiamo il processo per gli sprite window_foreground. Trasciniamo tutti gli sprites fino a quando è possibile vederli attraverso la finestra.</p>
<p><img class="aligncenter size-full wp-image-1680" title="dragBg2Window" src="http://www.gomonkey.it/wp-content/uploads/2012/04/dragBg2Window.png" alt="" width="385" height="291" /></p>
<p>Salviamo e testiamo il gioco, si dovrebbe vedere il mondo esterno che si muove a una velocità diversa rispetto al mondo interno. Questo darà una sensazione di profondità al gioco.</p>
<p>L&#8217;ultima cosa che dobbiamo fare è aggiungere il nuovo livello e le immagini al nostro progetto in Xcode. La cartella Livelli dovrebbe assomigliare a questa:</p>
<p><img class="aligncenter size-full wp-image-1682" title="resourceLevels" src="http://www.gomonkey.it/wp-content/uploads/2012/04/resourceLevels.png" alt="" width="176" height="88" /></p>
<p>Poi aggiungiamo i nuovi file di immagine (outside.png, outside-hd.png, outside.pshs) nella cartella Images. La nuova cartella di immagini in Xcode dovrebbe assomigliare a questa:</p>
<p><img class="aligncenter size-full wp-image-1683" title="imagesOutsideRes" src="http://www.gomonkey.it/wp-content/uploads/2012/04/imagesOutsideRes.png" alt="" width="170" height="226" /></p>
<p>All&#8217;interno HelloWorldScene.mm, modifichiamo il codice di livello in modo che carichi il file level04:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="objc"><pre class="de1">lh <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>LevelHelperLoader alloc<span class="br0">&#93;</span> initWithContentOfFile<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;level04&quot;</span><span class="br0">&#93;</span>;</pre></div></div></div></div></div></div></div>


<p>Abbiamo finito definitivamente con la creazione di un gioco simile a jetpack.<br />
Ultimo passo è quello di giocarci, buon divertimento.</p>
<p>Potete scaricare il codice completo</p>
<div class="downloads"><h4>Download <strong>RocketMouse parte finale</strong></h4><a href="http://www.gomonkey.it/login/" >Loggati per scaricare il file</a></div>
<p><img class="aligncenter size-full wp-image-1684" title="RocketMouseFinal" src="http://www.gomonkey.it/wp-content/uploads/2012/04/RocketMouseFinal.png" alt="" width="480" height="320" /></p>
<hr />
<h3>Sommario tutorial</h3>
<p>1. <a href="http://www.gomonkey.it/2012/02/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-preparazione/" title="Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Preparazione">Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Preparazione</a></p>
<p>2. <a href="http://www.gomonkey.it/2012/02/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-uso-di-level-helper/" title="Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. uso di Level Helper">Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. uso di Level Helper</a></p>
<p>3.  <a href="http://www.gomonkey.it/2012/02/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-il-livello/" title="Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Il livello">Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Il livello</a></p>
<p>4. <a href="http://www.gomonkey.it/2012/02/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-lasers-e-coins/" title="Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. lasers e coins">Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. lasers e coins</a></p>
<p>5. <a href="http://www.gomonkey.it/2012/02/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-aggiungiamo-il-personaggio-principale/" title="Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. aggiungiamo il personaggio principale">Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. aggiungiamo il personaggio principale</a></p>
<p>6. <a href="http://www.gomonkey.it/2012/02/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-logica-di-gioco/" title="Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Logica di gioco">Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Logica di gioco</a></p>
<p>7. <a href="http://www.gomonkey.it/2012/04/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-le-collision/" title="Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Le collisioni">Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Le collisioni</a></p>
<p>8. <a href="http://www.gomonkey.it/2012/04/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-il-sound/" title="Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: Il sound">Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: Il sound</a></p>
<p>9. <a href="http://www.gomonkey.it/2012/04/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-collisioni-con-gli-animali-e-aggiustamenti-del-gioco/" title="Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: collisioni con gli animali e aggiustamenti del gioco">Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: collisioni con gli animali e aggiustamenti del gioco</a></p>
<p>10. <a href="http://www.gomonkey.it/2012/04/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-rotazione-laser-e-coniglietti/" title="Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: rotazione laser e coniglietti">Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: rotazione laser e coniglietti</a></p>
<p>11. Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: punteggio e display layer</p>
<hr />
<blockquote><p>Questo è un articolo scritto da Bogdan Vladu, uno sviluppatore di applicazioni IoS e aspirante programmatore di videogiochi, vive attualmente a Bucharest in Romania.</p>
<p>Un ringraziamento speciale va a Ray Wenderlich che ci ha dato il permesso di tradurre in Italiano i suoi tutorial</p>
<p><a href="http://www.raywenderlich.com/7358/how-to-make-a-game-like-jetpack-joyride-using-levelhelper-spritehelper-%E2%80%93-part-4">http://www.raywenderlich.com/7358/how-to-make-a-game-like-jetpack-joyride-using-levelhelper-spritehelper-%E2%80%93-part-4</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.gomonkey.it/2012/04/creiamo-un-gioco-simile-a-jetpack-usando-levelhelper-e-spritehelper-punteggio-e-display-layer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

