<?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>the void. &#187; sprite animate</title>
	<atom:link href="http://francescomalatesta.net/tag/sprite-animate/feed/" rel="self" type="application/rss+xml" />
	<link>http://francescomalatesta.net</link>
	<description>&#34;La Mia Ignoranza Non Ha Lacune.&#34;</description>
	<lastBuildDate>Tue, 13 Jul 2010 10:42:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Disegnare una sprite animata &#8211; Grafica &#8211; XNA Tutorials</title>
		<link>http://francescomalatesta.net/2009/12/30/disegnare-una-sprite-animata-grafica-xna-tutorials/</link>
		<comments>http://francescomalatesta.net/2009/12/30/disegnare-una-sprite-animata-grafica-xna-tutorials/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 15:55:40 +0000</pubDate>
		<dc:creator>FrancescoMalatesta</dc:creator>
				<category><![CDATA[XNA]]></category>
		<category><![CDATA[animazioni]]></category>
		<category><![CDATA[francesco malatesta]]></category>
		<category><![CDATA[giochi]]></category>
		<category><![CDATA[programmazione giochi]]></category>
		<category><![CDATA[sprite animate]]></category>

		<guid isPermaLink="false">http://francescomalatesta.net/?p=339</guid>
		<description><![CDATA[In questo articolo impareremo a disegnare su schermo una sprite animata tramite poche e semplici istruzioni. Innanzitutto, ecco l&#8217;immagine che ho usato io per questa prova: Come potete notare non è niente di che: un insieme di quadrati con un semplice effetto di illuminazione, fatto in photoshop in due secondi. Ora, se volessimo partire da [...]]]></description>
			<content:encoded><![CDATA[<!-- AdSense Now! V1.92 -->
<!-- Post[count: 2] -->
<div class="adsense adsense-leadin" style="text-align:center;margin: 12px;"><script type="text/javascript"><!--
google_ad_client = "pub-7771620956442152";
/* 468x60, creato 30/06/10 */
google_ad_slot = "9180159758";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><p>In questo articolo impareremo a disegnare su schermo una sprite animata tramite poche e semplici istruzioni. Innanzitutto, ecco l&#8217;immagine che ho usato io per questa prova:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-341" title="Senza titolo-1" src="http://francescomalatesta.net/wp-content/uploads/2009/12/Senza-titolo-1.jpg" alt="Senza titolo-1" width="400" height="40" /></p>
<p style="text-align: left;">Come potete notare non è niente di che: un insieme di quadrati con un semplice effetto di illuminazione, fatto in photoshop in due secondi. Ora, se volessimo partire da questa immagine per creare un animazione, come fare? Basta ragionare in termini di frame. Mi spiego meglio: provate a disegnare uno dopo l&#8217;altro, nella stessa posizione, i quadrati contenuti in quest&#8217;immagine e non uno a fianco all&#8217;altro.</p>
<p style="text-align: left;">Quale effetto otterreste? Eccolo.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-342" title="[gickr.com]_651a3e0d-5b3f-a354-9dbe-384d07960c7c" src="http://francescomalatesta.net/wp-content/uploads/2009/12/gickr.com_651a3e0d-5b3f-a354-9dbe-384d07960c7c.gif" alt="[gickr.com]_651a3e0d-5b3f-a354-9dbe-384d07960c7c" width="40" height="40" /></p>
<p style="text-align: left;">Spero di essere stato chiaro, più di tanto non potevo <img src='http://francescomalatesta.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p style="text-align: left;">Prenderemo la nostra immagine di esempio e disegneremo su schermo una parte per volta e non tutta insieme, in modo tale da dare l&#8217;idea dell&#8217;animazione. Come si fa? Ecco il codice, che piano piano spiegherò nel dettaglio (per quanto sia veramente facile).</p>
<p style="text-align: left;"><em>Nota: nella stessa cartella dell&#8217;eseguibile ho posizionato il file &#8220;immagine.png&#8221;, in quanto ho caricato la texture direttamente da file.</em></p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.Linq;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace GiocoDiProva
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Texture2D immagine;
        int number_of_frames = 10;
        int current_frame = 0;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = &quot;Content&quot;;
        }

        protected override void Initialize()
        {

            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            immagine = Texture2D.FromFile(this.GraphicsDevice, &quot;immagine.png&quot;);
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            if (current_frame &lt; number_of_frames)
            {
                current_frame++;
            }
            else
            {
                current_frame = 0;
            }

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin();
            spriteBatch.Draw(immagine, new Rectangle(200, 200, 40, 40), new Rectangle(current_frame * 40, 0, 40,40), Color.White);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}
</pre>
<p>Partiamo dalle dichiarazioni delle variabili:</p>
<pre class="brush: csharp;">
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Texture2D immagine;
        int number_of_frames = 10;
        int current_frame = 0;
</pre>
<p>La Texture2D <em>immagine</em> è la nostra texture che verrà &#8220;sezionata&#8221;<em> </em>per poi essere disegnata. &#8220;number_of_frames&#8221; è invece il numero dei frames totali di cui si compone la nostra animazione. &#8220;current_frame&#8221; è invece un intero che assumerà il numero del frame attuale per sapere in ogni istante quale parte dell&#8217;immagine deve essere riprodotta.</p>
<p>Il metodo Update spiega meglio l&#8217;utilizzo di queste due variabili (il metodo LoadContent l&#8217;ho saltato perchè mi pare ovvio ormai a cosa serve <img src='http://francescomalatesta.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ):</p>
<pre class="brush: csharp;">
protected override void Update(GameTime gameTime)
        {
            if (current_frame &lt; number_of_frames)
            {
                current_frame++;
            }
            else
            {
                current_frame = 0;
            }

            base.Update(gameTime);
        }
</pre>
<p>In questo metodo controlliamo se il frame attuale che stiamo considerando è minore del conteggio totale dei frames. Se ciò avviene, allora andremo avanti di frame passando al successivo, tramite un semplice incremento. Altrimenti, se il controllo restituisce falso, vuol dire che abbiamo raggiunto la fine dell&#8217;animazione e dobbiamo riniziare da capo. A questo proposito aggiungiamo il &#8220;current_frame = 0&#8243;.</p>
<p>Ora che abbiamo deciso quale frame disegnare, dobbiamo utilizzare quest&#8217;informazione nel metodo Draw. Ecco il codice:</p>
<pre class="brush: csharp;">
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin();
            spriteBatch.Draw(immagine, new Rectangle(200, 200, 40, 40), new Rectangle(current_frame * 40, 0, 40,40), Color.White);
            spriteBatch.End();

            base.Draw(gameTime);
        }
</pre>
<p>Stavolta basta una sola istruzione. Precisamente, il metodo Draw che prende quattro parametri in input:</p>
<ol>
<li>la texture da disegnare.</li>
<li>il rettangolo di &#8220;destinazione&#8221;, ovvero il nostro frame con le coordinate di disegno e la grandezza del frame desiderato. In quest&#8217;esempio, ho disegnato la sprite alle coordinate 200,200, con una grandezza del frame di 40&#215;40 (che è appunto la dimensione di ogni quadrato incluso il contorno).</li>
<li>il rettangolo &#8220;sorgente&#8221;, ovvero quel rettangolo che racchiude tutta l&#8217;immagine (per intenderci, la prima da me esposta all&#8217;inizio dell&#8217;articolo.</li>
<li>il colore da usare per la modulazione del canale (come al solito ho usato il bianco).</li>
</ol>
<p>Come per ogni test, premete F5 e guardate il risultato <img src='http://francescomalatesta.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Ffrancescomalatesta.net%2F2009%2F12%2F30%2Fdisegnare-una-sprite-animata-grafica-xna-tutorials%2F&amp;linkname=Disegnare%20una%20sprite%20animata%20%26%238211%3B%20Grafica%20%26%238211%3B%20XNA%20Tutorials"><img src="http://francescomalatesta.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://francescomalatesta.net/2009/12/30/disegnare-una-sprite-animata-grafica-xna-tutorials/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
