<?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; immagini</title>
	<atom:link href="http://francescomalatesta.net/tag/immagini/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>Ridimensionare una Sprite &#8211; Grafica &#8211; XNA Tutorials</title>
		<link>http://francescomalatesta.net/2009/12/29/ridimensionare-una-sprite-grafica-xna-tutorials/</link>
		<comments>http://francescomalatesta.net/2009/12/29/ridimensionare-una-sprite-grafica-xna-tutorials/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 11:57:00 +0000</pubDate>
		<dc:creator>FrancescoMalatesta</dc:creator>
				<category><![CDATA[XNA]]></category>
		<category><![CDATA[grafica]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[immagini]]></category>
		<category><![CDATA[programmazione giochi]]></category>
		<category><![CDATA[ridimensionare]]></category>
		<category><![CDATA[sprite]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://francescomalatesta.net/?p=328</guid>
		<description><![CDATA[Ridimensionare una sprite, al pari della rotazione, è un&#8217;operazione molto semplice, nonostante sia molto comune in tantissimi giochi. Comunque sia, chiacchiere a parte, in questo articolo affronteremo due metodi di ridimensionamento: prima quello &#8220;fisso&#8221;, ovvero il disegno della texture ridimensionata, e successivamente quello &#8220;variabile&#8221; tramite input da tastiera. Ridimensionamento &#8220;fisso&#8221; Il nocciolo della questione, come [...]]]></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>Ridimensionare una sprite, al pari della rotazione, è un&#8217;operazione molto semplice, nonostante sia molto comune in tantissimi giochi. Comunque sia, chiacchiere a parte, in questo articolo affronteremo due metodi di ridimensionamento: prima quello &#8220;fisso&#8221;, ovvero il disegno della texture ridimensionata, e successivamente quello &#8220;variabile&#8221; tramite input da tastiera.</p>
<ul>
<li>Ridimensionamento &#8220;fisso&#8221;</li>
</ul>
<p>Il nocciolo della questione, come potete immaginare, si trova nel metodo Draw, che come abbiamo detto prima è il punto in cui i contenuti vengono disegnati su schermo. A fare la parte importante, nel nostro caso, è il rettangolo che noi diamo come parametro nel metodo Draw dello SpriteBatch da noi utilizzato. Nello specifico, di questo rettangolo modificheremo larghezza ed altezza.</p>
<p>Ecco il metodo Draw:</p>
<pre class="brush: csharp;">
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();

            spriteBatch.Draw(immagine, new Rectangle(10, 10, immagine.Width * 2, immagine.Height * 2), Color.White);

            spriteBatch.End();

            base.Draw(gameTime);
        }
</pre>
<p>Stavolta ho semplicemente dato come dimensione del rettangolo una larghezza pari al doppio della rispettiva nell&#8217;immagine e un&#8217;altezza calcolata in egual modo. Il risultato? Eccolo.</p>
<p style="text-align: center;"><a href="http://francescomalatesta.net/wp-content/uploads/2009/12/asd1.jpg"><img class="alignnone size-medium wp-image-329" title="asd" src="http://francescomalatesta.net/wp-content/uploads/2009/12/asd1-300x234.jpg" alt="asd" width="300" height="234" /></a></p>
<p style="text-align: center;"><em>(Click per ingrandire)</em></p>
<p style="text-align: left;">Adesso passiamo all&#8217;ingrandimento dato dall&#8217;input dell&#8217;utente. Anche questo è molto semplice da gestire: tuttavia, richiederà qualche variabile in più in quanto abbiamo dei problemi a livello di tipo di variabili.</p>
<p style="text-align: center;"><em><img class="alignnone size-full wp-image-331" title="Senza titolo-2" src="http://francescomalatesta.net/wp-content/uploads/2009/12/Senza-titolo-24.jpg" alt="Senza titolo-2" width="365" height="57" /></em></p>
<p style="text-align: left;"><em>Mi spiego meglio: come potete vedere dall&#8217;intellisense, la proprietà Width e Height di una texture sono di tipo Int. Questo vuol dire che, per ottenere un&#8217;ingrandimento di, toh, una volta e mezzo (x1.5) avremo dei problemi  rimanendo ad usare gli interi. Per cui, ecco cosa faremo.</em></p>
<ol>
<li>Creiamo una variabile di tipo float, chiamata moltiplicatore. Qui memorizzeremo il valore da usare per la moltiplicazione nel ridimensionamento.</li>
<li>Modifichiamo il metodo Update in modo da gestire l&#8217;input da tastiera.</li>
<li>Modifichiamo il metodo Draw in modo da disegnare bene la nostra immagine.</li>
</ol>
<p>Ecco la nostra variabile:</p>
<pre class="brush: csharp;">
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Texture2D immagine;

        float moltiplicatore = 1.0f;
</pre>
<p>In fase di disegno moltiplicheremo le dimensioni dell&#8217;immagine per questo valore. Ponendo come valore iniziale 1.0, inizialmente la nostra immagine verrà disegnata nella sua grandezza naturale.</p>
<p>Ora gestiamo l&#8217;input da parte dell&#8217;utente: stavolta i tasti che useremo saranno il &#8220;+&#8221; per ingrandire ed il &#8220;-&#8221; per rimpicciolire. Il metodo Update verrà riscritto così:</p>
<pre class="brush: csharp;">
        protected override void Update(GameTime gameTime)
        {
            if (Keyboard.GetState().IsKeyDown(Keys.Add))
            {
                if (moltiplicatore &lt; 2.0f)
                {
                    moltiplicatore += 0.05f;
                }
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Subtract))
            {
                if (moltiplicatore &gt; 0.5f)
                {
                    moltiplicatore -= 0.05f;
                }
            }

            base.Update(gameTime);
        }
</pre>
<p>Per evitare problemi nel mostrare l&#8217;immagine (dimensioni negative e così via) ho limitato il ridimensionamento in modo tale che vada da un minimo di 0.5 (la metà della grandezza originale) a 2.0 (il doppio <img src='http://francescomalatesta.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). I valori &#8220;Keys.Add&#8221; e &#8220;Keys.Subtract&#8221; sono i corrispettivi del &#8220;+&#8221; e del &#8220;-&#8221;.</p>
<p><em>(nel caso togliate i limiti del ridimensionamento, andando in negativo si ottiene l&#8217;immagine capovolta, quando la variabile moltiplicatore è diversa da zero)</em></p>
<p>Infine ecco il metodo Draw riscritto:</p>
<pre class="brush: csharp;">
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();

            spriteBatch.Draw(immagine, new Rectangle(10, 10, (int)(immagine.Width * moltiplicatore), (int)(immagine.Height * moltiplicatore)), Color.White);

            spriteBatch.End();

            base.Draw(gameTime);
        }
</pre>
<p>Ogni dimensione viene moltiplicata per il moltiplicatore (gioco di parole non voluto) e successivamente visto come int tramite l&#8217;aggiunta di &#8220;(int)&#8221; dietro l&#8217;espressione da usare. Potete provare voi stessi il tutto senza ulteriori spiegazioni <img src='http://francescomalatesta.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' 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%2F29%2Fridimensionare-una-sprite-grafica-xna-tutorials%2F&amp;linkname=Ridimensionare%20una%20Sprite%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/29/ridimensionare-una-sprite-grafica-xna-tutorials/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Disegnare una Sprite su schermo &#8211; Grafica &#8211; XNA Tutorials</title>
		<link>http://francescomalatesta.net/2009/12/28/disegnare-una-sprite-su-schermo-grafica-xna-tutorials/</link>
		<comments>http://francescomalatesta.net/2009/12/28/disegnare-una-sprite-su-schermo-grafica-xna-tutorials/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 23:24:43 +0000</pubDate>
		<dc:creator>FrancescoMalatesta</dc:creator>
				<category><![CDATA[XNA]]></category>
		<category><![CDATA[disegnare su schermo]]></category>
		<category><![CDATA[francesco malatesta]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[immagini]]></category>
		<category><![CDATA[sprite]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://francescomalatesta.net/?p=303</guid>
		<description><![CDATA[In questo articolo scopriremo come si può disegnare su schermo una sprite con XNA. Come prima cosa avviamo l&#8217;ambiente di sviluppo e creiamo un nuovo progetto (Come si fa?). Ora, quello che noi dobbiamo fare essenzialmente è innanzitutto caricare in memoria la nostra sprite. Successivamente, andare a modificare il codice del metodo Draw per poter [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo scopriremo come si può disegnare su schermo una sprite con XNA. Come prima cosa avviamo l&#8217;ambiente di sviluppo e creiamo un nuovo progetto (<a href="http://francescomalatesta.net/2009/12/26/creazione-di-un-nuovo-progetto-inizio-e-preparazione-xna-tutorials/" target="_blank">Come si fa?</a>). Ora, quello che noi dobbiamo fare essenzialmente è innanzitutto caricare in memoria la nostra sprite. Successivamente, andare a modificare il codice del metodo Draw per poter disegnare sullo schermo quello che vogliamo.</p>
<p>Ecco l&#8217;immagine che disegneremo su schermo:</p>
<p style="text-align: center;"><img class="alignnone" src="http://francescomalatesta.net/wp-content/uploads/2009/11/1257516198558_f.jpg" alt="" width="189" height="250" /></p>
<p style="text-align: center;">Autostima alle stelle, eh?</p>
<ul>
<li><strong>Importiamo l&#8217;immagine nel progetto.</strong></li>
</ul>
<p>Come prima cosa, dobbiamo importare la nostra immagine in modo tale da essere riconosciuta. Le possibilità, in questo caso, sono due:</p>
<ol>
<li>Importare l&#8217;immagine con il ContentManager;</li>
<li>Caricare l&#8217;immagine direttamente da file;</li>
</ol>
<p>Ovviamente, spiegherò sia un metodo che l&#8217;altro.</p>
<p>Per caricare un&#8217;immagine con il ContentManager, importiamo il file cliccando con il pulsante destro su <strong>Content</strong>, nella scheda Esplora Soluzioni, selezionando quindi <em>Aggiungi -&gt; Elemento Esistente</em>.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-305" title="123" src="http://francescomalatesta.net/wp-content/uploads/2009/12/123.jpg" alt="123" width="249" height="212" /></p>
<p style="text-align: center;"><em>La voce Content evidenziata nella scheda Esplora Soluzioni.</em></p>
<p style="text-align: left;">Si aprirà una classica finestra di apertura file: selezioniamo il file da importare e confermiamo. Ora ecco come appare la voce Content:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-306" title="asd" src="http://francescomalatesta.net/wp-content/uploads/2009/12/asd.jpg" alt="asd" width="242" height="241" /></p>
<p style="text-align: left;"><strong>Attenzione: </strong>quando importerete l&#8217;immagine (se usate la mia immagine di esempio) il nome non è lo stesso. Ho modificato il nome direttamente da Esplora Soluzioni per rendere l&#8217;uso del file più agevole.</p>
<p style="text-align: left;">Bene, adesso dobbiamo aggiungere il codice: innanzitutto facciamo le prime modifiche subito dopo la dichiarazione dell&#8217;oggetto SpriteBatch.</p>
<pre class="brush: csharp;">
public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        // Ecco la nostra texture.
        Texture2D immagine;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = &quot;Content&quot;;
        }
</pre>
<p>Come potete vedere, ho dichiarato un nuovo oggetto di tipo Texture2D: rappresenta esattamente la nostra immagine. Ora dobbiamo dire a quest&#8217;oggetto di prendere come immagine di riferimento la nostra. Il codice da utilizzare, posto nel metodo LoadContent, è il seguente:</p>
<pre class="brush: csharp;">
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            immagine = Content.Load&lt;Texture2D&gt;(&quot;texture&quot;);
        }
</pre>
<p>In parole povere abbiamo usato il metodo Load del ContentManager (con tipo Texture2D) e abbiamo passato come parametro una stringa contenente il nome del file importato <strong>senza</strong> estensione.</p>
<p>Con questa istruzione abbiamo completato questo tipo di caricamento. Spesso, tuttavia, per alcune scelte è possibile evitare tutto questo procedimento, caricando la nostra Texture in modo differente. Nello specifico, il metodo che sto per illustrare permette di caricare la texture specificando il percorso della nostra immagine.</p>
<p>Supponiamo che nella cartella dell&#8217;eseguibile del gioco ci sia un&#8217;altra cartella, che chiameremo Graphics. In questa cartella vi sarà la nostra immagine. Ecco un&#8217;immagine per farvi capire meglio.</p>
<p style="text-align: center;"><a href="http://francescomalatesta.net/wp-content/uploads/2009/12/Senza-titolo-61.jpg"><img class="alignnone size-medium wp-image-307" title="Senza titolo-6" src="http://francescomalatesta.net/wp-content/uploads/2009/12/Senza-titolo-61-300x211.jpg" alt="Senza titolo-6" width="300" height="211" /></a></p>
<p style="text-align: center;">(Click per Ingrandire)</p>
<p style="text-align: left;">Stavolta, per caricare la nostra texture, ecco cosa dovremo fare:</p>
<p style="text-align: left;">Senza aggiungere con il ContentManager il nostro file, basterà cambiare il metodo LoadContent come riportato qui di seguito:</p>
<pre class="brush: csharp;">
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            immagine = Texture2D.FromFile(GraphicsDevice, &quot;Graphics/texture.jpg&quot;);
        }
</pre>
<p>Stavolta abbiamo utilizzato il metodo FromFile della classe Texture2D. Come parametri del metodo passiamo l&#8217;oggetto GraphicDevice e una stringa che contiene il percorso del file. Nulla di più, e anche in questo modo la nostra texture è pronta per essere utilizzata!</p>
<ul>
<li><strong>Disegnamo la Sprite su schermo</strong></li>
</ul>
<p>La <strong>fase di disegno </strong>è ancora più semplice.</p>
<p>Come prima cosa passiamo dal metodo LoadContent al metodo Draw: basterà aggiungere queste tre righe di codice per disegnare la nostra Sprite.</p>
<pre class="brush: csharp;">
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();

            spriteBatch.Draw(immagine, new Vector2(0, 0), Color.White);

            spriteBatch.End();

            // TODO: Add your drawing code here
            base.Draw(gameTime);
        }
