<?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>kalabaza.com.mx</title>
	<atom:link href="http://kalabaza.com.mx/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://kalabaza.com.mx</link>
	<description>Sitio de animación y desarrollo de video juegos</description>
	<lastBuildDate>Sun, 24 Jan 2010 13:22:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>8 Fondos con scroll (parte 2)</title>
		<link>http://kalabaza.com.mx/?p=431</link>
		<comments>http://kalabaza.com.mx/?p=431#comments</comments>
		<pubDate>Wed, 20 Jan 2010 15:31:43 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[8 Fondos con scroll (parte 2)]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Background]]></category>
		<category><![CDATA[scroll]]></category>
		<category><![CDATA[Sprites]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=431</guid>
		<description><![CDATA[&#160; Bienvenidos a esta nuevo post en el que continuaremos con la programaci&#243;n del scroll en el &#160;Background de los juegos 2D. En esta ocasi&#243;n hice bastantes cambios a la versi&#243;n anterior por ser un m&#233;todo diferente de programaci&#243;n, sin embargo el programa lo empec&#233; utilizando el c&#243;digo del post anterior, como lo he estado [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://kalabaza.com.mx/wp-content/uploads/2009/05/images-1.jpg"><img src="http://kalabaza.com.mx/wp-content/uploads/2009/05/images-1.jpg" alt="" title="XNA" width="116" height="99" class="aligncenter size-full wp-image-25" /></a></p>
<p>&nbsp;</p>
<p>Bienvenidos a esta nuevo post en el que continuaremos con la programaci&oacute;n del scroll en el &nbsp;Background de los juegos 2D.<br />
<br />
En esta ocasi&oacute;n hice bastantes cambios a la versi&oacute;n anterior por ser un m&eacute;todo diferente de programaci&oacute;n, sin embargo el programa lo empec&eacute; utilizando el c&oacute;digo del post anterior, como lo he estado haciendo hasta ahora. Espero que no haya confusi&oacute;n con los cambios de c&oacute;digo pero tratar&eacute; de explicarlo lo mejor posible.</p>
<p>&nbsp;</p>
<p>En este ocasi&oacute;n vamos a ver los siguientes puntos:</p>
<p>&nbsp;</p>
<ul>
<li>Explicaci&oacute;n previa</li>
<li>Agregar propiedades a <i>AnimSprite</i></li>
<li>Carga de imágenes para los backgrounds</li>
<li>Desplazamiento de los backgrounds</li>
<li>Modificación de método <i>Draw()</i><br />
&nbsp;</li>
</ul>
<p>
<b>Explicación previa</b></p>
<p>&nbsp;</p>
<p>Como siempre voy a explicar primero lo que vamos a hacer. Anteriormente ten&iacute;amos tres backgrounds que se desplazaban en sentido opuesto al desplazamiento del personaje cuando este alcanzaba uno de los l&iacute;mites predefinidos en los extremos de la pantalla. Estos background se iban repitiendo de tal forma que el avance se volv&iacute;a infinito. En esta ocasi&oacute;n vamos limitar el avance en ambos extremos de nuestro escenario y vamos a ocupar tambi&eacute;n tres background pero no consecutivos, sino sobrepuestos y que se desplazan a diferentes velocidades para crear mayor profundidad en el escenario. Además el fondo que se  encuentra más al fondo mantendrá un desplazamiento constante independiente del movimiento del personaje para imitar el desplazamiento de las nubes.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><b>Agregar propiedades a <i>AnimSprite</i></b></p>
<p>&nbsp;</p>
<p>Vamos a empezar por hacer unas modificaciones a nuestra clase <em>AnimSprite</em>;  estas modificaciones consisten en agregar un par de propiedades que son las dimensiones de los sprites, a estas dos propiedades las llamaremos <em>Largo </em>y <em>Altura </em>y las declararemos en la parte de arriba de nuestra clase.</p>
<p>&nbsp;</p>
<p>&nbsp;<font color="#3333FF"> public int</font> Largo; <br />
<font color="#3333FF">&nbsp; public int </font>Altura;</p>
<p>&nbsp;</p>
<p>Estos dos valores no los vamos a asignar nosotros sino que vamos a obtener su valor directamente de las imágenes al momento de cargarlas, escribiendo el  siguiente código en el método <i>CargaImagen()</i></p>
<p>&nbsp;</br><br />
&nbsp;&nbsp;Altura = SpriteMov[0].Height;<br />
&nbsp;&nbsp;Largo = SpriteMov[0].Width;</p>
<p>&nbsp;</p>
<p>De esta forma, cada vez que se cargue una imagen tendremos a nuestra  disposición estos dos valores. Sin embargo cabe señalar que para el caso en el que ocupamos la clase para cargar sprites animados como es el caso de Megaman, lo que nos devolverían estas variables sería las dimensiones de la última imagen cargada la cual puede o no tener las mismas dimensiones de las otras.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><b>Carga de imágenes para los backgrounds</b></p>
<p>&nbsp;</p>
<p>Lo que haremos a continuación es cargar las imágenes que vamos a ocupar dentro de nuestro proyecto en la carpeta Sprites, como lo hemos hecho antes. Puedes consultar la explicación que viene en el Post <a href="http://kalabaza.com.mx/?cat=15">&quot;Carga y animación de un sprites&quot;</a> y puedes descargar las imágenes <a href="http://kalabaza.com.mx/Archivos/Sprites3.zip">aqui</a>.</p>
<p>&nbsp;</p>
<p>Como coment&eacute; vamos a ocupar tres fondos de los cuales los primeros dos se repetirán varias veces en la pantalla y el tercero solo se recorrer&aacute; conforme el personaje vaya avanzando. Para los dos primeros vamos a crear listas de nuestra clase <span style="font-style: italic;">AnimSprite</span> y para el tercero solo crearemos un objeto con el siguiente c&oacute;digo</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;AnimSprite&gt; FondosCielo = <span style="color: rgb(51, 51, 255);">new</span> List&lt;AnimSprite&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;AnimSprite&gt; FondosPicos = <span style="color: rgb(51, 51, 255);">new</span> List&lt;AnimSprite&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AnimSprite Fondo = <span style="color: rgb(51, 51, 255);">new</span> AnimSprite()</p>
<p>&nbsp;</p>
<p>Este c&oacute;digo va dentro de la declaraci&oacute;n de variables de nuestra clase <em>Engine </em>y sustituira la declaración del arreglo <i>Fondos</i> que teníamos anteriormente en esa ubicación; Si tienes duda sobre la sintaxis de las listas puedes consultar el post <a href="http://kalabaza.com.mx/?cat=19">&#8220;Listas&#8221;</a></p>
<p>&nbsp;</p>
<p>Ya con nuestros objetos declarados lo siguiente es escribir el c&oacute;digo para cargar las imágenes. Para hacer esto vamos a sustituir el c&oacute;digo que ocupábamos para este propósito dentro del <span style="font-style: italic;">LoadContent()</span> de tal forma que el m&eacute;todo completo quedar&aacute; de la siguiente forma:</p>
<p>&nbsp;</p>
<p>&nbsp;<span style="color: rgb(51, 51, 255);">protected override void</span> LoadContent()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spriteBatch = <span style="color: rgb(51, 51, 255);">new</span> SpriteBatch(this.graphics.GraphicsDevice); </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: rgb(0, 153, 0);">// Secci&oacute;n 1 Cielo azul</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">int</span> PosTmp = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">for</span> (<span style="color: rgb(51, 51, 255);">int</span> i = 1;i &lt; 5; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AnimSprite FondoTmp = <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">AnimSprite</span>(PosTmp, 0, 0, <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">Vector2</span>(0, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondoTmp.CargaImagen(Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(<span style="color: rgb(102, 0, 0);">&#8220;Sprites/Fondo3&#8243;</span> ));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosCielo.Add(FondoTmp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PosTmp = FondoTmp.Largo * i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: rgb(0, 153, 0);">&nbsp;// Secci&oacute;n 2 Picos</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PosTmp = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">for</span> (<span style="color: rgb(51, 51, 255);">int</span> i = 1; i &lt; 8; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AnimSprite FondoTmp = <span style="color: rgb(51, 51, 255);">new</span> AnimSprite(PosTmp, 325, 0, <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">Vector2</span>(0, 0));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondoTmp.CargaImagen(Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(<span style="color: rgb(102, 0, 0);">&#8220;Sprites/Fondo2&#8243;</span>));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosPicos.Add(FondoTmp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PosTmp = FondoTmp.Largo * i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 153, 0);">//Secci&oacute;n 3 Piso</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondo = <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">AnimSprite</span>(0, 353, 0, <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">Vector2</span>(0, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondo.CargaImagen(Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(<span style="color: rgb(102, 0, 0);">&#8220;Sprites/Fondo1&#8243;</span>));</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: rgb(0, 153, 0);">//Secci&oacute;n 4 Personaje</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">for</span> (<span style="color: rgb(51, 51, 255);">int</span> i = 1; i&lt;=7; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Megaman.CargaImagen(Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(<span style="color: rgb(102, 0, 0);">&#8220;Sprites/MM&#8221;</span>+ i));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>Puse comentarios para poder explicar el c&oacute;digo por partes.<br />
En la primer secci&oacute;n vamos a cargar la imagen de m&aacute;s al fondo, la cual he denominado Cielo azul.</p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo3.png"><img src="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo3-159x300.png" alt="" title="Fondo3" width="159" height="300" class="aligncenter size-medium wp-image-432" /></a></p>
<p>&nbsp;</p>
<p>Iniciamos por declarar la variable <i>PosTmp</i> que va a guardar  la posición inicial de nuestras imágenes que carguemos en nuestra lista. Enseguida lo que vamos a hacer es utilizar el ciclo <span style="font-style: italic;">for</span> para cargar cuatro veces la imagen en la lista &nbsp;<span style="font-style: italic;">FondosCielo </span>&nbsp;(desde <i>i</i>= 1 hasta <i>i</i>=5 ) esto es porque esta imagen tiene de dimensiones 256 x 482 y aunque se necesitan tres imágenes para cubrir toda la pantalla, necesitamos una imagen adicional para cubrir el área que queda al desplazarse por completo una de las imágenes;  Puedes cambiar el límite del&nbsp; <i>for</i>&nbsp; a 4 para entender mejor lo que pasa.</p>
<p>&nbsp;</p>
<p>Dentro del ciclo <i>for </i>tenemos lo siguiente:</p>
<p>&nbsp;</p>
<p>&nbsp;AnimSprite FondoTmp = <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">AnimSprite</span>(PosTmp, 0, 0, <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">Vector2</span>(0, 0));</p>
<p>&nbsp;</p>
<p>En esta línea lo que hacemos es instanciar un objeto temporal&nbsp; <span style="font-style: italic;">AnimSprite</span> de nombre <span style="font-style: italic;">FondoTmp</span>;  Este objeto tendr&aacute; como posici&oacute;n inicial en X el valor de <span style="font-style: italic;">PosTmp</span>, el cual originalmente es cero y conforme va avanzando el loop se va incrementando de acuerdo al largo de la imagen. Por ejemplo, para nuestro ejemplo la imagen que &nbsp;ocupamos tiene de dimensiones en Largo y Alto de 256 x 482 respectivamente. Por lo tanto el valor de <span style="font-style: italic;">PosTmp</span> ser&aacute; el siguiente para cada valor de <span style="font-style: italic;">i</span> dentro del <span style="font-style: italic;">for</span>:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="background-color: rgb(255, 255, 153); width: 201px; height: 113px; text-align: left; margin-left: auto; margin-right: auto;" border="1" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="font-weight: bold; text-align: center;">i</td>
<td style="font-weight: bold; text-align: center;">PosTmp</td>
</tr>
<tr>
<td style="text-align: center;">1</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">2</td>
<td style="text-align: center;">256</td>
</tr>
<tr>
<td style="text-align: center;">3</td>
<td style="text-align: center;">512</td>
</tr>
<tr>
<td style="text-align: center;">4</td>
<td style="text-align: center;">768</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>La posici&oacute;n en Y ser&aacute; constante e igual a cero, el ángulo de rotaci&oacute;n será tambi&eacute;n cero as&iacute; como las coordenadas del centro de rotaci&oacute;n que esta definido por el vector que se instancia como parámetro final. Enseguida tenemos la siguiente línea:</p>
<p>&nbsp;</p>
<p>FondoTmp.CargaImagen(Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(<span style="color: rgb(102, 0, 0);">&#8220;Sprites/Fondo3&#8243;</span> ));</p>
<p>&nbsp;</p>
<p>que como ya sabemos por post anteriores nos sirve para cargar nuestra imagen <i>Fondo3</i> en el objeto que acabamos de crear. </p>
<p>La siguiente línea</p>
<p>&nbsp;</p>
<p>FondosPicos.Add(FondoTmp);</p>
<p>&nbsp;</p>
<p>se utiliza para agregar el objeto que acabamos de instanciar dentro de nuestra lista y finalmente en la última línea </p>
<p>&nbsp;</p>
<p>PosTmp = FondoTmp.Largo * i;</p>
<p>&nbsp;</p>
<p>incrementamos el valor de PosTmp de acuerdo a la tabla anterior.</p>
<p>&nbsp;</p>
<p>En la sección 2 denominada &#8216;Picos&#8217; tenemos la misma estructura pero reiniciamos el valor de <i>PostTmp</i> a cero y en lugar de <i>Fondo1</i> vamos  a cargar la imagen <i>Fondo2</i>.</p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo2.png"><img src="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo2.png" alt="" title="Fondo2" width="128" height="108" class="aligncenter size-full wp-image-448" /></a></p>
<p>&nbsp;</p>
<p> Además dado que las dimensiones de esta nueva imagen son 128 x 108 será necesario copiar siete veces la imagen en la lista <i>FondosPicos</i>&nbsp; (desde <i>i</i>= 1 hasta<i> i</i> = 8).</p>
<div align="left">
<p>&nbsp;</p>
<table border="0" width="100%" height="49" cellspacing="0" cellpadding="0" bgcolor="#FFFF99">
<tr>
<td>Nota: La mejor solución para definir el número de veces que la imagen se guarda en la lista es determinarlo en base al ancho de la imagen a carga de tal forma que rellene por completo toda la pantalla y agregamos una imagen más para cubrir el espacio faltante al desplazarse. En ese ejemplo ocupo valores constantes para que sea más fácil de entender.</td>
</tr>
</table>
</div>
<p>&nbsp;</p>
<p>En la sección 3 denominada &#8216;Piso&#8217; la estructura es diferente, dado que solo  vamos a ocupar una imagen que va a ocupar todo nuestro escenario. </p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo1.png"><img src="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo1-300x24.png" alt="" title="Fondo1" width="300" height="24" class="aligncenter size-medium wp-image-449" /></a></p>
<p>&nbsp;</p>
<p>Por lo tanto solo instanciamos en objeto <i>Fondo</i> como hemos estado haciendo y definimos su posición en la coordenada (0,0). Finalmente cargamos la imagen <i>Fondo1</i> con ángulo de rotación 0 y origen en (0,0).</p>
<p>&nbsp;</p>
<p>En la última sección denominada &#8216;Personaje&#8217; seguimos cargando los sprites de megaman como en los post anteriores.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><b>Desplazamiento de los backgrounds</b></p>
<p>&nbsp;</p>
<p>Ya con las imágenes cargadas lo siguiente es escribir el código para desplazarlas conforme avanza nuestro personaje. Para hacer esto vamos a modificar el método<i> Update()</i> de nuestra clase <i>Engine</i>. Como expliqué al principio, el background del cielo va a desplazarse independientemente del movimiento del personaje. Este desplazamiento será de un pixel por cada ciclo del juego y será de derecha a izquierda. Para lograr esto vamos a escribir el siguiente código dentro de nuestro <i>if</i> principal del método <i>Update() </i></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333FF">foreach</font> (<font color="#33CCFF">AnimSprite </font>Tmp <font color="#3333FF">in</font> FondosCielo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tmp.XPos -= 1;</p>
<p>&nbsp;</p>
<p>Lo que hacemos aquí es desplazar un píxel a la izquierda cada uno de los background dentro de nuestra lista <i>FondosCielo</i>; como comenté antes, este código esta fuera de las condiciones de dirección de los personajes así que siempre se ejecuta.</p>
<p>&nbsp;</p>
<p>Dentro de nuestro código original&nbsp; tenemos enseguida los dos <i>if&#8217;s</i> que controlan&nbsp; los cambios en el juego de acuerdo a la tecla presionada, izquierda o derecha. Dentro del primer <i>if</i> (correspondiente a la condición de que se ha presionado la tecla a la DERECHA) vamos a sustituir el código anterior por el siguiente:</p>
<p>&nbsp;</p>
<p><font color="#006600">//Avance</font><br />
&nbsp;&nbsp; <font color="#3333FF">if</font> (Megaman.XPos &lt; 540 || (Megaman.XPos &lt;graphics.PreferredBackBufferWidth -- 40 &amp;&amp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fondo.XPos &lt; graphics.PreferredBackBufferWidth-Fondo.Largo+10 ))<br />
&nbsp;&nbsp;&nbsp;&nbsp;Megaman.XPos += 10;<br />
&nbsp;&nbsp;<font color="#3333FF"> else if</font> (Fondo.XPos&gt;=  graphics.PreferredBackBufferWidth-Fondo.Largo+10)<br />
&nbsp;&nbsp;{<br />
<font color="#006600">&nbsp;//Cielo</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333FF">for</font>(<font color="#3333FF">int</font> i= 0; i &lt; FondosCielo.Count;i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosCielo[i].XPos -= 3;</p>
<p><font color="#006600">//Picos</font><br />
&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333FF">for</font> (<font color="#3333FF">int</font> i = 0; i &lt; FondosPicos.Count; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; FondosPicos[i].XPos -= 6;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <font color="#3333FF">if</font> (FondosPicos[i].XPos + FondosPicos[i].Largo < 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3333FF">if</font> (i == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosPicos[i].XPos  = FondosPicos[FondosPicos.Count - 1].XPos +<br />
 FondosPicos[FondosPicos.Count - 1].Largo-6;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3333FF">else</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosPicos[i].XPos = FondosPicos[i - 1].XPos + FondosPicos[i - 1].Largo-6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
</p>
<p>
<br />
<font color="#006600">// Piso</font><br />
&nbsp;Fondo.XPos -= 10;<br />
&nbsp;}</p>
<p>
<br />
<font color="#006600">//Megaman </font><br />
<br />
&nbsp; <font color="#3333FF">if</font> (Megaman.UltimaDir == 0 &amp;&amp; Megaman.XPos &lt; graphics.PreferredBackBufferWidth -- 40)<br />
&nbsp;&nbsp;&nbsp;Megaman.UpdateMov();<br />
&nbsp; <font color="#3333FF">else</font><br />
&nbsp;&nbsp;&nbsp;Megaman.FrameActual = 6;<br />
&nbsp;</p>
<p>
Megaman.UltimaDir = 0;</p>
<p>&nbsp;</p>
<p>Nuevamente el código en este bloque está dividido en cinco partes definidas por las etiquetas: Avance, Cielo, Picos, Piso y Megaman. En la sección Avance tendremos, como su nombre lo indica, la condición que hacer que el personaje avance o no cuando se presiona la tecla de dirección a la derecha. Lo que queremos es limitar el movimiento para que solo se pueda mover dentro del área definida por la imagen de piso que ocupamos. Al igual que en el post anterior vamos de permitir que nuestro personaje avance mientras no alcance el límite derecho definido por nosotros (<i>Megaman.XPos</i> &lt; 540) sin embargo tenemos que agregar una nueva condición que permitirá avanzar a nuestro personaje hasta el final de la pantalla cuando se haya alcanzado el final de la imagen definida por nuestro objeto <i>Piso</i>. Esta condición tendrá que verificar que la posición de Megaman sea menor al límite derecho de la pantalla. Este límite esta definido por la constante <i>graphics.PreferredBackBufferWidth</i> que para nuestro ejemplo tiene un valor de 640, sin embargo como recordarán el origen de los sprites se encuentra en el extremo superior izquierdo, entonces se permitimos que Megaman alcance este límite habrá salido de la pantalla. Es por eso que necesitamos restar el ancho de los sprites de Megaman para que siempre se mantenga dentro de la pantalla. Este ancho es aproximadamente 40 pixeles y digo aproximadamente porque el ancho real del sprite es 44 pixeles pero a la derecha tienen un espacio en blanco variable para cada imagen por consiguiente nuestra condición queda como:</p>
<p>&nbsp;</p>
<p> Megaman.XPos &lt;graphics.PreferredBackBufferWidth -- 40</p>
<p>&nbsp;</p>
<p> pero si dejamos esta condición así, permitira a Megaman que alcance el límite de la pantalla y no le importará la condición anterior. Es por eso que tenemos que agregar una condición adicional a esta parte del <i>if</i>. Esta parte debe permitir a Megaman que alcance el límite de la pantalla pero cuando la posición de Fondo este a una posición <i>n</i> donde <i>n</i> es el negativo del Largo de la imagen más el ancho de la pantalla osea:</p>
<p>&nbsp;</p>
<p> Fondo.XPos &lt;  graphics.PreferredBackBufferWidth-Fondo.Largo+10</p>
<p>&nbsp;</p>
<p> El 10 adicional es una corrección que hay que hacer porque el avance de <i>Fondo</i> es de 10 en 10 unidades. Con esto nos quedará completo el <i>if</i> de la Sección &#8216;Avance&#8217;.</p>
<p>&nbsp;</p>
<p>Si la condición anterior no se cumple entonces debemos verificar primero que <i>Fondo</i> no este completamente a la izquierda para permitir el desplazamiento de los demás fondos. Esto lo hacemos verificando que la posición de <i>Fondo</i> sea mayor al negativo del largo de la imagen más el ancho de la pantalla o lo que es lo mismo:</p>
<p>&nbsp;</p>
<p> Fondo.XPos&gt;= graphics.PreferredBackBufferWidth-Fondo.Largo+10</p>
<p>&nbsp;</p>
<p> Nuevamente el 10 es un valor de corrección.</p>
<p>&nbsp;</p>
<p>En la sección denominada &#8216;Cielo&#8217; vamos a desplazar tres pixeles a la izquierda todos nuestras imágenes que están dentro de la lista <i>FondosCielo</i> con ayuda del <i>for</i> que recorrerá todas las imágenes en la lista. Esto será lo único que haremos por ahora pero más adelante explicaré porque.</p>
<p>&nbsp;</p>
<p>En la sección &#8216;Picos&#8217; tenemos también un <i>for</i> que recorrerá todas las imágenes de nuestra lista <i>FondosPicos</i> pero en lugar de recorrer las imágenes tres pixeles las recorreremos seis. Esto, como comenté al principio nos creará un efecto de profundidad en nuestro escenario.<br />
Lo que hacemos a continuación es verificar que cada imagen que vamos recorriendo se encuentre dentro de los límites de la pantalla de la siguiente manera:</p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo4.png"><img src="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo4.png" alt="" title="Fondo4" width="613" height="300" class="aligncenter size-full wp-image-433" /></a></p>
<p>&nbsp;</p>
<p>Como se muestra en la imagen, si la posición actual de la imagen <i>(FondosPicos[i].XPos</i>) esta en una posición negativa &#8216;n&#8217; tal que &#8216;n&#8217; = -- <i>FondosPicos[i]</i>. Largo&nbsp;  esto significaría que la imagen ha salido por completo de la pantalla en cuyo caso lo que hacemos es colocar esta imagen a la derecha al final de la última  imagen de la lista o mejor dicho a la derecha de la imagen que este más a la derecha de la pantalla. La pregunta ahora sería cual es el índice de dicha imagen. Primero si la imagen que se salió de la pantalla es la primer imagen o sea aquella con índice i ==0 entonces sabemos que la imagen más a la derecha es la última en la lista y para encontrar el último índice utilizamos la propiedad <i>Count</i> que nos regresa el número de elementos contenidos en la lista y le restamos 1 para obtener el último índice.</p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp content/uploads/2010/01/Fondo5.png"><img src="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo5.png" alt="" title="Fondo5" width="458" height="205" class="aligncenter size-full wp-image-434" /></a></p>
<p>&nbsp;</p>
<p>Una vez que conocemos el último indicie solo nos resta sumar la posición en X del mismo al ancho o <i>Largo</i> de las imágenes que componen la lista y restarle 6 pixeles como se muestra en la siguiente línea:</p>
<p>&nbsp;</p>
<p>&nbsp; FondosPicos[i].XPos = FondosPicos[FondosPicos.Count - 1].XPos + FondosPicos[FondosPicos.Count - 1].Largo-6;</p>
<p>&nbsp;</p>
<p>Para un caso diferente sabemos que si siempre realizamos el movimiento de las imágenes a la derecha del último elemento de la lista esta debería tener un índice siguiente menor al que vamos a desplazar, así que&nbsp; solo tendríamos que restar 1 al índice que vamos a desplazar.</p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo6.png"><img src="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo6.png" alt="" title="Fondo6" width="458" height="205" class="aligncenter size-full wp-image-435" /></a></p>
<p>&nbsp;</p>
<p>y al igual que en el caso anterior solo sumamos la posición de este elemento al largo de las imágenes y le restamos 6 pixeles.</p>
<p>&nbsp;</p>
<p> FondosPicos[i].XPos = FondosPicos[i - 1].XPos + FondosPicos[i - 1].Largo-6;</p>
<p>&nbsp;</p>
<p>Para nuestra sección &#8216;Piso&#8217; solo nos queda restar 10 pixeles a nuestra imagen. Como puedes observar esta imagen es la que más se desplaza y este desplazamiento es equivalente al que realiza el personaje porque se encuentran en el mismo plano, además no se necesita ninguna validación porque esta imagen no se repite.</p>
<p>&nbsp;</p>
<p>En nuestra última sección vamos a seguir actualizando el sprite que se va a mostrar en la animación de Megaman desplazándose, sin embargo como ahora tenemos límites en cada extremo de la pantalla tenemos que verificar que no los haya alcanzado antes de seguir con el siguiente sprite. Lo único que hacemos es verificar que la posición de megaman este dentro de los límites de la pantalla para permitirle que se desplace de lo contrario se detendrá la animación y se mostrará el sprite de megaman de pie. Finalmente establecemos como última dirección 0 que es a la derecha</p>
<p>&nbsp;</p>
<p>Dentro de la condición de que se haya presionado la tecla de dirección IZQUIERDA, tendremos que escribir el siguiente código.</p>
<p>&nbsp;</p>
<p><font color="#006600">//Avance</font><br />
&nbsp; <font color="#3333FF">if</font> (Megaman.XPos &gt; 100 || (Megaman.XPos &gt; 0 &amp;&amp; Fondo.XPos &gt;= 0))<br />
&nbsp;&nbsp;&nbsp; Megaman.XPos -= 10;</p>
<p>&nbsp; <font color="#3333FF">else if</font> (Fondo.XPos&lt;0)<br />
&nbsp; {</p>
<p>
<font color="#006600">//Cielo</font><br />
&nbsp;&nbsp;&nbsp; <font color="#3333FF">for</font> (<font color="#3333FF">int</font> i = FondosCielo.Count-1; i &gt;= 0; i--)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosCielo[i].XPos += 3;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333FF">if</font> (FondosCielo[i].XPos &gt; graphics.PreferredBackBufferWidth)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3333FF">if</font> (i == FondosCielo.Count -- 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosCielo[i].XPos = FondosCielo[0].XPos -- FondosCielo[i].Largo + 3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3333FF">else</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosCielo[i].XPos = FondosCielo[i + 1].XPos -- FondosCielo[i].Largo + 3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>
<font color="#006600">//Picos</font><br />
&nbsp;&nbsp;&nbsp; <font color="#3333FF">for</font> (<font color="#3333FF">int</font> i = FondosPicos.Count -- 1; i &gt;= 0; i--)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosPicos[i].XPos += 6;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333FF">if</font> (FondosPicos[i].XPos &gt; graphics.PreferredBackBufferWidth)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3333FF">if</font> (i == FondosPicos.Count -- 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosPicos[i].XPos = FondosPicos[0].XPos -- FondosPicos[i].Largo + 6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#3333FF">else</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosPicos[i].XPos = FondosPicos[i + 1].XPos -- FondosPicos[i].Largo + 6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>
<font color="#006600">//Piso</font><br />
&nbsp; Fondo.XPos += 10;<br />
}<br />
&nbsp;</p>
<p>
<font color="#006600">//Megaman </font><br />
<br />
&nbsp; <font color="#3333FF">if</font> (Megaman.UltimaDir == 1 &amp;&amp; Megaman.XPos &gt; 0)<br />
&nbsp;&nbsp;&nbsp; Megaman.UpdateMov();<br />
&nbsp; <font color="#3333FF">else</font><br />
&nbsp;&nbsp;&nbsp; Megaman.FrameActual = 6;</p>
<p>Megaman.UltimaDir = 1;</p>
<p>&nbsp;</p>
<p>Dado que la estructura es la misma que el bloque anterior solo explicaré algunas diferencias importantes. Primero, como es obvio todas las condiciones y los límites se basan en el lado izquierdo de la pantalla, así por ejemplo en la sección Avance permitimos el desplazamiento de Megaman siempre y cuando no rebase el límite permitido que es hasta X = 100 o hasta el final de la pantalla si <i>Fondo</i> se encuentra recorrida completamente a la derecha.</p>
<p>&nbsp;</p>
<p>En la sección cielo la diferencia principal con el bloque anterior es que sí cuenta con una validación después de incrementar 3 pixeles a la posición de <i>FondoCielo</i> ya que si alguna de las imágenes se sale de la pantalla se pasará al principio de la lista de manera inversa a lo que teníamos en el bloque anterior. Esta misma lógica se aplica ala sección &#8216;Picos&#8217; en el que al salir una imagen del lado de la pantalla se recorre enseguida al principio de la lista.</p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo7.png"><img src="http://kalabaza.com.mx/wp-content/uploads/2010/01/Fondo7-300x134.png" alt="" title="Fondo7" width="300" height="134" class="aligncenter size-medium wp-image-456" /></a></p>
<p>&nbsp;</p>
<p>Finalmente en la sección &#8216;Megaman&#8217; al igual que en bloque anterior, actualizamos los sprites de Megaman siempre y cuando no se salga de la pantalla.Fuera de estos dos bloques de condición vamos a escribir el siguiente código</p>
<p>&nbsp;</p>
<p>&nbsp; <font color="#3333FF">for</font> (<font color="#3333FF">int</font> i = 0; i &lt; FondosCielo.Count; i++)<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333FF">if</font> (FondosCielo[i].XPos + FondosCielo[i].Largo &lt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333FF">if</font> (i == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosCielo[i].XPos = FondosCielo[FondosCielo.Count - 1].XPos + FondosCielo[FondosCielo.Count - 1].Largo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#3333FF">else</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FondosCielo[i].XPos = FondosCielo[i - 1].XPos + FondosCielo[i - 1].Largo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }</p>
<p>&nbsp;</p>
<p>Este código lo que hace es verificar cada una de las imágenes de la lista <i>FondoCielo</i> y la razón por la que está afuera de las condiciones es porque como recordarán, ese fondo se mueve independientemente y por lo tanto necesitamos verificar que en ese movimiento no se salga de la pantalla. Es por esta razón que en el primer bloque el avance <i>FondoCielo</i> no tenía ningún límite para su avance pues se necesitaba validar al presionar la tecla de dirección derecha y también cuando no se presionaba ninguna tecla. De esta forma nos ahorramos una de las validaciones.</p>
<p>&nbsp;</p>
<p>Lo que hacemos, como en casos anteriores es verificar que la posición de las imágenes <i>FondoCielo</i> estén siempre dentro de la pantalla o de lo contrario se moverá al final de la lista la que este fuera.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><b>Modificación del método Draw()</b></p>
<p>&nbsp;</p>
<p>Lo último que nos resta es dibujar en pantalla tanto los fondos como a nuestro personaje para esto vamos a escribir en dentro del método <i>Draw()</i> de nuestra clase <i>AnimSprite</i> el siguiente código:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <font color="#3333FF">foreach</font> (<font color="#33CCFF">AnimSprite</font> Tmp in FondosCielo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tmp.Draw(spriteBatch);</p>
<p>&nbsp;&nbsp;&nbsp; <font color="#3333FF">foreach</font> (<font color="#33CCFF">AnimSprite</font> Tmp in FondosPicos) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tmp.Draw(spriteBatch);</p>
<p>&nbsp; Fondo.Draw(spriteBatch);</p>
<p>&nbsp; Megaman.Draw(spriteBatch); <br />
&nbsp; <font color="#3333FF">base</font>.Draw(gameTime);</p>
<p>&nbsp;</p>
<p>Lo que hacemos es dibujar cada una de las imágenes de cada una de las listas y finalmente dibujamos a Megaman en su posición actual. Es importante que se escriba el código en este orden porque se Irán dibujando y apilado las imágenes en el orden en que se va leyendo el código por lo tanto si dibujamos una lista antes de la otra se quedarán atrás y no se verán. </p>
<p>&nbsp;</p>
<p>Finalmente mandamos llamar al método <i>Draw()</i> de nuestra clase base y listo, ya tenemos nuestros tres fondos a velocidades diferentes que aunque no tiene aún un sistema de colisión se verá así</p>
<p>&nbsp;</p>
<p><a href='<span class="youtube">
<object width="425" height="355">
<param name="movie" value="http://www.youtube.com/v/slFzh-5EFCk&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0?rel=1'" />
<param name="allowFullScreen" value="true" />
<embed wmode="transparent" src="http://www.youtube.com/v/slFzh-5EFCk&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0?rel=1'" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="355"></embed>
<param name="wmode" value="transparent" />
</object>
</span><p><a href="http://www.youtube.com/watch?v=slFzh-5EFCk">www.youtube.com/watch?v=slFzh-5EFCk</a></p> </a></p>
<p>&nbsp;</p>
<p>Las ligas a los archivos de este proyecto están aqui</p>
<p>&nbsp;</p>
<div align="left">
<table border="1" cellpadding="0" cellspacing="0" width="100%" height="49" bgcolor="#FF3300" bordercolor="#FFFF00">
<tr>
<td align="center"><font color="#FFFF00"><a href="http://kalabaza.com.mx/Archivos/8BackgroundScroll2/Engine.cs">Clase Engine.cs</a></font></td>
<td align="center"><font color="#FFFF00"><a href="http://kalabaza.com.mx/Archivos/8BackgroundScroll2/AnimSprite.cs">Clase AnimSprite</a></font></td>
<td align="center"><font color="#FFFF00"><a href="http://kalabaza.com.mx/Archivos/8BackgroundScroll2/Sprites3.zip">Imagenes</a></font></td>
<td align="center"><font color="#FFFF00"><a href="http://kalabaza.com.mx/Archivos/8BackgroundScroll2/Background_Scroll2.zip">Proyecto completo</a></font></td>
</tr>
</table>
</div>
<p>&nbsp;</p>
<p>Espero que no haya sido muy confuso este largo post y que haya sido útil para ustedes. No olvides tus comentario antes de salir. </p>
<p>Gracias y nos vemos en el siguiente post.</p>
<p>&nbsp;</p>
<p>Piroshi.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><?php class_exists('AlexaRank') ? AlexaRank::bar(): ''; ?></p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=431</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>7 Fondos con scroll (Parte1)</title>
		<link>http://kalabaza.com.mx/?p=370</link>
		<comments>http://kalabaza.com.mx/?p=370#comments</comments>
		<pubDate>Mon, 07 Dec 2009 11:20:40 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[7 Fondos con scroll (parte 1)]]></category>
		<category><![CDATA[Background]]></category>
		<category><![CDATA[scroll]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=370</guid>
		<description><![CDATA[&#160; &#160; Bienvenidos a este nuevo post en el que como dice el título vamos a programar el scroll del fondo para nuestro juego en 2D que hemos estando programando Si quieres conocer un poco sobre algunos tipos de fondos que se pueden programar en un juego 2D, puedes consultar el post &#8220;Background Images&#8221; antes [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/05/images-1.jpg" alt="XNA" title="XNA" width="116" height="99" class="aligncenter size-full wp-image-25" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Bienvenidos a este nuevo post en el que como dice el título vamos a programar el scroll del fondo para nuestro juego en 2D que hemos estando programando Si quieres conocer un poco sobre algunos tipos de fondos que se pueden programar en un juego 2D, puedes consultar el post <a href="http://kalabaza.com.mx/?cat=23">&#8220;Background Images&#8221;</a> antes de continuar.<br style="color: black;"><br />
<br style="color: black;"><span style="color: black;">Los puntos que vamos a ver en este post son los siguientes :</span><br style="color: black;"><br />
</p>
<ul>
<li><strong>Cargar imágenes de fondo</strong></li>
<li><strong>Crear un Arreglo de objetos para los fondos</strong></li>
<li><strong>Programación del movimiento del scroll</strong></li>
<li><strong>Aplicación de este método</strong></li>
</ul>
<p><span style="color: black;">Primero voy a explicar lo que vamos a hacer.</span><br style="color: black;"><br />
<span style="color: black;">Hasta el momento lo que tenemos es a nuestro personaje que se puede desplazar de derecha a izquierda en un escenario de fondo fijo. Si el personaje se desplaza fuera de los límites de la pantalla, simplemente sale de nuestro campo de visión y hay que avanzar en la dirección opuesta para volverlo a ver. Lo que queremos es básicamente un escenario más grande y que nuestra cámara imaginaria siga el movimiento de nuestro personaje. Para lograr esto vamos a programar un fondo con avance por movimiento del personaje. Podríamos cargar una imagen grande y desplazarla conforme el personaje va avanzando como se ve en la siguiente imagen.</span><br style="color: black;"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/FondoLargo11.jpg" alt="FondoLargo1" title="FondoLargo1" width="622" height="128" class="aligncenter size-full wp-image-376" /><br />
<br style="color: black;"></p>
<p><span style="color: black;">El problema con esta solución es que tendríamos que cargar una imagen muy grande y si hay partes del nivel en las que el personaje se desplaza hacia arriba o abajo tendríamos partes de la imagen que irían vacías y se desperdiciaría el espacio. Es cierto que si estamos programando un juego en 2D en XNA nos debería importar un cacahuate desperdiciar memoria y más aún que estamos empezando con un programa tan sencillo podríamos cargar imágenes muy grandes sin preocuparnos por el desempeño, sin embargo creo que siempre es bueno tener en mente la optimización de recursos, principalmente porque las técnicas que aprendamos aquí las podemos llevar a otros entornos de desarrollo como dispositivos móviles en los que el uso de memoria y procesador sigue siendo algo muy importante, por lo que se recurre algunas veces al desarrollo de juegos basados en tiles para ahorrar recursos. Además si ocupamos tiles para el fondo podemos ahorrarnos también tiempo de diseño; bueno en caso de que empieces a desarrollar tus propios fondos.</span><br style="color: black;"><br />
<span style="color: black;">Por estas razones es que utilizaré un método en que utilizo tres fondos que se irán mostrando uno tras otro conforme el personaje va avanzando de la siguiente manera:</span><br style="color: black;"><br />
<br style="color: black;"></p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/FondoLargo21.jpg" alt="FondoLargo2" title="FondoLargo2" width="642" height="264" class="aligncenter size-full wp-image-378" /></p>
<p>&nbsp;</p>
<p>Cuando el personaje avance a la derecha y llegue a la coordenada X = 540 empezaremos a desplazar&nbsp; el fondo a la izquierda y para nuestro ejemplo también si el personaje avanza a la izquierda y alcanza la coordenada X=100 se desplazará a la derecha. Por otro lado, la forma en la que se irán mostrando los fondos será cíclico, es decir en el siguiente orden: uno, dos, tres, uno, dos, tres, uno…. etc. Si el avance es hacia la izquierda será de igual forma : tres ,dos , uno, tres, dos, uno … etc.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Cargar imágenes de fondo</strong></p>
<p>&nbsp;</p>
<p>Lo primero que vamos a hacer es cargar las imágenes de fondo a nuestro proyecto de la misma forma en que lo hicimos en el post <a href="http://kalabaza.com.mx/?cat=15">&#8220;Carga y animación de sprites&#8221;</a>; Es importante que cargues las tres porque <em>Fondo1.png</em>, aunque tiene el mismo nombre fue modificada.<br />
 Las tres imágenes de fondo las puedes bajar de <a href="http://kalabaza.com.mx/Archivos/Fondos.zip">aquí</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Crear un Arreglo de objetos para los fondos</strong></p>
<p>&nbsp;</p>
<p>Lo siguiente que vamos a hacer es utilizar nuestra clase <span style="font-style: italic;">AnimSprite</span> para los fondos de imagen. La razón de este cambio es porque ahora necesitamos modificar la posición de los mismo y con la estructura actual tendríamos que declara un vector por cada fondo, cosa que rompería con nuestra estructura orientada a objetos que queremos mantener pues estaríamos utilizando un objeto y sus propiedades como entidades diferentes. Talvez la solución más adecuada sería crear una nueva clase <span style="font-style: italic;">Fondos</span> o una clase <span style="font-style: italic;">Sprites</span> de la que la heredera sus funciones <span style="font-style: italic;">AnimSprites</span> pero creo que si hacemos este cambio será más adelante cuando empecemos a agregar otro tipo de elementos al juego.</p>
<p>&nbsp;</p>
<p>Para crear los objetos vamos a abrir nuestra clase <span style="font-style: italic;">Engine.cs</span> y primero vamos a sustituir la línea</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: rgb(51, 51, 255);">private</span><span style="color: rgb(51, 204, 255);">Texture2D</span>Fondo1;</p>
<p>&nbsp;</p>
<p>por esta otra:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 204, 255);">AnimSprite</span>[] Fondos = <span style="color: rgb(51, 51, 255);">new</span><span style="color: rgb(51, 204, 255);">AnimSprite</span>[3];</p>
<p>&nbsp;</p>
<p>para declarar nuestro arreglo que utilizaremos para los tres fondos. Por otro lado tenemos que modificar el código que utlilizamos para cargar las imagenes para hacerlo de una forma parecida a la que cargamos los sprites de Megaman. El código lo vamos a agregar dentro de nuestro método <em>LoadContent() </em> para sustituir al código que utilizábamos anteriormente y quedará  así:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: rgb(51, 51, 255);">for</span> (<span style="color: rgb(51, 51, 255);">int</span> i = 1; i &lt;= 3; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">int</span> Px = (i &#8211; 1) * 730; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[i - 1] = <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">AnimSprite</span>(Px, 0,0, <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(51, 204, 255);">Vector2</span>(0,0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[i - 1].CargaImagen(Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(&#8220;<span style="color: rgb(102, 0, 0);">Sprites/Fondo</span>&#8221; + i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;</p>
<p>Lo que estamos haciendo aquí, es iterar tres veces para cargar los tres fondos y como hicimos con los sprites de Megaman, aprovechamos el número al final del nombre de la imagen para no tener que escribir el código tres veces.<br />La variable temporal <span style="font-style: italic;">Px</span> la ocupamos para determinar la posición X inicial de los fondos, aunque esta posición solo nos interesa para las primeras dos imágenes, como veremos más adelante. La forma en que determinamos la posición es utilizar la variable <em>i</em> del ciclo <em>for</em> para multiplicarlo por 730, que es el ancho de cada imagen de fondo; Es importante que las tres imágenes tengan las mismas dimensiones y si cargan otras imágenes es importante modificar este valor por el ancho de las imágenes a cargar, por otro lado, si deciden cargar imágenes de diferentes dimensiones este valor deberá ser variable.<br />
Una vez que determinamos la posición X por cada fondo, instanciamos cada objeto con el constructor que creamos la vez anterior. Ya con el objeto creado utilizamos el método <span style="font-style: italic;">CargaImagen()</span> para copiar cada imagen en los objetos.<br /> Finalmente en este paso vamos a modificar en el método <span style="font-style: italic;">Draw()</span> de nuestra clase <span style="font-style: italic;">Engine.cs</span> para dibujar el fondo utilizando el método <span style="font-style: italic;">Draw()</span> de nuestros objetos pero para hacer esto tengo que explicar varias cosas antes. <br />
Primero, como ya explique, vamos a ocupar tres imágenes de fondo que se irán desplazando en la pantalla en sentido contrario al desplazamiento de nuestro personaje. Las dimensiones de cada imagen son 730&#215;480 y conforme la primer imagen se va desplazando, se va mostrando la siguiente y una vez que esta a alcanzado el extremo opuesto de la pantalla, ocupará toda la pantalla hasta que se desplace lo suficiente para dar espacio a la siguiente. Lo que quiero decir es que en el proceso siempre se mostrarán una o dos imágenes en pantalla pero nunca tres. (Para que esto último ocurriera se necesitaría que el ancho de las imágenes de fondo fuera menor al ancho de la pantalla o para nuestro caso 480 pixeles ya que de esta forma habría un punto en el que se mostrarán tres imágenes en pantalla). </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/TresFondos.jpg" alt="TresFondos" title="TresFondos" width="350" height="182" class="aligncenter size-full wp-image-382" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Por consiguiente vamos a estar manejando el movimiento de dos imágenes a la vez y por lo tanto primero vamos a declarar dos variables que utilizaremos para definir los dos fondos que se mostrarán. Estas dos variables se declararan dentro de nuestra clase <span style="font-style: italic;">Engine.cs</span> y tendrán el valor inicial 0 y 1 que serán los dos primeros fondo que empezaremos a manejar.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">int</span> FIndex1 = 0, FIndex2 = 1;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="background-color: rgb(255, 255, 153); width: 100%;" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td>Nota: Existe una forma de programar el scroll de la pantalla en el que se cargan todos los fondos a la vez y va modificando la coordenada X de cada uno de ellos. Esta forma es más fácil de programar pero implica haber cargado todos los fondos en memoria, que es algo que como comente al principio quiero evitar.</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Ya que tenemos las dos variables declaradas, ya podemos escribir las siguientes líneas dentro del código <span style="font-style: italic;">Draw()</span>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[FIndex1].Draw(spriteBatch);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[FIndex2].Draw(spriteBatch);</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Programación del movimiento del scroll</strong></p>
<p>&nbsp;</p>
<p>Lo siguiente que vamos a hacer es modificar el método <span style="font-style: italic;">Update() </span>que es donde se llevará a cabo el cambio de posición de nuestros dos fondos. &nbsp;Empezaremos por limitar el movimiento de nuestro personaje; Anteriormente incrementábamos 10 pixeles la posición del personaje si avanzaba a la derecha o disminuimos 10 si avanzaba a la izquierda. Lo que haremos ahora es permitir este mismo movimiento solo si se encuentra dentro del área permitida que es entre 100 y 540 que es 100 pixeles más del borde izquierda y 100 pixeles menos del borde derecho. </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/limites_Pant.jpg" alt="limites_Pant" title="limites_Pant" width="410" height="330" class="aligncenter size-full wp-image-394" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Para hacer esto vamos a escribir un <span style="font-style: italic;">if</span> a nuestro incremento de la posición al avanzar a la derecha de la siguiente manera</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">if </span>(Megaman.XPos &lt; 540)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Megaman.XPos += 10;</p>
<p>&nbsp;</p>
<p>de igual forma limitamos el avance a la izquierda de la siguiente manera:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">if </span>(Megaman.XPos &gt; 100)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Megaman.XPos -= 10;</p>
<p>&nbsp;</p>
<p>Con esto limitamos el avance del personaje pero no la animación. Lo que vamos a hacer ahora es incluir el código que desplaza los fondos para crear la ilusión de&nbsp;que el personaje sigue avanzando. Para lograr esto incluimos código debajo del <em>if</em> que agregamos para el avance a la derecha.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">&nbsp; else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[FIndex1].XPos -= 10;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[FIndex2].XPos -= 10;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);"> &nbsp; if</span> (Fondos[FIndex2].XPos == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FIndex1 = FIndex2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fondos[FIndex1].XPos = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">if</span>(FIndex2 &lt; 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIndex2 += 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FIndex2 = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fondos[FIndex2].XPos = 730;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;</p>
<p>Lo que hacemos primero es reducir 10 pixeles a la posición en X de los dos fondos que estamos dibujando a la vez; Originalmente son los fondos 0 y 1. <br /> Ya que reducimos los valores, verificamos que el segundo fondo (<span style="font-style: italic;">FIndex2</span>) no haya alcanzado el borde izquierdo de la pantalla. De ser así necesitamos tener preparado el siguiente fondo del lado derecho y además vamos a cambiar los índices de los fondos de tal forma que el índice FIndex1 siempre esté apuntando al fondo de la izquierda y el índice FIndex2 siempre apunte al índice más a la derecha, como se muestra en la siguiente imagen:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/CambioIndex.jpg" alt="CambioIndex" title="CambioIndex" width="540" height="115" class="aligncenter size-full wp-image-387" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Lo que hacemos para lograr esto es pasar el valor de <span style="font-style: italic;">FIndex2</span> a <span style="font-style: italic;">FIndex1</span> , este movimiento lo podemos ver como si estuviéramos utilizando apuntadores y queremos que <span style="font-style: italic;">FIndex1</span> apunte ahora a la imagen a la que apuntaba <span style="font-style: italic;">FIndex2</span>. Ya que&nbsp; hicimos este cambio ahora vamos a mover el fondo a la posición 0 y con esto tendríamos a los dos Fondos con la misma imagen y en la misma posición. Los siguiente es cambiar primero la imagen que se desplazará del lado izquierdo. Para determinar esto lo que vamos a hacer es incrementar en 1 el valor de <span style="font-style: italic;">FIndex2</span> si el valor previo es menor a 2 (que es el indice de nuestro último fondo ) o le pasamos el valor de 0 si ya estábamos mostrando el último fondo. Por último vamos a desplazar este fondo a la posición X=730 que es el ancho de todas nuestras imágenes.<br />
 De igual forma para el desplazamiento a la izquierda  escribimos este código.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">if</span> (Fondos[FIndex1].XPos == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIndex2 = FIndex1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[FIndex2].XPos = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">&nbsp; if</span> (FIndex1 &gt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIndex1 -= 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">&nbsp; else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIndex1 = 2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[FIndex1].XPos = -730;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[FIndex1].XPos += 10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondos[FIndex2].XPos += 10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;</p>
<p>Para el desplazamiento a la izquierda lo que tenemos que hacer es incrementar la posición de los fondos en lugar de reducirlo. Sin embargo como podemos observar, este incremento de la posición de las variables no esta al principio del bloque sino al final, esto es debido a que si al iniciar el programa decidimos movernos a la izquierda primero incrementaría la posición en X del fondo y después verificaría si es igual a cero pero ya no sería 0 sino 10. Por otro lado, cuando el primer fondo alcanza la posición 0 lo vamos a desplazar a la izquierda a la posición -730 y el fondo al que apunta <span style="font-style: italic;">FIndex2</span> estará en pantalla. El código completo de este ejemplo lo puedes descargar <a href="http://kalabaza.com.mx/Archivos/Background_Scroll.zip">aquí</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Aplicación de este método</strong></p>
<p>&nbsp;</p>
<p>La razón principal para utilizar este método para el scroll es, como comenté antes, la facilidad para reutilizar los fragmentos de fondo y crear un fondo más grande de varias combinaciones. Para lograr esto lo que podemos hacer es utilizar un arreglo de índices en el que podamos almacenar que indice va a continuación del otro y seguir utilizando nuestras variables <span style="font-style: italic;">FIndex1</span> y <span style="font-style: italic;">FIndex2</span> para aumentar al fondo que se va a mostrando como se muestra en el siguiente esquema:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/FondosArreglo.jpg" alt="FondosArreglo" title="FondosArreglo" width="461" height="311" class="aligncenter size-full wp-image-389" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Como podemos ver utilizamos los mismos tres fondos y las mismas dos variables pero como paso intermedio tenemos el arreglo que va almacenar los indices de los fondos. Este arreglo puede ser tan grande como queramos y al contrario de nuestro ejemplo puede tener un límite en el que impidamos el avance del personaje. La programación de esta aplicación la dejo de tarea a quién quiera aplicarla para seguir en el siguiente post con la segunda parte de scrolls para fondos.</p>
<p>Como siempre espero sus comentarios y sugerencias y espero que haya sido de su agrado este post. Nos vemos en el siguiente.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Piroshi.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=370</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>V Background images</title>
		<link>http://kalabaza.com.mx/?p=348</link>
		<comments>http://kalabaza.com.mx/?p=348#comments</comments>
		<pubDate>Thu, 03 Dec 2009 16:58:31 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[V Background Images]]></category>
		<category><![CDATA[Background]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=348</guid>
		<description><![CDATA[&#160; &#160; En esta ocasión voy a explicar un poco sobre backgrounds en los juegos 2D principalmente para conocer algunas de las posibilidades que se tienen al desarrollar un juego de este tipo. &#160; Como sabemos el &#8220;Background image&#8221;es la imagen o las imágenes de fondo que se ocupan en juegos 2D y algunos 3D, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/09/Fantasma-150x150.gif" alt="Fantasma" title="Fantasma" width="150" height="150" class="aligncenter size-thumbnail wp-image-117" /><br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p>En esta ocasión voy a explicar un poco sobre backgrounds en los juegos 2D principalmente para conocer algunas de las posibilidades que se tienen al desarrollar un juego de este tipo.<br />
<P>&nbsp;</p>
<p>Como sabemos el &#8220;Background image&#8221;es la imagen o las imágenes de fondo que se ocupan en juegos 2D y algunos 3D, según el tipo de juego, la consola que se utilice y la creatividad del equipo de desarrollo pueden existir varios tipos de Backgrouds. A continuación haré una clasificación en base a las características más importantes.<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><span style="font-weight: bold;">Fondos Fijos</span><br />
<P>&nbsp;</p>
<p>Podemos decir que los juegos más sencillos ocupan imágenes fijas como fondos de pantalla. En un principio, se ocupaban mucho los tiles para ahorrar recursos, ya que en lugar de guardar una imagen de (640&#215;480) se podía llenar toda la pantalla&nbsp; con unos 10&nbsp; o menos tiles de (32 x24) repetidos varias veces.<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/super_bomberman.gif" alt="super_bomberman" title="super_bomberman" width="256" height="223" class="aligncenter size-full wp-image-349" /></p>
<div style="text-align: center;">Bonberman</div>
<p><P>&nbsp;</p>
<p><P>&nbsp;</p>
<p>En la actualidad existen todavía juegos que por la naturaleza de los mismo utilizan imágenes fijas, por no requerir más que una pantalla para su función.<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/Foto+Super+Puzzle+Fighter+II+Turbo+HD+Remix+Xbox+Live+Arcade-300x168.jpg" alt="Super Puzzle Fighter II Turbo HD Remix" title="Super Puzzle Fighter II Turbo HD Remix" width="300" height="168" class="aligncenter size-medium wp-image-365" /></p>
<div style="text-align: center;">Super Puzzle Fighter II Turbo HD Remix</div>
<p><P>&nbsp;</p>
<p><br style="font-weight: bold;"><span style="font-weight: bold;">Fondo Fijos de avance por pantalla</span><br />
<P>&nbsp;</p>
<p>Una variante a los fondos fijos se observa en juegos como el primer &#8220;The Legend of Zelda&#8221; en el que en toda la pantalla se arma una parte de un mapa y no cambia ni se mueve hasta alcanzar alguno de los cuatro bordes de la pantalla; en ese momento se genera una animación en el que se desplaza el fondo y se carga una nueva parte del mapa. Este avance por pantallas ahorra recursos porque una vez cargado un escenario los cálculos se concentran solamente en los enemigos y el personaje.<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/20090823-legend_of_zelda_nes-1-300x261.png" alt="legend_of_zelda_nes-1" title="legend_of_zelda_nes-1" width="300" height="261" class="aligncenter size-medium wp-image-350" /></p>
<div style="text-align: center;">The legend of Zelda</div>
<p><P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><span style="font-weight: bold;">Avance del fondo por movimiento del personaje.</span><br />
<P>&nbsp;</p>
<p>La evolución de los fondos fijos de avance por pantalla se vio al contar con más memoria y fue posible cargar imágenes más grandes. Con esta facilidad fue que en lugar de cargar un fragmente de un mapa del tamaño de la pantalla se podían cargar fracciones más grandes que se desplazaban al llegar a un punto cercano de unos de los bordes (uno, dos, o los cuatro bordes, según el tipo de juego) y una vez que se alcanza el final de esta sección se pasa a otro parte del escenario utilizando un efecto de fade, un desplazamiento de la pantalla o algún tipo de animación que mostrara el cambio de escenario. Ejemplos de este tipo de juegos tenemos de sobra.<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/megaman6nes.jpg" alt="megaman6nes" title="megaman6nes" width="256" height="224" class="aligncenter size-full wp-image-351" /></p>
<div style="text-align: center;">Megaman 6</div>
<p><P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><span style="font-weight: bold;">Profundidad en el fondo.</span><br />
<P>&nbsp;</p>
<p>El siguiente paso en la evolución fue agregar varías capas de fondo así como elementos sobre el plano principal para generar un afecto de profundidad en los niveles. Este tipo de técnica se ocupa actualmente en la mayoría de juegos 2D que no recurren a elementos tridimensionales.<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/a-boy-and-his-blob-2-wii-screenshot-big.jpg" alt="a boy and his blob" title="a boy and his blob" width="468" height="349" class="aligncenter size-full wp-image-352" /></p>
<div style="text-align: center;">A boy and his blob</div>
<p><P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><span style="font-weight: bold;">Fondo 2D con personajes 3D</span><br />
<P>&nbsp;</p>
<p>Una técnica que se empezó a ocupar al iniciar el salto a los juegos en 3D fue utilizar imágenes 2D prerendereadas con personajes y algunos elementos en 3D esto por no contar con la tecnología suficiente para crear los escenarios completos en tiempo real. Como ejemplo de estos juegos tenemos los primeros Resident evil y o final fantasy VII y VIII que aunque incluían partes completamente en 3D también recurrían al uso de imágenes prerensereadas.<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/resi1psx_003-large-300x225.jpg" alt="resident evil 1" title="resident evil 1" width="300" height="225" class="aligncenter size-medium wp-image-359" /></p>
<div style="text-align: center;">Resident evil </div>
<p><P>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/PSX_FF7-300x200.jpg" alt="PSX_FF7" title="PSX_FF7" width="300" height="200" class="aligncenter size-medium wp-image-360" /></p>
<div style="text-align: center;">Final Fantasy 7</div>
<p><P>&nbsp;</p>
<p><P>&nbsp;</p>
<p>Actualmente podemos encontrar todavía juegos que utilizan una mezcla entre 2D y 3D. El genero que más recurre a esta practica es el de los puzzles que muchas veces se desarrollan en una misma pantalla y aunque pueden contener elementos en 3D el fondo puede ser una imagen estática.<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/12/butterfly_escape.jpg" alt="butterfly_escape" title="butterfly_escape" width="500" height="375" class="aligncenter size-full wp-image-353" /></p>
<div style="text-align: center;">Butterfly escape</div>
<p><P>&nbsp;</p>
<p><P>&nbsp;</p>
<p>Existen aún más técnicas para generar&nbsp; los Backgronds de los juegos en 2D como por ejemplo los juegos de carreras o los juegos de naves. Todos finalmente ocupan imágenes que son dibujadas en pantalla utilizando varias técnicas para lograr diferentes efectos. En este post solo comenté los que me parecen los más destacados para mostrar tanto la evolución como las posibilidades con las que contamos al desarrollar juegos en 2D Ahora ya puedes consultar el post <a href="http://kalabaza.com.mx/?cat=25">Fondos con scroll</a> en el que explico una téctica para agregar scroll a nuestros juegos en 3D. Espero que les haya gustado este post, nos vemos próximamente<br />
<P>&nbsp;</p>
<p><P>&nbsp;</p>
<p>Piroshi<br />
<P>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=348</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IV Edición básica de sprites</title>
		<link>http://kalabaza.com.mx/?p=327</link>
		<comments>http://kalabaza.com.mx/?p=327#comments</comments>
		<pubDate>Sat, 14 Nov 2009 14:04:03 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[IV Edición básica de sprites]]></category>
		<category><![CDATA[Edición sprites]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=327</guid>
		<description><![CDATA[En vista de que he hecho varias modificaciones a las imágenes con las que hemos estado trabajando y dado que hay varias cosas importantes que hay que considerar al momento de crear los sprites, he decidido agregar este post en donde explico el proceso que seguí para crear los sprites de Megaman. Cabe señalar el [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/09/Fantasma.gif" alt="Fantasma" title="Fantasma" width="153" height="159" class="aligncenter size-full wp-image-117" /></p>
<p>En vista de que he hecho varias modificaciones a las imágenes con las que hemos estado trabajando y dado que hay varias cosas importantes que hay que considerar al momento de crear los sprites, he decidido agregar este post en donde explico el proceso que seguí para crear los sprites de Megaman. Cabe señalar el post no pretende ser una guía paso a paso ya que el proceso es muy repetitivo, más bien esta hecho así a manera de explicar el razonamiento que hay que hacer para obtener los sprites como queremos. Una vez que leas este post ya podrás modificar tus sprites como quieras y ya sabrás las cosas que hay que tomar en cuenta.</p>
<p>&nbsp;</p>
<p>Primero que nada empecemos abriendo la imagen original que agregué en el post <a href="http://kalabaza.com.mx/?cat=15">&#8220;Carga y animación de un sprite&#8221; </a>y que como comenté la descargué de <a href="http://www.spriters-resource.com/">Sprites-resources.com</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp-content/uploads/2009/10/megap.PNG"><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/megap-150x150.PNG" alt="megaman sprites" title="megaman sprites" width="150" height="150" class="aligncenter size-thumbnail wp-image-210" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br style="font-weight: bold;"><br />
<span style="font-weight: bold;">Nota:</span> para la edición de imágenes generalmete utilizo&nbsp; <a href="http://www.gimp.org">Gimp</a>  que, para los que no lo conocen, es un editor de imágenes open source muy bueno que les recomiendo utilizar. Sin embargo para este ejemplo yo voy a utilizar Photoshop CS3 porque me parece que es más claro lo que quiero mostrar aquí.</p>
<p>&nbsp;</p>
<p>Lo que voy a hacer ya que esta la imagen abierta es seleccionar uno de las sprites que utilizamos en la secuencia de avance. Este sprite lo voy a pegar en una imagen nueva y para fines del ejemplo le voy a poner un fondo blanco.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Sprite_Edit1.jpg" alt="Sprite_Edit1" title="Sprite_Edit1" width="204" height="186" class="aligncenter size-full wp-image-326" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>En un principio yo trataba que hacer la imagen lo mas pequeña posible reduciendo el area del fondo, sin embargo, si abrimos el tercer sprite de la animación (el que ocupa más espacio) y comparamos estos dos, podremos ver que hay una diferencia grande de dimensiones.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Sprite_Edit2.jpg" alt="Sprite_Edit2" title="Sprite_Edit2" width="319" height="170" class="aligncenter size-full wp-image-328" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>El problema no es que sea más grande sino que como recordarán, al insertar una imagen en pantalla se utilizan el origen de la misma (la esquina superior izquierda) para posicionarlo. Si para todas las imágenes utilizamos el criterio del menor área y generamos la animación así, obtendremos lo siguiente:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/MegaMan1.gif" alt="MegaMan1" title="MegaMan1" width="180" height="152" class="aligncenter size-full wp-image-333" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Como pueden observar, la animación queda muy rara y tomando como referencia la cabeza de Megaman podemos ver como avanza y regresa.  ¿Que podemos hacer entonces? lo que se necesita es tomar de referencia, como ya dije, la cabeza de Megaman ya que aunque en la animación este girando no debe desplazarse si todo el cuerpo no se desplaza. Para hacer esto necesitamos ubicar la cabeza de a la misma distancia en todas las imágenes y es aqui donde vamos a usar una opción de Photoshop, que aunque esto no es un tutorial de como usar photoshop les paso las rutas de las opciones que seleccioné.</p>
<p>&nbsp;</p>
<p>Primero voy a tomar de referencia las mismas dos imágenes que puse más arriba y lo que voy a hacer es mostrar el grid en ellas para ver cada pixel de la imagen. Para esto en el menú seleccionamos View/Show y seleccionamos Grid como se muestra en la imagen:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Menu1.jpg" alt="Menu1" title="Menu1" width="440" height="545" class="aligncenter size-full wp-image-335" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Al hacer esto nos va a mostrar una cuadrícula sobre la imagen y lo que vamos a hacer ahora es modificar esta cuadricula para que sea tan lo más pequeña posible y para hacer esto entramos al menú PhotoShop/Preferences/Guides,Grid,Slices &#038; Cont… como se muestra en la figura. </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Menu2.jpg" alt="Menu2" title="Menu2" width="463" height="270" class="aligncenter size-full wp-image-336" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Nota: </strong> Como pueden ver estoy usando la versión de Mac en inglés pero espero que no tengan muchos problemas si ocupan una versión diferente.</p>
<p>&nbsp;</p>
<p>Ya que se haya desplegado la ventana de opciones, vamos a cambiar la parte de Grid para que quede como la figura:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Menu3.jpg" alt="Menu3" title="Menu3" width="571" height="93" class="aligncenter size-full wp-image-337" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Con esto ya podemos ver cada píxel de la imagen, aún en la parte blanca y lo que vamos a hacer ahora modificar cada imagen de tal forma que la cabeza de Megaman empiece en el mismo píxel para todas como en la siguiente imagen.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Sprite_Edit3.jpg" alt="Sprite_Edit3" title="Sprite_Edit3" width="767" height="363" class="aligncenter size-full wp-image-338" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Si hacemos esto ya no debería haber ningún problema; La animación debe haberse corregido y debe verse como en la siguiente imagen.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/MegaMan2.gif" alt="MegaMan2" title="MegaMan2" width="180" height="152" class="aligncenter size-full wp-image-341" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Sin embargo todavía hay un problema ya que nosotros estamos ocupando los mismos sprites para la animación de desplazamiento a la derecha como a la izquierda y al invertirlos tendremos el mismo problema que al principio, por lo tanto tendremos que aplicar el mismo procedimiento que antes y contar el número de pixeles que hay del lado derecho para que sea el mismo para todas las imágenes, como se muestra en la imagen.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Sprite_Edit4.jpg" alt="Sprite_Edit4" title="Sprite_Edit4" width="819" height="364" class="aligncenter size-full wp-image-343" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Con esto solo restaría borrar el fondo blanco que ocupé para ver el Grid y listo ya tendríamos los sprites para la animación.</p>
<p>&nbsp;</p>
<p>Como siempre, gracias por leer este post, espero que haya sido de su agrado y utilidad. Nos vemos en el siguiente post.</p>
<p>&nbsp;</p>
<p>Piroshi</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=327</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I.1 Listas</title>
		<link>http://kalabaza.com.mx/?p=281</link>
		<comments>http://kalabaza.com.mx/?p=281#comments</comments>
		<pubDate>Wed, 04 Nov 2009 05:49:20 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[I.1 Listas]]></category>
		<category><![CDATA[Listas]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=281</guid>
		<description><![CDATA[Listas &#160; &#160; Las listas son clases (contenidas en System.Collections.Generic) diseñadas especialmente para agrupar objetos y con esto realizar tareas que de otra forma implicarían muco código. La sintaxis general de una lista es la siguiente: &#160; &#160; &#160; &#160; &#160; &#160; List&#60;type&#62; name = new List&#60;type&#62;(); &#160; donde: &#160; &#160; &#160;type: es el tipo [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight: bold;">Listas</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Las listas son clases (contenidas en System.Collections.Generic) diseñadas especialmente para agrupar objetos y con esto realizar tareas que de otra forma implicarían muco código. La sintaxis general de una lista es la siguiente:</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List&lt;type&gt; name = new List&lt;type&gt;(); </p>
<p>&nbsp;</p>
<p>donde:</p>
<p>&nbsp;</p>
<p><span style="font-style: italic;">&nbsp; &nbsp;type</span>: es el tipo de objetos que vamos a agrupar<br />
<span style="font-style: italic;">&nbsp; &nbsp;name</span>: es el nombre que le vamos a dar a nuestra lista</p>
<p>&nbsp;</p>
<p>por ejemplo para crear una lista de <span style="font-style: italic;">strings</span> podemos escribirla de la siguiente forma:
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List&lt;string&gt; ListaSaludos = new List&lt;string&gt;();</p>
<p>&nbsp;</p>
<p>una de las ventajas de las listas que no necesitasmos definir el tamaño de la misma y puede aumentar o reducir el número de los elementos que lo componen. Los métodos principales de las listas son los siguientes:</p>
<p>&nbsp;</p>
<p><span style="font-weight: bold;">Add()</span> : Este método nos sirve para agregar elementos nuevos a nuestra lista. Estos<br />
elementos se van agregando al final de la misma y automáticamente aumenta la dimensión de la lista agregando un nuevo indice. A continuación les muestro uno ejemplos.</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;ListaSaludos.Add(&#8220;Hola&#8221;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ListaSaludos.Add(&#8220;Adios&#8221;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ListaSaludos.Add(&#8220;Buenos días&#8221;);</p>
<p>&nbsp;</p>
<p><span style="font-weight: bold;">Remove()</span> : Como su nombre lo indica, este método se utiliza para remover elementos de la lista. Para especificar el elemento a remover hay que escribri el valor del mismo, sin embargo, cabe señalar que las listas pueden tener elemmentos repetidos, así que si se aplica este método se removerá el<br />
primer elemeto que encuentre con ese valor.<br />
Para ver la sintaxis les muestro un par de ejemplos:
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListaSaludos.Remove(&#8220;Adios&#8221;);</p>
<p>&nbsp;</p>
<p><span style="font-weight: bold;">Insert():</span> Como comenté antes, el método <span style="font-style: italic;">Add()</span>agrega elementos al final de la lista pero si queremos agregar un elemento en un indice especifico usamos el método <span style="font-style: italic;">Insert()</span> de la siguiente manera:</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListaSaludos.Insert(1,&#8221;Ciao&#8221;);</p>
<p>&nbsp;</p>
<p><span style="font-weight: bold;">Sort()</span>: Este método nos sirve para ordenar los elementos dentro de la lista.
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListaSaludos.Sort();</p>
<p>&nbsp;</p>
<p><span style="font-weight: bold;">Clear():</span> Este método nos sirve para borrar todos los elementos de una lista y su<br />
sintaxis es la siguiente:</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListaSaludos.Clear();</p>
<p>&nbsp;</p>
<p><br style="font-weight: bold;"><span style="font-weight: bold;">Acceder a los elementos de una lísta</span></p>
<p>&nbsp;</p>
<p>Al igual que con los arreglos, para acceder a un elemento dentro de una lista utilizamos su indice correspondiente. cabe señalar que también al igual que con los arreglos, el primer elemento de una lista tiene el<br />
indice uno. Por ejemplo si quieresmo acceder al tercer elemento de nuestra lista tendríamos que escribir lo siguiente:</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String1 = ListaSaludos[2]; </p>
<p>&nbsp;</p>
<p>donde String1 sería un objeto del tipo String que recibirá el valor de nuestra lista que para nuestro ejemplo sería el string &#8220;Buenos días&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=281</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>6 Controlando al personaje</title>
		<link>http://kalabaza.com.mx/?p=253</link>
		<comments>http://kalabaza.com.mx/?p=253#comments</comments>
		<pubDate>Tue, 03 Nov 2009 17:30:01 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[6 Controlando al personaje]]></category>
		<category><![CDATA[Sprites]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=253</guid>
		<description><![CDATA[&#160; &#160; Bienvenidos a este nuevo Post. La vez anterior pudimos desplegar sprites en pantalla y hacer una animación con ellos. Lo que vamos a hacer ahora es utilizar las teclas de dirección del teclado para poder controlar a nuestro personaje. Antes de empezar puedes consultar el post &#8220;Edición básico de sprites&#8221; si quieres saber [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/05/images-1.jpg" alt="XNA" title="XNA" width="116" height="99" class="aligncenter size-full wp-image-25" /></p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p>Bienvenidos a este nuevo Post. La vez anterior pudimos desplegar sprites en pantalla y hacer una animación con ellos. Lo que vamos a hacer ahora es utilizar las teclas de dirección del teclado para poder controlar a nuestro personaje. Antes de empezar puedes consultar el post <a href="http://kalabaza.com.mx/?cat=22">&#8220;Edición básico de sprites&#8221;</a> si quieres saber el proceso que seguí para generar los sprites. </p>
<p> &nbsp;</p>
<p>Los puntos que vamos a ver en este post son los siguientes: </p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp; * Mejora del código anterior.<br />
&nbsp;&nbsp;&nbsp; * Carga de imagen adicional.<br />
&nbsp;&nbsp;&nbsp; * Modificación del método Draw()<br />
&nbsp;&nbsp;&nbsp; * Entrada de datos desde el teclado.<br />
&nbsp;&nbsp;&nbsp; * Creación de constructores<br />
&nbsp;&nbsp;&nbsp; * Carga de una imagen de Fondo.</strong></p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p><strong>Modificación del código anterior </strong></p>
<p> &nbsp;</p>
<p>Lo primero que vamos a hacer , como comenté al final del Post anterior es darle una arregladita al código para hacerlo más compacto. Lo primero será abrir nuestro proyecto del Post anterior y abrir el archivo <em>AnimSprite.cs</em>. Aquí lo que vamos a hacer es cambiar el nivel de acceso de nuestro arreglo <em>SpriteMove</em> a <em>private</em> para que solo la misma clase tenga acceso a él. Además, ya no va a ser un arreglo, si no una lista por dos razones, la primera es por que reduce bastante el código y se vuelve muy sencillo de entender y la segunda es para empezar a utilizar una forma de agrupar objetos diferente a los arreglos.&nbsp; Para conocer más sobre las listas agregué un post que puedes consultat llamado <a href="http://kalabaza.com.mx/?cat=19">&#8220;Listas&#8221;</a>   debajo de  “Consideraciones del C#” por si la sintaxis no es muy clara y quieres conocer mejor su uso. Con estos cambios la declaración quedaría así:</p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">private</span>List&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt; SpriteMov = <span style="color: rgb(51, 51, 255);">new</span>List&lt;<span style="color: rgb(51, 204, 255);"> Texture2D</span>&gt;();&nbsp;</p>
<p> &nbsp;</p>
<p>Ya que modificamos nuestro objeto lo siguiente es crear un nuevo método que se llamará&nbsp; <em>CargaImagen()</em> el cual tendrá el siguiente código: </p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">public</span> <span style="color: rgb(51, 51, 255);">void</span>CargaImagen(<span style="color: rgb(51, 204, 255);">Texture2D</span> Sprite)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpriteMov.Add(Sprite);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p> &nbsp;</p>
<p>Es un código muy simple que lo único que hace es recibir un sprite de tipo <em>Texture2D</em> y cargalo a nuestra lista que acabamos de crear; Como comenté antes, utilizando listas el código se vuelve muy simple pues lo único que hace falta es utilizar el Método <em>Add()</em> de la lista para agregar un nuevo elemento.  Por otro lado lo que vamos a hacer es abrir nuestra clase <em>Engine.cs</em> para modificar el código que ocupábamos para cargar las imágenes dentro de método <em>LoadContent()</em>, el cual va a quedar así: </p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">for</span> (<span style="color: rgb(51, 51, 255);">int</span> i = 1; i&lt;=6; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.CargaImagen(Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(”<span style="color: rgb(102, 0, 0);">Sprites/MM</span>”+ i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p> &nbsp;</p>
<p>Lo que hace este código es iterar seis veces (que es el número de imágenes que forman la animación) y aprovechando que las imágenes comparten el nombre común “MM” más un número. Podemos incrementar ese número en un ciclo y concatenarlo al final del nombre genérico para obtener el nombre de cada imagen a cargar. El resultado del <em>Load</em> lo pasamos a la función <em>CargaImagen()</em> que acabamos de hacer y listo ya tenemos un código mas eficiente para la carga de imágenes.</p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p><strong>Carga de Imagen adicional </strong></p>
<p> &nbsp;</p>
<p>Antes de seguir adelante voy a explicar lo que vamos a hacer. Actualmente tenemos a nuestro Megaman corriendo sin parar en un fondo blanco y lo que queremos, obviamente, es tener el control del personaje y sus movimientos, por lo pronto y para este post nos limitaremos a desplazar al personaje hacia la izquierda y hacia la derecha utilizando las flechas de dirección del teclado. Para lograr esto hay algunas consideraciones a tomar.</p>
<p> &nbsp;</p>
<p>Primero, los sprites que tenemos ahora son de una animación continua y es por eso que es necesario carga una imagen más para nuestro personaje de pie y sin avanzar.</p>
<p> &nbsp;</p>
<p>Segundo, actualmente tenemos seis sprites para el movimiento de Megaman hacia la derecha y agregaríamos un nuevo sprite con lo que ya tendríamos siete, pero si queremos que el personaje se desplace también hacia la zquieda harán falta otros siete sprites de Megaman corriendo hacia la izquierda más uno de pie mirando también hacia la izquierda. Si abrimos nuestras imagines en un editor de imágenes, las volteamos y guardamos con un numero consecutivo tendríamos todas nuestros sprites, sin embargo para hacerlo de una manera más elegante vamos a ocupar los mismos sprites que tenemos y por código vamos a invertirlos hacia la izquierda si la animación es en esa dirección.</p>
<p> &nbsp;</p>
<p>Para cargar la imagen seguiremos el proceso visto en el post anterior <a href="http://kalabaza.com.mx/?cat=15">“Carga y animación sprites”</a> y la imagen a cargar es la siguiente:.</p>
<p> &nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/MM7.PNG" alt="MM7" title="MM7" width="44" height="40" class="aligncenter size-full wp-image-262" /></p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p><strong>Modificación del método Draw() </strong></p>
<p> &nbsp;</p>
<p>Ya que tenemos siente sprites cargadas en nuestro programa necesitamos modificar el ciclo <em>for</em> que acabamos de escribir para agregar una imagen más </p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">for</span> (<span style="color: rgb(51, 51, 255);">int</span> i = 1; i&lt;=7; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.CargaImagen(Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(”<span style="color: rgb(102, 0, 0);">Sprites/MM</span>”+ i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p> &nbsp;</p>
<p>Por otro lado para lograr voltear la imagen necesitamos hacer varias modificaciones. Primero vamos a cambiar el método <em>Draw()</em> de nuestra clase <em>AnimSprite.cs</em> ya que anteriormente solo llamábamos al metodo <em>Draw()</em> del <em>spriteBatch</em>,&nbsp; con el vector de posición y un color de mascara pero para voltear la imagen tenemos que llamar a otra versión sobrecargada del mismo método <em>Draw()</em> que utiliza otros parámetros. Lo primero que necesitamos es declarar una nueva variable dentro de nuestra clase <em>AnimSprite.cs</em> de tipo entero que llamaremos <em>UltimaDir</em>.</p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int UltimaDir; </p>
<p> &nbsp;</p>
<p>Esta variable la vamos a utilizar de la siguiente manera: si se presionó la tecla de dirección derecha le asignaremos el valor de 0 y si fue presionada la tecla de dirección izquierda la asignaremos el valor de 1. (abajo viene la explicación de como cachar estos eventos). Utilizando esta variable nuestro método <em>Draw()</em> quedaría así: </p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">public</span> <span style="color: rgb(51, 51, 255);">void</span> Draw(<span style="color: rgb(51, 204, 255);">SpriteBatch</span> spriteBatch)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spriteBatch.Begin();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">if</span>(UltimaDir== 0)&nbsp; <span style="color: rgb(0, 153, 0);">//Derecha</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spriteBatch.Draw(SpriteMov[FrameActual], <span style="color: rgb(51, 51, 255);">new</span> Rectangle(XPos, YPos,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpriteMov[FrameActual].Width,SpriteMov[FrameActual].Height), <span style="color: rgb(51, 51, 255);">null</span>,<span style="color: rgb(51, 204, 255);">Color</span>.White,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Angulo,Origen,&nbsp;<span style="color: rgb(51, 204, 255);">SpriteEffects</span>.None,0f);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">else if</span>(UltimaDir== 1)&nbsp; <span style="color: rgb(0, 153, 0);">//Izquiera</span> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spriteBatch.Draw(SpriteMov[FrameActual], <span style="color: rgb(51, 51, 255);">new</span>Rectangle(XPos,&nbsp;YPos,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpriteMov[FrameActual].Width, SpriteMov[FrameActual].Height),&nbsp;<span style="color: rgb(51, 51, 255);">null</span>, <span style="color: rgb(51, 204, 255);">Color</span>.White,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Angulo, Origen, <span style="color: rgb(51, 204, 255);">SpriteEffects</span>.FlipHorizontally,0f);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spriteBatch.End();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p>Lo que hacemos es dividir el código en dos opciones, la primera es cuando la última tecla de dirección presionada fue la derecha&nbsp; (<em>UltimaDir</em> ==0) y la segunda es cuando la última tecla de dirección fue la izquierda (<em>UltimaDir</em> ==1). Para el primer caso vamos a mostrar los sprites en su forma normal, sin embargo para mostrar congruencia en los dos casos he llamado al mismo método sobrecargado de <em>Draw()</em> al que le vamos a pasar los siguiente parámetros: </p>
<p> &nbsp;</p>
<p><strong>Primero</strong>: <em>new Rectangle(XPos, YPos, SpriteMov[FrameActual].Width,<br />
SpriteMov[FrameActual].Height)</em>, En lugar de ocupar el vector de posición que ocupábamos en el post pasado esta sobrecarga utiliza un objeto <em>Rectangle</em> que lo que va hacer es colocar nuestro sprite dentro de un rectángulo definido por cuatro puntos que corresponden a la esquina superior izquierda, el largo y el ancho del mismo, de tal forma que si definimos un rectángulo de diferentes dimensiones que nuestro sprite este se acoplará a las dimensiones del mismo pero como para nuestro caso queremos mantener las dimensiones originales, vamos a hacer lo siguiente: En lugar de nuestro vector de posición vamos a declarar un par de variables enteras que nos servirán para definir la posición de nuestro personaje&nbsp; </p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">public int&nbsp;</span>XPos, YPos;&nbsp;&nbsp; <span style="color: rgb(51, 204, 255);"></span></p>
<p> &nbsp;</p>
<p>A continuación para definir las dimensiones del rectángulo vamos a utilizar las dimensiones del sprite para garantizar que mantendrá su forma al momento de dibujarlo en pantalla. Para eso es que se utilizan los parámetros <em>Width</em> y <em>Height</em> de nuestro sprite a dibujar </p>
<p> &nbsp;</p>
<p><strong>Segundo</strong>: <em>null</em>. El segundo parámetro es un objeto también del tipo <em>Rectangle</em> que se utiliza cuando se quiere dibujar solo una porción del sprite. Esta porción será la que contenga el rectángulo que definamos, pero para nuestro caso, enviamos un valor nulo para indicar que dibujaremos el sprite completo. </p>
<p> &nbsp;</p>
<p><strong>Tercero</strong>: <em>Color.White</em>&nbsp; El color de mascara que es el mismo que en la sobrecarga anterior y que seguirá siendo blanca osea sin mascara.</p>
<p> &nbsp;</p>
<p><strong>Cuarto</strong>: <em> Angulo</em>&nbsp; Este parámetro es el ángulo de rotación de nuestro sprite, en caso de que quisiéramos rotarlo ; Para este parámetro vamos a tener que declarar una nueva variable donde almacenaremos&nbsp; un ángulo de rotación para cuando haga falta.</p>
<p> &nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: rgb(51, 51, 255);">public float </span> Angulo; <span style="color: rgb(51, 204, 255);"></span></p>
<p> &nbsp;</p>
<p><strong>Quinto</strong>:&nbsp; <em> Origen</em> ,&nbsp; Al definir la rotación de un objeto es necesario definir el pivote u origen con respecto al cual se va a efectuar esta rotación, es por eso que vamos a declarar un vector que almacene ese origen de rotación y se lo vamos a pasar como parámetro. </p>
<p> &nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: rgb(51, 51, 255);">public</span> <span style="color: rgb(51, 204, 255);">Vector2 </span> Origen; <span style="color: rgb(51, 204, 255);"></span></p>
<p> &nbsp;</p>
<p>Sexto: <em>SpriteEffects.None</em> Y finalmenta la razón por la cual utilizamos esta sobrecarga: el efecto, que para el caso del avance hacia la derecha es <em>None</em> (porque permanecerá sin cambios) pero para cuando avanza a la izquierda será <em>FlipHorizontally</em>. Y que es esto? Pues este parámetro nos indica si el sprite será dibujado sin alteración (<em>SpriteEffects.None</em>) o volteado sobre el eje&nbsp; horizontal (<em>SpriteEffects.FlipHorizontally</em>).
<p> &nbsp;</p>
<p><strong>Septimo</strong> : <em>0f</em> . Este parámetro es un número flotante que indica la profundidad del sprite dentro de la pantalla, esto se utiliza cuando tenemos varios sprites en pantalla para definir cual va arriba de cual. Para nuestro caso mandamos 0 para poner el personaje más enfrente en caso de que hubiera otros sprites. </p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p><strong>Entrada de datos desde el teclado </strong></p>
<p> &nbsp;</p>
<p>Para cachar la entrada de datos desde el teclado vamos a escribir la siguiente línea dentro nuestro método <em>Update()</em> y dentro de nuestra <em>if</em> que controla el tiempo</p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 204, 255);">KeyboardState</span>kState= <span style="color: rgb(51, 204, 255);">Keyboard</span>.GetState();<span style="color: rgb(51, 204, 255);"></span></p>
<p> &nbsp;</p>
<p>Lo que estamos haciendo aquí&nbsp; es declarar un objeto que llamaremos&nbsp; <em>kState</em> de la clase <em>KeyboarState</em>.</p>
<p> &nbsp;</p>
<p>Esta clase ya nos hace toda la chamba para la verificación del estado de las teclas ya que al llamar al método <em>GetSatate()</em> podremos preguntar si una tecla fue presionada o no. Lo que necesitamos ahora es checar el estado de las teclas que nos interesan, que son las teclas de dirección izquierda y derecha pero que hacemos después? Por ejemplo, si presionamos la tecla de dirección derecha lo que queremos es que Megaman se desplace hacia la derecha pero también que la animación empiece a correr y nos muestre un frame tras otro y que al terminar los seis, vuelva con el primero como hicimos en el ejemplo anterior, además queremos que al dejar de presionar la tecla izquierda se detenga el desplazamiento, la animación y que se despliegue el sprite de Megaman parado y viendo hacia la derecha. Para hacer esto necesitamos saber si la tecla de dirección izquierda esta presionada en el momento de la verificación pero también necesitamos saber si fue presionada antes o mejor dicho si no ha dejado de ser presionada. Para verificar esto necesitamos almacenar en una variable el estado anterior de la tecla al momento de hacer una nueva verificación y para hacer eso vamos a utilizar la variable <em>UltimaDir</em> que declaramos antes. Utilizando esta variable podemos cambiar el código que utilizábamos para modificar la animación de Megman por el siguiente código dentro del método <em>Update()</em> de la clase <em>Engine.cs </em></p>
<p> &nbsp;</p>
<p><span style="color: rgb(51, 51, 255);"></span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: rgb(51, 51, 255);">if</span> (kState.IsKeyDown(<span style="color: rgb(51, 204, 255);">Keys</span>.Right) &amp;&amp; kState.IsKeyUp(<span style="color: rgb(51, 204, 255);">Keys</span>.Left))<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.XPos +=10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">if</span> (Megaman.UltimaDir == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Megaman.UpdateMov();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.UltimaDir = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: rgb(51, 51, 255);">else if</span> (kState.IsKeyDown(<span style="color: rgb(51, 204, 255);">Keys</span>.Left) &amp;&amp; kState.IsKeyUp(<span style="color: rgb(51, 204, 255);">Keys</span>.Right))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.XPos -= 10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">if</span> (Megaman.UltimaDir == 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Megaman.UpdateMov();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Megaman.UltimaDir = 1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: rgb(51, 51, 255);">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Megaman.FrameActual = 6;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</p>
<p> &nbsp;</p>
<p>Lo que hacemos aquí es utilizar nuestro objeto <em>kState</em> que acabamos de instanciar y vamos a utilizar el método <em>isKeyDown()</em> que recibe como parámetro la tecla a evaluar a través de un objeto <em>Keys</em>. Lo que preguntamos en el primer <em>if</em> es si la tecla de dirección derecha fue presionada (<em>IsKeyDown</em>) pero la tecla de dirección Izquierdo no fue presionada (<em>IsKeyUp</em>) Si se cumple esta condición entonces desplazaremos a nuestro personaje diez pixeles a la derecha. Además si no se a soltado la tecla de dirección derecha (<em>UltimaDir == 0</em>) pasaremos al siguiente frame de nuestra animación.</p>
<p> &nbsp;</p>
<p>Por último guardamos en nuestra variable <em>UtimaDir</em> que la tecla de dirección derecha fue presionada.</p>
<p> &nbsp;</p>
<p>Para la siguiente condición se utiliza la misma lógica pero aplicada a la condición de que se haya presionado la tecla de dirección Izquierda y no la Derecha.</p>
<p> &nbsp;</p>
<p>Finalmente si no se presionó&nbsp; ninguna de las dos teclas, seteamos nuestro frame actual a 6 que es donde se encuentra nuestro personaje parado y según la última dirección&nbsp; se dibujará viendo a la derecha o a la izquierda. </p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p><strong>Creación de constructores&nbsp; </strong></p>
<p> &nbsp;</p>
<p>Ya que agregamos nuevos parámetros a nuestra clase <em>AnimSprites.cs</em> lo que quiero hacer es crear un nuevo constructor de la clase, primer porque quiero dejar algunos fijos en un constructor por default y segundo para tener la posibilidad de definir parámetros al crear un nuevo objeto. El primer constructor quedaría de la siguiente manera: </p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: rgb(51, 51, 255);">public</span>AnimSprite()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XPos= 200;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YPos= 200;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Angulo=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Origen= <span style="color: rgb(51, 51, 255);">new  </span><span style="color: rgb(51, 204, 255);">Vector2</span>(0,0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</p>
<p> &nbsp;</p>
<p>Este constructor será&nbsp; nuestro constructor por default y será llamada cuando no definamos ningún parámetro. Lo que hace es copiar en<br />
nuestros parámetros del objeto los valores que quiero que tenga al crear cualquier objeto.&nbsp; </p>
<p> &nbsp;</p>
<p>Ahora vamos a crear el segundo constructor que tendrá el siguiente<br />
código: </p>
<p> &nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: rgb(51, 51, 255);">public</span>AnimSprite(<span style="color: rgb(51, 51, 255);">int</span> PosX, <span style="color: rgb(51, 51, 255);">int</span> PosY,float Angle, <span style="color: rgb(51, 204, 255);">Vector2</span> Origim)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XPos = PosX;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YPos = PosY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Angulo = Angle;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Origen = Origim;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;</p>
<p> &nbsp;</p>
<p>A diferencia del anterior, este constructor recibe cuatro parámetros,<br />
los cuales definen el estado iniciar del objeto a crear. Este<br />
constructor no lo ocuparemos para este ejemplo pero puedes empezar a<br />
hacer pruebas con él. </p>
<p> &nbsp;</p>
<p> &nbsp;</p>
<p><strong>Carga de una imagen de Fondo.</strong></p>
<p> &nbsp;</p>
<p>Si ejecutas el programa ya podrás controlar a Megaman en ambas direcciones, sin ningún límite, es decir, puedes salirte de la pantalla en ambos lados. Lo que vamos a hacer ahora es cargar una imagen de fondo para olvidarnos del aburrido fondo blanco. Para eso he modificado una imagen que descargue del sitio <a href="http://www.spriters-resource.com/">Sprite-Resource</a> para que ocupe toda la pantalla. La imagen en cuestión es la siguiente:</p>
<p> &nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Fondo1.png" alt="Fondo1 de megaman" title="Fondo1 de megaman" width="711" height="478" class="aligncenter size-full wp-image-274" /></p>
<p> &nbsp;</p>
<p>Para cargar esta imagen vamos a hacer lo siguiente: Primero hay que cargar la imagen con el método que ya conocemos. Enseguida declaramos un objeto <em>Texture2D</em> dentro de nuestra clase <em>Engine.cs</em> para guardar ahí la imagen. </p>
<p> &nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: rgb(51, 51, 255);">private</span> <span style="color: rgb(51, 204, 255);">Texture2D</span> Fondo1;&nbsp;</p>
<p> &nbsp;</p>
<p>A continuación agregamos el código para copiar la imagen en el objeto; esto lo haremos dentro del método <em>LoadContent()</em>. </p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fondo1 = Content.Load&lt;<span style="color: rgb(51, 204, 255);">Texture2D</span>&gt;(”<span style="color: rgb(102, 0, 0);">Sprites/Fondo1</span>&#8220;);<span style="color: rgb(51, 204, 255);"></span></p>
<p> &nbsp;</p>
<p>Y por último vamos a agregar el código para dibujar el fondo en pantalla; Este código irá dentro del método <em>Draw()</em> y deberá copiarse antes del código que dibuja a nuestro personaje. </p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spriteBatch.Begin();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spriteBatch.Draw(Fondo1,<span style="color: rgb(51, 51, 255);"> new </span> <span style="color: rgb(51, 204, 255);">Vector2</span>(0,0),<span style="color: rgb(51, 204, 255);">Color</span>.White);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spriteBatch.End(); <span style="color: rgb(51, 204, 255);"></span></p>
<p> &nbsp;</p>
<p>Lo que hacemos aquí es colocar la imagen de fondo en la coordenada (0,0) para que ocupe toda la pantalla.<br />
Por último y para que haya congruencia del escenario con el personaje voy a modificar las coordenadas de inicio dentro del constructor por default&nbsp; de nuestro personaje para que queden así: </p>
<p> &nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XPos = 100;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YPos = 395; </p>
<p> &nbsp;</p>
<p>Y listo, ya puedes controlar a Megaman con un escenario de fondo. Claro que ahorita no hay control de colisiones así que&nbsp; puede atravesar paredes pero eso lo resolveremos en otro Post. </p>
<p> &nbsp;</p>
<p>Si todo salió bien deberías de ver una imagen como la siguiente en pantalla completa:</p>
<p> &nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/11/Megaman2.jpg" alt="Megaman con Fonfo1" title="Megaman con Fondo1" width="640" height="480" class="aligncenter size-full wp-image-276" /></p>
<p> &nbsp;</p>
<p>Puedes bajar todo el proyecto y las imagenes de aqui (<a href="http://kalabaza.com.mx/Archivos/ControlandoPersonaje.zip">Proyecto Completo</a>) o puedes bajar solo las imagenes para armar tú mismo el proyecto desde esta liga (<a href="http://kalabaza.com.mx/Archivos/Sprites2.zip">Sprites2 de Megaman</a>)</p>
<p> &nbsp;</p>
<p>Espero que haya sido de su agrado este ejemplo y que haya quedado claro, como siempre si hay alguna duda no&nbsp; olvides postearla, tampoco olvides tus comentarios antes de salir. Gracias y nos vemos en el siguiente post.
<p> &nbsp;</p>
<p>Piroshi.</p>
<p> &nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=253</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>III Sitema coordenado 2D</title>
		<link>http://kalabaza.com.mx/?p=236</link>
		<comments>http://kalabaza.com.mx/?p=236#comments</comments>
		<pubDate>Sat, 24 Oct 2009 07:27:24 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[III Sistema coordenado 2D]]></category>
		<category><![CDATA[Coordenadas 2D]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=236</guid>
		<description><![CDATA[&#160; &#160; Sistema coordenado 2D &#160; Es un conjunto de valores que se utilizan como referencia para localizar puntos en el espacio 2D. &#160; &#160; &#160; &#160; Esto ya lo sabemos y todos algunas vez hemos visto uno en la escuela, así que no ahondaré mas en el tema, sin embargo lo que nos interesa [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/09/Fantasma.gif" alt="Fantasma" title="Fantasma" width="153" height="159" class="aligncenter size-full wp-image-117" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><br />
Sistema coordenado 2D</strong></p>
<p>&nbsp;</p>
<p>Es un conjunto  de valores que se utilizan como referencia para localizar  puntos en el espacio 2D.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/SIstCoor.jpg" alt="SIstCoor" title="SIstCoor" width="499" height="446" class="aligncenter size-full wp-image-237" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Esto ya lo sabemos y todos algunas vez hemos visto uno en la escuela, así que no ahondaré mas en el tema, sin embargo lo que nos interesa es lo siguiente:</p>
<p>&nbsp;</p>
<p>En XNA cuando manejamos gráficos en 2D utilizamos también un sistema coordenado con ejes (X , Y) sin embargo el origen del mismo se encuentra en la esquina superior  izquierda de la pantalla con el eje X a lo largo de la pantalla (positivo a la derecha) y el eje Y a lo alto de la pantalla (positivo hacia abajo) como se muestra en la imagen.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/CoorPantalla.jpg" alt="CoorPantalla" title="CoorPantalla" width="319" height="267" class="aligncenter size-full wp-image-238" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Por ejemplo, si queremos ubicar el punto (10,20) tendremos que avanzar 10 pixeles a la derecha y 20 pixeles hacia abajo.  Las dimensiones de la pantalla dependerán de la resolución que se defina en el código.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Sprites y coordenadas</strong></p>
<p>&nbsp;</p>
<p>Las dimensiones de los sprites se  miden utilizando el mismo sistema coordenado de la pantalla, tal que el ancho corresponde al eje de las X y el alto corresponde a las Y. Lo importante a destacar es que el origen de cualquier sprite esta en la esquina superior izquierda.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/sprite.png" alt="sprite" title="sprite" width="200" height="150" class="aligncenter size-full wp-image-248" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Esto es importante saberlo, primero por supuesto, para poder ubicar nuestros  sprites pero también al momento de querer aplicar una rotación ya que será con respecto al origen y si queremos hacerlo rotar con respecto al centro del sprite tendremos que cambiar el origen al centro del mismo. De igual forma al escalar la imagen se expandirá a la derecha si se escala sobre el eje X y hace abajo si se escala en Y.</p>
<p>&nbsp;</p>
<p>Ahora ya puedes consulta el post <a href="http://kalabaza.com.mx/?p=209">&#8220;Carga y animación de un sprite&#8221;</a> , espero que quede más claro el concepto y sea más facil hacer la carga de los archivos.</p>
<p>&nbsp;</p>
<p>Nos vemos en el siguiente post</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Piroshi</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=236</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>5 Carga y animación de sprites</title>
		<link>http://kalabaza.com.mx/?p=209</link>
		<comments>http://kalabaza.com.mx/?p=209#comments</comments>
		<pubDate>Sat, 17 Oct 2009 18:00:09 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[5 Carga y animación de sprites]]></category>
		<category><![CDATA[Sprites]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=209</guid>
		<description><![CDATA[&#160; En esta ocasión vamos a ver como cargar imágenes en un proyecto de XNA además de crear una animación muy sencilla con las mismas. Puedes consultar la teoría previa en el post &#8220;Sistema coordenado 2D&#8221; donde encontrarás un par de conceptos útiles para entender mejor este post. &#160; Lo primero que necesitamos es conseguir [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/05/images-1.jpg" alt="XNA" title="XNA" width="116" height="99" class="aligncenter size-full wp-image-25" /></p>
<p>&nbsp;</p>
<p>En esta ocasión vamos a ver como cargar imágenes en un proyecto de XNA además de crear una animación muy sencilla con las mismas. Puedes consultar la teoría previa en el post <a href="http://kalabaza.com.mx/?p=236">&#8220;Sistema coordenado 2D&#8221;</a> donde encontrarás un par de conceptos útiles para entender mejor este post.</p>
<p>&nbsp;</p>
<p>Lo primero que necesitamos es conseguir las imágenes que vamos a cargar, para lo cual si eres muy hábil para el dibujo puedes dibujar cada uno de los sprites tanto de los personajes, enemigos, fondos y demás para hacer tu juego completamente original. En realidad eso es lo que hay que hacer cuando ya se desarrolla un proyecto serio pero para nuestro caso y a modo de estudio vamos a ocupar sprites de juegos que ya existen y que fueron copy pasteados para nosotros. Existen varios sitios en Internet y varios juegos de donde podemos sacar las imágenes que nos hagan falta y ya depende de cada quien lo que quiera hacer. Para el ejemplo yo voy a ocupar sprites de Megaman por varias razones, primero, obvio, me gusta el juego y el personaje y segundo porque hay muchos sitios en Internet donde podemos descargar recursos de este juego.  La imagen que utilicé para los sprites es la siguiente:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href="http://kalabaza.com.mx/wp-content/uploads/2009/10/megap.PNG"><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/megap-150x150.PNG" alt="megaman sprites" title="megaman sprites" width="150" height="150" class="aligncenter size-thumbnail wp-image-210" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>La descargue del sitio <a href="http://www.spriters-resource.com/">sprites-resource</a>  que les recomiendo porque tiene una amplia variedad de sprites que podremos ocupar en nuestros proyectos.</p>
<p>&nbsp;</p>
<p>Puedes hacer clic sobre ella para bajarla en tamaño completo; sin embargo existe un problema ya que no es solo bajar la imagen y cargarla en el proyecto. Para nuestro caso vamos a ocupar los sprites de megaman corriendo, así que habría que copiar cada uno de ellos y guardarlo en un archivo independiente en formato png, pero no te preocupes ya lo he<br />
hecho para el ejemplo y puedes bajar todas las imágenes <a href="http://kalabaza.com.mx/Archivos/Sprites.zip">aquí</a>.</p>
<p>&nbsp;</p>
<p>Ya que tenemos las imágenes vamos a empezar con la programación. Lo primero será crear un proyecto nuevo (si no recuerdas como, puedes checar nuevamente la sección <a href="http://kalabaza.com.mx/?cat=7">“Creacion un proyecto” </a>. Para el ejemplo yo lo llamaré <span style="font-style: italic;">Ejemplo2D</span><br />
pero puedes ocupar el nombre que quieras. También utilicé el nombre de <em>Engine</em> para la clase principal como hice el ejemplo de la sección <a href="http://kalabaza.com.mx/?cat=13">“Análisis del código Inicial”</a>.</p>
<p><br style="font-weight: bold;"><br />
<span style="font-weight: bold;">Carga de Imágenes</span></p>
<p>&nbsp;</p>
<p>Lo siguiente será cargar en nuestro proyecto las seis imágenes que vamos a<br />
ocupar, para este necesitamos hacer clic derecho sobre la carpeta <em>contets</em> de nuestro explorador de soluciones y seleccionamos <span  style="font-style: italic;">Agregar/Nueva carpeta</span>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/Imagen1.jpg" alt="Imagen1" title="Imagen1" width="341" height="356" class="aligncenter size-full wp-image-211" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Una vez que se ha creado damos clic derecho sobre la mism y seleccionanos <em>Cambiar nombre</em> ; el nombre que yo escribí pare el ejemplo es <em>Sprites</em>.</p>
<p>&nbsp;</p>
<p>Ya que tenemos nuestra carpeta <em>Sprite</em> hacemos clic derecho sobre la misma y seleccionamos <em>Agregar/Elemento</em> existente.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/Imagen2.jpg" alt="Imagen2" title="Imagen2" width="330" height="362" class="aligncenter size-full wp-image-212" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>En la ventana que aparece seleccionamos las imágenes y presionamos el botón <em>Agregar</em>.<br />
<br style="font-weight: bold;"><br />
<span style="font-weight: bold;">Creación de una clase para nuestro personaje.</span></p>
<p>&nbsp;</p>
<p>Podríamos hacer nuestra carga y animación de nuestro personaje en el mismo archivo Engine.cs pero para no romper con la estructura de la POO (Programación orientada a objetos) vamos a crear una clase que tendrá los métodos y atributos de nuestro personaje.</p>
<p>&nbsp;</p>
<p>Para crear una clase nueva vamos a hacer lo siguiente: En nuestro explorador de soluciones hacemos clic derecho sobre el nombre de nuestro proyecto (En mi caso <em>Ejemplo2D</em>) y seleccionamos <em>Agregar/Nuevo</em><br />
elemento. </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/Imagen3.jpg" alt="Imagen3" title="Imagen3" width="420" height="451" class="aligncenter size-full wp-image-213" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>De la ventana que aparece seleccionamos una clase y escribimos el nombre <em>AnimSprite.cs</em>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/Imagen4.jpg" alt="Imagen4" title="Imagen4" width="686" height="421" class="aligncenter size-full wp-image-214" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Yo escogí este nombre más genérico pensando en reutilizar esta clase en un futuro para otro fines pero<br />
puedes llamarla <em>personaje.cs</em> o como quieras.</p>
<p>&nbsp;</p>
<p><big style="font-weight: bold;">Código de la clase AnimSprite</big></p>
<p>&nbsp;</p>
<p>Una vez que ya tenemos las imágenes en la carpeta lo siguiente es escribir el código para subir estas imágenes a un arreglo y así poderlas manipular posteriormente.</p>
<p>&nbsp;</p>
<p>Lo primero que necesitamos es declarar un arreglo en donde se van a almacenar todos los sprites, asi que vamos a abrir la clase<br />
<em>AnimSprites.cs</em> que acabamos de crear y dentro de la declaración de la clase escribimos la siguiente línea de código:</p>
<p>&nbsp;</p>
<p><span style="color: rgb(51, 51, 255);">&nbsp;<br />
&nbsp; &nbsp; public</span> <span style="color: rgb(102, 204, 204);">Texture2D</span>[] SpriteMov = <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(102, 204, 204);">Texture2D</span>[6];</p>
<p>&nbsp;</p>
<p>Como pueden ver la clase que necesitamos para cargar las imagenes es <em>Texture2D</em>, si quieres ver la referencia de Microsoft de esta clase puedes consultarla <a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.texture2d.aspx">aquí</a><br />
.&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p>Vamos a utilzar un arreglo que en este caso tendrá una dimensión fija pero podemos hacer variable en modificaciones futuras. Como vamos a utilizar 6 sprites la dimensión de nuestro arreglo será también de 6.</p>
<p>&nbsp;</p>
<p>Lo siguiente es definir un Vector que nos servirá para establecer la posición de nuestro personaje en pantalla, estoy utilizando el valor casi aleatorio de 200 en la coordenada X y 200 en Y pero puede ser cualquier valor dentro de nuestra resolución que ocupemos para el juego&nbsp; que en nuestro caso es de 640&#215;480. Para ello escribimos la siguiente línea de código.
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: rgb(51, 51, 255);">public</span> <span style="color: rgb(102, 204,204);">Vector2</span> posicion = <span style="color: rgb(51, 51, 255);">new</span>Vector2(200, 200);</p>
<p>&nbsp;</p>
<p>Dado que vamos a hacer una animación por cuadros en necesario tener un contado que nos diga que frame se esta deplegando en este momento, para eso vamos a declarar una variable del tipo <em>int</em> que nos almecene esa información. La inicializamos a cero que es el indice de nuestro primer frame.</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp;<span style="color: rgb(51, 51, 255);">public int</span>&nbsp; FrameActual = 0;</p>
<p>&nbsp;</p>
<p>Ya que tenemos nuestros parametros los siguiente será los métodos. Primero necesitamos un método que nos dibuje en pantalla nuetro personaje; a este método lo llamaremos <em>Draw()</em> y el cuerpo del mismo es el<br />
siguiente:</p>
<p>&nbsp;</p>
<p><span style="color: rgb(51, 51, 255);">&nbsp;<br />
&nbsp; &nbsp;public</span>&nbsp;<span style="color: rgb(51, 51, 255);">void</span> Draw(<span style="color: rgb(102, 204, 204);">SpriteBatch</span> spriteBatch)<br />
&nbsp; &nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp; &nbsp; spriteBatch.Begin();<br />
&nbsp; &nbsp; &nbsp;&nbsp; spriteBatch.Draw(SpriteMov[FrameActual], posicion, Color.White);<br />
&nbsp; &nbsp; &nbsp;&nbsp; spriteBatch.End();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>El objetivo del método es simple, dibujar en pantalla el sprite que corresponde a nuestro frame actual y colocarlo en la posición actual, que para nuestro ejemplo será fija. Para lograr esto necesitamos el objeto <em>spriteBatch</em> que viene declarado por defecto al crear un proyecto nuevo y que como comenté en el post anterior, es el encargado de desplegar sprites en pantalla. Este objeto <em>spriteBatch</em> lo vamos a pasar como parámetro por el método <em>Draw()</em> de nuestra clase y lo que vamos a definir un bloque de <em>Begin() End()</em> en el que llamaremos al método <em>Draw() </em>del objeto <em>spriteBatch</em>. El bloque que comienza con el llamado al método <em>Begin()</em> lo que hace es básicamente prepar al dispositivo gráfico para desplegar sprites, este método tiene varias sobrecargas en las que podemos definir enrtre otras cosas la forma de renderes los sprites pero para nuestro caso no ocuparémos ningúna configuración adicional.</p>
<p>&nbsp;</p>
<p>El método <em>End()</em> lo que hace es liberar el espacio ocupado por los sprites que se cargaron en <em>spriteBatch</em> y regresa al dispositivo gráfico al estado anterior que tenía antes de ser llamado por el método <em>Begin()</em>.<br />
El método <em>Draw()</em> recibe como parametros un objeto del tipo <em>Texture2D</em>, una objeto <em>Vector2</em> para definir la posición y un objeto <em>Color</em> que se utiliza como máscara sobre el sprite que se esta dibujando.</p>
<p>&nbsp;</p>
<p>Por último necesitamos declarar un método que controle el frame que se va a mostrar. Este método tendrá la siguiente estructura:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">public</span>&nbsp;<span style="color: rgb(51, 51, 255);">void</span>UpdateMov()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">if </span>(FrameActual &lt; 5)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FrameActual = FrameActual + 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FrameActual = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>Lo que hace este método es básicamente incrementar la variable <em>FrameActual</em>&nbsp; hasta que llega a su tope que en nuetro caso es 5. Una vez que llega a este valor se reinicia el contador a cero, lo<br />
que nos regresa al primer frame de nuestra animación.</p>
<p>&nbsp;</p>
<p><strong>Programación de Engine.cs</strong></p>
<p>&nbsp;</p>
<p>Lo primero que vamos a hacer es declarar e instanciar un objeto de la clase que acabamos de crear, a este objeto lo llamaré <em>Megaman</em></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(102, 204, 204);">AnimSprite</span> Megaman = <span style="color: rgb(51, 51, 255);">new</span> <span style="color: rgb(102, 204, 204);">AnimSprite</span>();</p>
<p>&nbsp;</p>
<p>Enseguida declaramos una variable con la que llevarémos el control del tiempo que pasa en la ejecución del programa.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">int</span>&nbsp; TiempoFlow; </p>
<p>&nbsp;</p>
<p>Ahora, dentro del constructor de la clase (osea dentro <em>Engine()</em>) difinimos primeramente la resolucion de la pantalla, que como comenté antes será de 640&#215;480. Para ello utilizaremos nuestro manejador gráfico y las variables&nbsp; <em>PreferredBackBufferWidth</em> y <em>PreferredBackBufferHeight</em>.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; graphics.PreferredBackBufferWidth = 640; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; graphics.PreferredBackBufferHeight = 480; </p>
<p>&nbsp;</p>
<p>Opcionalmente pudes hacer que el juego se despliegue en pantalla completa en lugar de una ventada de 640&#215;480. Para hacer esto tenemos que incluir la siguiente línea de código.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; graphics.IsFullScreen = <span style="color: rgb(51, 51, 255);">true</span>;</p>
<p>&nbsp;</p>
<p>A continuación vamos a cargar cada una de las imagenes dentro de nuestro método <em>LoadContent()</em> escribiendo el siguiente código</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Megaman.SpriteMov[0] = Content.Load&lt;<span style="color: rgb(102, 204, 204);">Texture2D</span>&gt;(<span style="color: rgb(153, 0, 0);">&#8220;Sprites/MM1&#8243;</span>);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.SpriteMov[1] = Content.Load&lt;<span style="color: rgb(102, 204, 204);">Texture2D</span>&gt;(<span style="color: rgb(153, 0, 0);">&#8220;Sprites/MM2&#8243;</span>);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.SpriteMov[2] = Content.Load&lt;<span style="color: rgb(102, 204, 204);">Texture2D</span>&gt;(<span style="color: rgb(153, 0, 0);">&#8220;Sprites/MM3&#8243;</span>);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.SpriteMov[3] = Content.Load&lt;<span style="color: rgb(102, 204, 204);">Texture2D</span>&gt;(<span style="color: rgb(153, 0, 0);">&#8220;Sprites/MM4&#8243;</span>);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.SpriteMov[4] = Content.Load&lt;<span style="color: rgb(102, 204, 204);">Texture2D</span>&gt;(<span style="color: rgb(153, 0, 0);">&#8220;Sprites/MM5&#8243;</span>);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.SpriteMov[5] = Content.Load&lt;<span style="color: rgb(102, 204, 204);">Texture2D</span>&gt;(<span style="color: rgb(153, 0, 0);">&#8220;Sprites/MM6&#8243;</span>);</p>
<p>&nbsp;</p>
<p>Aprevechando que nuestro arreglo <em>SpriteMov</em> fue declarado public (por ahora) lo utilizaremos directamente para cargar cada imagen y esto lo haremos con el método <em>Load</em> del objeto <em>Content</em>. Lo que hace es cargar en cada elemento de nuestro arreglo las imagenes que tenemos en nuestra carpeta <em>Content</em>. El parámetro <em>Texturu2D</em> es para definir el tipo de dato que estamos cargando. La función soporta cualquiera de los siguientes tipos <em>Model, Effect, SpriteFont, Texture, Texture2D, Texture3D</em> y <em>TextureCube</em> aunque no creo que los ocupemos todos en este tutorial o por lo menos no por un buen rato.</p>
<p>&nbsp;</p>
<p>Dentro de la función <em>Update()</em> básicamente vamos a hacer dos cosas una es llamar a la funcion <em>UpdateMov()</em> de nuestro objeto <em>megaman</em> y la otra es modificar la condición de salida del juego. </p>
<p>Para hacer lo primero bastaría con escribir <em>Megaman.UpdateMov();</em> sin embargo la animación sería muy rápida y no la podríamos apreciar, por esta razón fue que declaramos la variable <em>TiempoFlow</em> y la vamos a ocupar de la siguiente forma.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TiempoFlow = TiempoFlow + gameTime.ElapsedGameTime.Milliseconds;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(51, 51, 255);">if</span> (TiempoFlow &gt; 50)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TiempoFlow = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.UpdateMov();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;</p>
<p><em>ElapsedGameTime</em> es una propiedad de la clase <em>gameTime</em> que nos regresa el tiempo que ha pasado desde la última vez que se invocó al método <em>Update();</em> seleccionamos <em>Miliseconds</em> para que el valor devuelto sea en milisegundos (obvio). </p>
<p>&nbsp;</p>
<p>Cada que entramos al método <em>Update()</em> la variable <em>TiempoFlow</em> se incrementa; este incremento será los n milisegundos que transcurrieron desde la última vez (alrededor de 16 milisegundos) y al alcanzar un valor mayor a 50 actualizará nuestra animación y nos mostrará el siguiente frame. Por otro lado regresaramos nuestro contador a cero para empezar de nuevo.</p>
<p>Lo siguiente que vamos a hacer es modificar la condición de salida del juego ya que originalmete se cumple presonar el botón <em>Back</em> de nuestro control pero nosotros estamos probando el juego en el teclado asi modificamos el código para que quede de la siguiente forma :</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(51, 51, 255);">if</span> (<span style="color: rgb(102, 204, 204);">Keyboard</span>.GetState(<span style="color: rgb(102, 204, 204);">PlayerIndex</span>.One).IsKeyDown(<span style="color: rgb(102, 204, 204);">Keys</span>.Escape))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Exit();</p>
<p>&nbsp;</p>
<p>De esta forma cada que entre al método <em>Update()</em> verificará si se ha presionado la tecla <em>Esc</em> y si es así terminará el programa. Para el siguiente post hablaré mas sobre la función <em>GetState()</em> y sus usos.</p>
<p>&nbsp;</p>
<p>Por último vamos a modficar el método<em> Draw()</em>. Para esto lo único que vamos a hacer es llamar al método Draw() de nuestro objeto megaman y pasarle como parámetro el <em>spriteBatch</em> como ya expliqué antes, pero antes de llamarlo tenemos que limpiar la pantalla y dejar un color blanco de fondo porque nuestros sprites tiene fondo blanco.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GraphicsDevice.Clear(<span style="color: rgb(102, 204, 204);">Color</span>.White);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Megaman.Draw(spriteBatch);</p>
<p>&nbsp;</p>
<p>Listo, si todo salió bien y ejecutas el programa deberías ver algo así, claro que en movimiento:</p>
<p>&nbsp;</p>
<p><img src="http://kalabaza.com.mx/wp-content/uploads/2009/10/Imagen5.jpg" alt="Imagen5" title="Imagen5" width="640" height="480" class="aligncenter size-full wp-image-215" /></p>
<p>&nbsp;</p>
<p>Si lo deseas puedes bajar el código fuente completo de <a href="http://kalabaza.com.mx/Archivo/Solucion2D.zip">aqui</a>.</p>
<p>&nbsp;</p>
<p>Así de simple es cargar sprites a un programa en XNA. Cabe señalar que parte del código es repetitivo y rompe con algunas reglas de la POO pero me pareció que de esta forma es más fácil de entender. En el siguiente post mejoraré el código ya que espero que haya quedado claro en este post. Si hay alguna duda no dejes de postearla en la parte de abajo y no olvides tampoco<br />
tus comentarios. Nos vemos en el siguiente post.</p>
<p>&nbsp;</p>
<p>Piroshi</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=209</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Proximamente</title>
		<link>http://kalabaza.com.mx/?p=170</link>
		<comments>http://kalabaza.com.mx/?p=170#comments</comments>
		<pubDate>Thu, 08 Oct 2009 12:38:57 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[Temas Gamer/Geek]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=170</guid>
		<description><![CDATA[&#8212;&#8211;]]></description>
			<content:encoded><![CDATA[<p>&#8212;&#8211;</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=170</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>4 Análisis del código Inicial</title>
		<link>http://kalabaza.com.mx/?p=148</link>
		<comments>http://kalabaza.com.mx/?p=148#comments</comments>
		<pubDate>Fri, 18 Sep 2009 08:33:07 +0000</pubDate>
		<dc:creator>Piroshi</dc:creator>
				<category><![CDATA[4 Análisis del código Inicial]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://kalabaza.com.mx/?p=148</guid>
		<description><![CDATA[&#160; Antes de empezar a leer este post puedes consultar el post Estructura básica de un VJ para entender mejor los bloques de código que constituyen un video juego y la diferencia con un programa clásico. &#160; En el post anterior creamos un nuevo proyecto y pudimos probar que al ejecutarlo nos generaba una ventana [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-25 aligncenter" title="XNA" src="http://kalabaza.com.mx/wp-content/uploads/2009/05/images-1.jpg" alt="XNA" width="116" height="99" /></p>
<p>&nbsp;</p>
<p>Antes de empezar a leer este post puedes consultar el post <a href="http://kalabaza.com.mx/?cat=11"> Estructura básica de un VJ </a> para entender mejor los bloques de código que constituyen un video juego y la diferencia con un programa clásico. </p>
<p>&nbsp;</p>
<p>En el post anterior creamos un nuevo proyecto y pudimos probar que al ejecutarlo nos generaba una ventana en modo gráfico que para nosotros fue el hola mundo gráfico, a continuación vamos a analizar los archivos que nos ha generado pero antes que nada me gustaría hacer unas modificaciones en el código.</p>
<p>&nbsp;</p>
<p>Como pudimos ver anteriormente al generarse el proyecto se crearon varias carpetas y archivos, primero que nada demos doble clic en el archivo Game1.cs para abrir el código en la ventana principal.  El nombre Game1 es el nombre por defecto asignado a nuestra clase principal y al archivo que la contiene. Si queremos cambiar el nombre de esta clase no basta con solo cambiar el nombre en la clase ya que existen varias partes en el proyecto en las que se hace referencia a este nombre. Para poder cambiar todas las referencias sin tener que buscarlas una por una tenemos que seleccionar el nombre de la clase y presionar F2 para que aparezca una ventana, ahí podemos cambiar el nombre en todas las referencias del código, sin embargo, el nombre de archivo lo tenemos que cambiar directamente del lado derecho.<br />
Para el ejemplo yo cambiaré el nombre a <em>Engine</em>.<br />
A continuación vamos a analizar las clases <em>Program.cs</em> y <em>Engine.cs</em></p>
<p>&nbsp;</p>
<p><strong>Program.cs</strong></p>
<p>&nbsp;</p>
<p>La clase <em>Program</em> será con la que se inicie la ejecución del programa, básicamente la vamos a utilizar para invocar a nuestra clase principal que contendrá todo el código de nuestro juego.<br />
El código base que se generó al crear el proyecto es el siguiente.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1  using System;<br />
2<br />
3   namespace WindowsGame1<br />
4   {<br />
5      static class Program<br />
6       {<br />
7        /// &lt;summary&gt;<br />
8        /// The main entry point for the application.<br />
9        /// &lt;/summary&gt;<br />
10<br />
11          static void Main(string[] args)<br />
12         {<br />
13            using (Engine game = new Engine())<br />
14             {<br />
15                game.Run();<br />
16              }<br />
17         }<br />
18     }<br />
19  }</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>En la línea 1 le decimos al compilador que vamos a ocupar el namespace <em>System</em> que contiene librerías básicas para la creación de proyectos. Para conocer las clases que incluye puedes consultar la ayuda de Microsoft <a href=" http://msdn.microsoft.com/en-us/library/system.aspx">aquí.</a></p>
<p>&nbsp;</p>
<p>En la línea 3 se declara nuestro namespace el cual tiene el mismo nombre que nuestro proyecto.</p>
<p>&nbsp;</p>
<p>En la línea 5 se declara la clase <em>Program</em> que tiene el mismo nombre del archivo</p>
<p>&nbsp;</p>
<p>En la línea 11 se encuentra el método <em>Main() </em>que será nuestro punto de partida del juego, el código (<em>string[] args</em>) que se encuentra como parámetros de entrada se utiliza para mandar comandos por línea de comandos al ejecutar el juego, por ejemplo si al terminar nuestro proyecto tenemos un archivo ejecutable llamo Mijuego.exe podríamos escribir</p>
<p>&nbsp;</p>
<p>MiJuego Parm1,Parm2</p>
<p>&nbsp;</p>
<p>Los dos parámetros que escribamos aquí se guardaran en el arreglo <em>args</em> y podremos ocuparlos como queramos.</p>
<p>&nbsp;</p>
<p>Dentro del método <em>Main() </em>se encuentra una instancia a la clase <em>Engine</em> y una llamada al método Run() de la misma. El análisis de la clase <em>Engine</em> lo veremos más adelante.</p>
<p>&nbsp;</p>
<p>Otra cosa interesante en este código es que nosotros sabemos que al declarar una clase es necesario instanciar un objeto para poder acceder a sus métodos y parámetros; si aplicamos esta regla al código que estamos analizando ahora necesitaríamos instanciar un objeto de la clase <em>Program</em> y llamar al método <em>Main()</em> a través del mismo. Para evitar esto se declaran tanto la clase <em>Program</em> como el método <em>Main()</em> como <em>static</em> para poder ser invocados sin necesidad de instanciar un objeto.</p>
<p>&nbsp;</p>
<p><strong>Engine.cs</strong></p>
<p>&nbsp;</p>
<p>Como comenté antes, en esta clase se lleva a cabo el control principal del proyecto porque contiene las funciones de rendereo en pantalla, carga de recursos, etc.</p>
<p>&nbsp;</p>
<p>Para analizar el código que se generó automáticamente voy a quitar los comentarios que incluye por default para concentrarnos en las funciones.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1    using System;<br />
2    using System.Collections.Generic;<br />
3    using System.Linq;<br />
4    using Microsoft.Xna.Framework;<br />
5    using Microsoft.Xna.Framework.Audio;<br />
6    using Microsoft.Xna.Framework.Content;<br />
7    using Microsoft.Xna.Framework.GamerServices;<br />
8    using Microsoft.Xna.Framework.Graphics;<br />
9    using Microsoft.Xna.Framework.Input;<br />
10  using Microsoft.Xna.Framework.Media;<br />
11  using Microsoft.Xna.Framework.Net;<br />
12  using Microsoft.Xna.Framework.Storage;<br />
13<br />
14  namespace WindowsGame1<br />
15  {<br />
16      public class Engine : Microsoft.Xna.Framework.Game<br />
17     {<br />
18       GraphicsDeviceManager graphics;<br />
19        SpriteBatch spriteBatch;<br />
20<br />
21        public Engine()<br />
22          {<br />
23           graphics = new GraphicsDeviceManager(this);<br />
24           Content.RootDirectory = &#8220;Content&#8221;;<br />
25         }<br />
26<br />
27        protected override void Initialize()<br />
28        {<br />
29            base.Initialize();<br />
30        }<br />
31<br />
32        protected override void LoadContent()<br />
33        {<br />
34            spriteBatch = new SpriteBatch(GraphicsDevice);<br />
35        }<br />
36<br />
37        protected override void UnloadContent()<br />
38        {<br />
39        }<br />
40<br />
41        protected override void Update(GameTime gameTime)<br />
42        {<br />
43<br />
44           if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)<br />
45               this.Exit();<br />
46            base.Update(gameTime);<br />
47        }<br />
48<br />
49       protected override void Draw(GameTime gameTime)<br />
50        {<br />
51            GraphicsDevice.Clear(Color.CornflowerBlue);<br />
52            base.Draw(gameTime);<br />
53        }<br />
54   }<br />
55 }</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>De la línea 1 a la 12 se agregan los namespace que necesitamos; estos incluyen las clases de la API de XNA que vamos a ocupar.</p>
<p>&nbsp;</p>
<p>La línea 14 es la declaración de nuestro espacio de trabajo que es el mismo que ocupamos en <em>Program.cs </em>y es el mismo de nuestro proyecto.</p>
<p>&nbsp;</p>
<p>La línea 16 contiene la declaración de nuestra clase principal que hemos nombrado <em>Engine</em>, esta clase hereda de la clase <em>Microsoft.Xna.Framework.Game</em> por lo que ya tendremos a nuestra disposición todos los métodos y características que requiere nuestro juego.</p>
<p>&nbsp;</p>
<p>La línea 18 contiene la declaración de nuestro manejador gráfico. Básicamente es el encargado de controlar el hardware de video para desplegar la información en pantalla.  Este controlador nos ahorra el trabajo de configurar el flujo de datos con la tarjeta gráfica que de otra forma sería en verdad complejo hacerlo por nuestra cuenta.</p>
<p>&nbsp;</p>
<p>La línea 19 declara un objeto de la clase <em>SpriteBatch</em> que es la clase que nos ayudara para la carga de recursos gráficos.</p>
<p>&nbsp;</p>
<p>De la línea 21 a la 25 tenemos el constructor de nuestra clase <em>Engine</em> en la que instanciamos nuestra manejador gráfico. Le pasamos como parámetro la palabra reservada <em>this</em>, para decirle con que objeto asociar el manejador que en nuestro caso será la clase <em>Engine</em>. La línea <em>Content.RootDirectory = &#8220;Content&#8221;;</em> es para indicar al compilador que la carpeta raíz donde se almacenan los recursos será la carpeta<em> “Content”.</em></p>
<p>&nbsp;</p>
<p>De la línea 27 a la 30 sobrescribimos el método <em>Initialize()</em> de nuestra clase base; En el cuerpo del mismo hacemos un llamado al método <em>Initialize() </em>de nuestra clase base, que como su nombre lo indica, iniciará todos los parámetros necesarios antes de iniciar el ciclo de ejecución del juego. Dado que se ejecuta una sola vez al iniciar el juego, aquí se deben incluir todas las inicializaciones a los parámetros que necesitemos.</p>
<p>&nbsp;</p>
<p>De la línea 32 a la 35 se sobrescribe el  método <em>LoadContent()</em> que se utiliza exclusivamente para cargar los recursos que vayamos a utilizar. Podríamos borrar este método y hacer nuestra carga utilizando el método<em> Initialize()</em> pero se incluye como un método aparte para tener más ordenado nuestro código. Como cuerpo del método se incluye la inicialización de nuestro objeto <em>spriteBatch</em> que declaramos previamente. Este método será invocado una sola vez en el juego.</p>
<p>&nbsp;</p>
<p>En la línea 37 se sobrescribe el método <em>UnloadContent()</em> que utilizaremos para liberar la memoria de los recursos que dejemos de utilizar. Será invocado una vez al final del juego.</p>
<p>&nbsp;</p>
<p>De la línea 41 a la 47 se sobrescribe el método<em> Update()</em> este es el método principal en cuanto a lógica del juego se refiere. Aquí se debe incluir por ejemplo el análisis de colisiones, el chequeo de las pulsaciones de los botones y cualquier actualización de información que se requiera durante la ejecución. El cuerpo del método solo incluye una validación del teclado que termina el juego si se presiona la tecla ESC y contiene un llamado al método <em>Update()</em> de la clase base.</p>
<p>&nbsp;</p>
<p>Por último, de la línea 49 a la 53 se sobrescribe el método <em>Draw()</em> que es el encargado de refrescar la pantalla cada ciclo de tiempo. Se ejecuta después del método <em>Update() </em>para hacer la actualización gráfica del análisis hecho en este último. El cuerpo del método incluye la línea <em>GraphicsDevice.Clear(Color.CornflowerBlue);</em> que nos limpia la pantalla y la rellena del color azul que se muestra por default. Este puede ser cambiado por otro modificando el parámetro de entrada del método. Al final se incluye un llamado al método <em>Draw()</em> de la clase base.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Con esto terminamos el análisis de nuestro código, en el siguiente post empezaremos el desarrollo de un juego en 2D no olvides dejar tus comentarios, nos vemos en el siguiente post.</p>
<p>&nbsp;</p>
<p>Piroshi</p>
]]></content:encoded>
			<wfw:commentRss>http://kalabaza.com.mx/?feed=rss2&amp;p=148</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