</pre>
<p>Per prima cosa abbiamo avviato lo SpriteBatch, l&#8217;oggetto che si occupa delle operazioni di disegno. <em>Ricordatevi, il metodo Begin() deve essere sempre chiamato prima di qualsiasi disegno</em>, altrimenti vi verrà restituito un errore.</p>
<p>Successivamente chiamiamo il metodo Draw, al quale passiamo i seguenti parametri:</p>
<ul>
<li>nome dell&#8217;oggetto Texture2D da disegnare,</li>
<li>la posizione dell&#8217;oggetto sullo schermo,</li>
<li>il colore da usare per il channel modulation (vi basti sapere per ora che usare Color.White è più che sufficiente, in seguito vedremo cosa succede variando questo valore)</li>
</ul>
<p>Infine richiamiamo il metodo End() dello SpriteBatch. Ed ecco il risultato sullo schermo:</p>
<p style="text-align: center;"><a href="http://francescomalatesta.net/wp-content/uploads/2009/12/Senza-titol654.jpg"><img class="alignnone size-medium wp-image-309" title="Senza titol654" src="http://francescomalatesta.net/wp-content/uploads/2009/12/Senza-titol654-300x234.jpg" alt="Senza titol654" width="300" height="234" /></a></p>
<p style="text-align: center;">(Click per Ingrandire)</p>
<p style="text-align: left;">Come vedete, basta veramente poco a disegnare qualcosa su schermo. Nei prossimi articoli vedremo un pò come realizzare animazioni, ruotare queste texture ed ingrandirle o rimpicciolirle.</p>
<p style="text-align: left;">Bye <img src='http://francescomalatesta.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' 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%2F28%2Fdisegnare-una-sprite-su-schermo-grafica-xna-tutorials%2F&amp;linkname=Disegnare%20una%20Sprite%20su%20schermo%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/28/disegnare-una-sprite-su-schermo-grafica-xna-tutorials/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Output &#8211; Immagini &#8211; Guida SDL.NET</title>
		<link>http://francescomalatesta.net/2009/11/18/output-immagini-guida-sdl-net/</link>
		<comments>http://francescomalatesta.net/2009/11/18/output-immagini-guida-sdl-net/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 14:14:15 +0000</pubDate>
		<dc:creator>FrancescoMalatesta</dc:creator>
				<category><![CDATA[SDL.NET]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[express]]></category>
		<category><![CDATA[giochi]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[immagini]]></category>
		<category><![CDATA[net]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[sdl]]></category>
		<category><![CDATA[surface]]></category>

		<guid isPermaLink="false">http://francescomalatesta.net/?p=65</guid>
		<description><![CDATA[E&#8217; tempo di mostrare qualcosa sullo schermo, vero? Sono d&#8217;accordo con voi, iniziamo a parlare delle Surface, i primi oggetti che ci accompagneranno nella rappresentazione su schermo dei nostri file grafici. Volendo tradurre alla lettera dalla Wiki ufficiale, possiamo ottenere la spiegazione più esatta per questa classe: &#8220;Le Surface in SDL.NET rappresentano, genericamente, delle informazioni [...]]]></description>
			<content:encoded><![CDATA[<p>E&#8217; tempo di mostrare <strong>qualcosa sullo schermo</strong>, vero? Sono d&#8217;accordo con voi, iniziamo a parlare delle <strong>Surface</strong>, i primi oggetti che ci accompagneranno nella rappresentazione su schermo dei nostri file grafici. Volendo tradurre alla lettera dalla Wiki ufficiale, possiamo ottenere la spiegazione più esatta per questa classe:</p>
<p>&#8220;Le Surface in SDL.NET rappresentano, genericamente, delle informazioni grafiche. E&#8217; possibile crearle da zero (e quindi disegnarci ciò che si vuole) oppure caricando dei files dal disco fisso o da un array di bytes. Ogni Surface ha una propria larghezza ed altezza e possiedono delle funzionalità di disegno sulla superficie stessa.&#8221;</p>
<p>Le cose non sono ancora chiare? Tranquilli, ecco un bel <strong>programma di prova</strong>, che verrà prontamente spiegato.</p>
<p>[code]]czoxMDg3OlwiDQp1c2luZyBTeXN0ZW07DQoNCnVzaW5nIFNkbERvdE5ldC5Db3JlOw0KdXNpbmcgU2RsRG90TmV0LkdyYXBoaWNzOw17WyYqJl19Cg0KbmFtZXNwYWNlIERlbW8NCnsNCiAgICBwdWJsaWMgY2xhc3MgR2FtZQ0KICAgIHsNCiAgICAgICAgU3VyZmFjZSBzY2hlcm1hdHtbJiomXX1hID0gVmlkZW8uU2V0VmlkZW9Nb2RlKDgwMCwgNjAwKTsNCiAgICAgICAgU3VyZmFjZSBpbW1hZ2luZSA9IG5ldyBTdXJmYWNlKFwiaXtbJiomXX1tbWFnaW5lLmpwZ1wiKTsNCg0KICAgICAgICBbU1RBVGhyZWFkXQ0KICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpDQogIHtbJiomXX0gICAgICB7DQogICAgICAgICAgICBHYW1lIGFwcCA9IG5ldyBHYW1lKCk7DQogICAgICAgICAgICBhcHAuR28oKTsNCiAgICAgICAge1smKiZdfX0NCg0KICAgICAgICBwdWJsaWMgR2FtZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIEV2ZW50cy5GcHMgPSA2MDsNCiAgICAgICB7WyYqJl19ICAgICBWaWRlby5XaW5kb3dDYXB0aW9uID0gXCJHZXN0aW9uZSBTdXJmYWNlIC0gU0RMLk5FVFwiOw0KICAgICAgICB9DQoNCiAgICAge1smKiZdfSAgIHB1YmxpYyB2b2lkIEdvKCkNCiAgICAgICAgew0KICAgICAgICAgICAgRXZlbnRzLlF1aXQgKz0gbmV3IEV2ZW50SGFuZGxlcjx7WyYqJl19UXVpdEV2ZW50QXJncz4odGhpcy5RdWl0KTsNCiAgICAgICAgICAgIEV2ZW50cy5UaWNrICs9IG5ldyBFdmVudEhhbmRsZXI8VGlja3tbJiomXX1FdmVudEFyZ3M+KEV2ZW50c19UaWNrKTsNCiAgICAgICAgICAgIEV2ZW50cy5SdW4oKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZve1smKiZdfWlkIEV2ZW50c19UaWNrKG9iamVjdCBzZW5kZXIsIFRpY2tFdmVudEFyZ3MgZSkNCiAgICAgICAgew0KICAgICAgICAgICAgc2NoZXJ7WyYqJl19bWF0YS5GaWxsKFN5c3RlbS5EcmF3aW5nLkNvbG9yLkJsYWNrKTsNCg0KICAgICAgICAgICAgc2NoZXJtYXRhLkJsaXQoaW1tYWdpbntbJiomXX1lKTsNCg0KICAgICAgICAgICAgc2NoZXJtYXRhLlVwZGF0ZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHJpdmF0ZSB2b2lkIFF1e1smKiZdfWl0KG9iamVjdCBzZW5kZXIsIFF1aXRFdmVudEFyZ3MgZSkNCiAgICAgICAgew0KICAgICAgICAgICAgRXZlbnRzLlF1aXRBcHBsaWN7WyYqJl19YXRpb24oKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NClwiO3tbJiomXX0=[[/code]</p>
<p>Partiamo dalle prime righe:</p>
<p style="margin-bottom: 0cm; font-style: normal; font-weight: normal;" lang="zxx"><span style="color: #000000;"><span style="font-size: small;"><span style="color: #0000ff;"><span style="font-size: x-small;">using</span></span><span style="font-size: x-small;"> System;</span></span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #0000ff;"><span style="font-size: x-small;"><span lang="zxx">using</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx"> SdlDotNet.Core;</span></span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"><span style="font-size: small;"><span style="color: #0000ff;"><span style="font-size: x-small;">using</span></span><span style="font-size: x-small;"> SdlDotNet.Graphics;</span></span></span></p>
<p>Qua dovremmo esserci: includiamo i namespace che ci servono per i nostri scopi, attraverso la direttiva using.</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"><span style="font-size: x-small;"><span style="color: #2b91af;">Surface </span>schermata = Video.SetVideoMode(800, 600);</span></span></p>
<p>Ecco la prima delle nostre Surface. Come detto precedentemente, queste possono essere create in vari modi: l'oggetto “schermata” che stiamo dichiarando è speciale: rappresenta infatti la finestra di gioco che noi utilizzeremo.</p>
<p>Il tutto viene reso possibile grazie al metodo SetVideoMode della classe Video, che restituisce appunto una Surface. In questo modo abbiamo deciso che la nostra finestra avrà una dimensione di 800 pixel per 600 pixel.</p>
<p>Ora abbiamo:</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"><span style="font-size: small;"><span style="color: #2b91af;"><span style="font-size: x-small;">Surface</span></span><span style="font-size: x-small;"> immagine = </span><span style="color: #0000ff;"><span style="font-size: x-small;">new</span></span><span style="font-size: x-small;"> Surface(</span><span style="color: #a31515;"><span style="font-size: x-small;">"immagine.jpg"</span></span><span style="font-size: x-small;">);</span></span></span></p>
<p>Questa surface invece viene creata passando come argomento del metodo costruttore il nome del file da caricare. In questo caso caricheremo il file “immagine.jpg”, situato nella stessa cartella del nostro file exe compilato. Una volta che il nostro oggetto viene creato è pronto per essere mostrato. Continuiamo però con il codice:</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;"><span style="color: #0000ff;"><span style="font-size: x-small;"><span lang="zxx">public</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx"> Game()</span></span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">{</span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> </span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Events</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.Fps = 60;</span></span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> </span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Video</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.WindowCaption = </span></span></span><span style="color: #a31515;"><span style="font-size: x-small;"><span lang="zxx">"Gestione Surface - SDL.NET"</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">;</span></span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">}</span></span></p>
<p>Qui abbiamo il metodo costruttore della nostra classe Game, che svolge essenzialmente due operazioni: imposta il limite dei frame per secondo a 60 utilizzando la proprietà Fps della classe Events e cambia il titolo alla finestra del programma, stavolta utilizzando WindowCaption di Video. Molto semplice come concetto. Adesso:</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"><span style="font-size: small;"><span style="color: #0000ff;"><span style="font-size: x-small;">public</span></span><span style="font-size: x-small;"> </span><span style="color: #0000ff;"><span style="font-size: x-small;">void</span></span><span style="font-size: x-small;"> Go()</span></span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">{</span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> </span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Events</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.Quit += </span></span></span><span style="color: #0000ff;"><span style="font-size: x-small;"><span lang="zxx">new</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx"> </span></span></span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">EventHandler</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">&lt;</span></span></span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">QuitEventArgs</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">&gt;(</span></span></span><span style="color: #0000ff;"><span style="font-size: x-small;"><span lang="zxx">this</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.Quit);</span></span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> </span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Events</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.Tick += </span></span></span><span style="color: #0000ff;"><span style="font-size: x-small;"><span lang="zxx">new</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx"> </span></span></span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">EventHandler</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">&lt;</span></span></span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">TickEventArgs</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">&gt;(Events_Tick);</span></span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> </span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Events</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.Run();</span></span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">}</span></span></p>
<p>Il metodo Go aggiunge gli Handler per gli eventi che vogliamo gestire: in questo caso ne abbiamo due: Quit, già visto in precedenza, e Tick. Tick permette di gestire ciò che succede ad ogni frame, risultando particolarmente utile nell'aggiornamento dei valori delle variabili in gioco. Stando al limite dato precedentemente, la nostra funzione Events_Tick viene eseguita 60 volte al secondo. Quello che facciamo nel metodo Events_Tick è spiegato nelle righe successive:</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"><span style="font-size: x-small;"><span style="color: #0000ff;">void</span> Events_Tick(<span style="color: #0000ff;">object</span> sender, <span style="color: #2b91af;">TickEventArgs</span> e)</span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">{</span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> <span style="font-size: x-small;"><span lang="zxx">schermata.Fill(System.Drawing.</span></span></span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Color</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.Black);</span></span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx">
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">schermata.Blit(immagine);</span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx">
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">schermata.Update();</span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">}</span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"><span style="font-size: x-small;"> </span></span><br />
Ed ecco l'utilizzo effettivo delle nostre Surface! Come si può vedere, in questo metodo eseguiamo tre operazioni:</p>
<ol>
<li>Tramite la funzione Fill riempiamo tutta la schermata di nero. Può apparire insensato, ma pensate ad un file immagine con delle trasparenze (per esempio un file PNG) che si sposta nel tempo. Senza riempire lo schermo di nero tutte le volte avremmo un effetto fastidioso dovuto alla “non pulizia” della surface, se così la vogliamo chiamare.</li>
<li> Tramite il metodo Blit invece disegnamo la nostra immagine. Blit è un metodo che ha ben 8 overload: ciò vuol dire che ci sono ben 9 modalità diverse con cui disegnare sulle surface. Nel nostro caso abbiamo passato solo il nome della Surface da disegnare: questo vuol dire che le coordinate in cui verrà disegnata la nostra Surface saranno (0,0) rispetto alla “schermata”.</li>
<li> Il metodo Update si occupa infine di “aggiornare” il nostro frame e fare in modo che tutte le eventuali modifiche del sistema siano mostrate a schermo. Non dimenticatelo alla fine della fase di disegno, è importante!</li>
</ol>
<p>Ma torniamo al punto 2: perchè queste coordinate sono (0,0)? E' semplice da spiegare: la Surface “schermata” rappresenta la finestra stessa del programma. Di conseguenza, il punto situato più in alto a sinistra avrà delle coordinate pari a 0 sull'asse x ed altrettanto sulla y.</p>
<p>Per disegnare la nostra immagine in una posizione differente, la sintassi sarà la seguente:</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"><span style="font-size: x-small;">schermata.Blit(immagine, <span style="color: #0000ff;">new</span> System.Drawing.<span style="color: #2b91af;">Point</span>(20, 20));</span></span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"> </span></span>Stavolta disegneremo la nostra immagine alle coordinate (20,20), e non più (0,0), sui nostri assi cartesiani. A tal proposito devo ricordarvi una cosa molto importante: gli assi cartesiani sullo schermo del pc sono ribaltati sull'asse Y. In poche parole, ecco due immagini per chiarire le idee.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-68" title="cartesiani-1" src="http://francescomalatesta.net/wp-content/uploads/2009/11/cartesiani-1.jpg" alt="cartesiani-1" width="450" height="350" /></p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-69" title="cartesiani-2" src="http://francescomalatesta.net/wp-content/uploads/2009/11/cartesiani-2.jpg" alt="cartesiani-2" width="450" height="350" /></p>
<p>Ciò che abbiamo dopo il metodo Events_Tick è il codice del metodo Quit, che ci consente di uscire dal programma.</p>
<p>Tornando a parlare genericamente, l'oggetto Surface supporta una buona quantità di formati grafici:</p>
<ul>
<li> BMP</li>
<li> PNM</li>
<li> XPM</li>
<li> LBM</li>
<li> PCX</li>
<li> GIF</li>
<li> JPEG</li>
<li> PNG</li>
<li> TGA</li>
</ul>
<p><strong>Trasparenza</strong><br />
Ovviamente non è solo questo quello che dobbiamo dire riguardo alle Surface e al loro utilizzo. Un'altra feature molto utile è quella della gestione della trasparenza, che avviene tramite due proprietà:</p>
<ul>
<li>TransparentColor</li>
<li> Transparent</li>
</ul>
<p>Facciamo un esempio. Abbiamo un'immagine in un file PNG che vogliamo utilizzare come cursore del mouse nel nostro gioco. Caricandola e mostrandola sullo schermo tramite la procedura sopra mostrata, tuttavia, non avremmo il risultato desiderato: oltre a mostrare il cursore, infatti, verrebbe mostrato anche il quadrato in cui è contenuta l'immagine, ovvero tutto il file immagine, per intero. Come facciamo ad evitare questo problema?</p>
<p>Per prima cosa, dobbiamo specificare il colore di trasparenza del nostro file. Ecco un veloce esempio, usando sempre la nostra surface “immagine”:</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" lang="zxx" align="LEFT"><span style="color: #000000;"><span style="font-size: x-small;">immagine.TransparentColor = System.Drawing.<span style="color: #2b91af;">Color</span>.White;</span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx" align="LEFT">In questo modo diciamo al sistema che, quando mostrerà a schermo la surface “immagine” dovrà ignorare tutti i pixel di colore bianco. Dopo questo, usiamo anche la proprietà Transparent, semplicemente impostandola su True. Ricordate che questo step è necessario.</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p><span style="color: #000000;"><span style="font-size: x-small;">immagine.Transparent = <span style="color: #0000ff;">true</span>;</span></span></p>
<p>Adesso il nostro cursore sarà bello e pronto da mostrare senza problemi <img src='http://francescomalatesta.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Ovviamente queste istruzioni è bene non metterle nel loop senza condizioni: io per esempio le metto nel metodo costruttore della mia classe. Ecco un esempio completo, per mostrare dove ho posizionato le istruzioni.</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;" lang="zxx" align="LEFT"><span style="color: #000000;"><span style="font-size: x-small;"><span style="color: #0000ff;">public</span> Game()</span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">{</span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> <span style="font-size: x-small;"><span lang="zxx">immagine.TransparentColor = System.Drawing.</span></span></span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Color</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.White;</span></span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> <span style="font-size: x-small;"><span lang="zxx">immagine.Transparent = </span></span></span><span style="color: #0000ff;"><span style="font-size: x-small;"><span lang="zxx">true</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">;</span></span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx">
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> </span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Events</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.Fps = 60;</span></span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"> </span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Video</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.WindowCaption = </span></span></span><span style="color: #a31515;"><span style="font-size: x-small;"><span lang="zxx">"Gestione Surface - SDL.NET"</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">;</span></span></span></p>
<p style="margin-bottom: 0cm;" lang="zxx"><span style="color: #000000;"> <span style="font-size: x-small;">}</span></span></p>
<p><strong>Alpha Blending</strong></p>
<p>Anche l'Alpha Blending è decisamente semplice da utilizzare. Come per la trasparenza, dovremo scrivere solamente due righe di codice, utilizzando due proprietà:</p>
<ul>
<li>Alpha</li>
<li> AlphaBlending</li>
</ul>
<p>Alpha è di tipo byte e va da 0 a 255. Impostandolo su 0 avremo la totale trasparenza della surface. A 255 invece la surface sarà totalmente visibile. Dopo aver impostato l'Alpha procediamo quindi ad attivare l'AlphaBlending impostando la proprietà su true, proprio come per la trasparenza. Se non effettuiamo quest'ultimo passo la proprietà Alpha verrà ignorata.</p>
<p>Ecco un esempio:</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm; font-weight: normal;" lang="zxx"><span style="color: #000000;"><span style="font-size: x-small;">immagine.Alpha = <span style="color: #2b91af;">Convert</span>.ToByte(255);</span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">immagine.Alpha = </span></span></span><span style="color: #2b91af;"><span style="font-size: x-small;"><span lang="zxx">Convert</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">.ToByte(0);</span></span></span></p>
<p style="margin-bottom: 0cm;"><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">immagine.AlphaBlending = </span></span></span><span style="color: #0000ff;"><span style="font-size: x-small;"><span lang="zxx">true</span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span lang="zxx">;</span></span></span></p>
<p>Come suggerisce anche la Wiki ufficiale, un uso saggio delle surface può essere anche l'uso delle SurfaceCollections, ovvero strutture dinamiche che permettono di gestire altrettanto dinamicamente questo tipo di oggetto. Tuttavia ne parleremo più in la, magari quando riuscirò a scrivere una sorta di sezione “avanzata” di questa guida. Per ora, per quanto riguarda le surface, è tutto!</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Ffrancescomalatesta.net%2F2009%2F11%2F18%2Foutput-immagini-guida-sdl-net%2F&amp;linkname=Output%20%26%238211%3B%20Immagini%20%26%238211%3B%20Guida%20SDL.NET"><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/11/18/output-immagini-guida-sdl-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
