<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7541954136311498680</id><updated>2012-02-16T14:31:04.880-03:00</updated><category term='ejemplo'/><category term='Microsoft'/><category term='podcast'/><category term='KeyboardState'/><category term='europa'/><category term='vector2'/><category term='tendencias'/><category term='matemáticas'/><category term='articulos'/><category term='Gratis'/><category term='recuerdos'/><category term='sprite'/><category term='industria'/><category term='balística'/><category term='spritebatch'/><category term='MSDN'/><category term='rectangle'/><category term='adolescencia'/><category term='distance'/><category term='draw'/><category term='mercado'/><category term='texture2d'/><category term='tecnología'/><category term='sangria.cl'/><category term='background'/><category term='jing'/><category term='plano cartesiano'/><category term='interpolación lineal'/><category term='podcaster'/><category term='update'/><category term='sin'/><category term='rotación'/><category term='Clamp'/><category term='infancia'/><category term='loadcontent'/><category term='starter'/><category term='howto'/><category term='cos'/><category term='juego'/><category term='2d'/><category term='consola'/><category term='Lerp'/><category term='xna'/><category term='pipeline'/><category term='vectores'/><category term='Java'/><category term='game'/><category term='isfe'/><category term='MAthHelper'/><category term='C#'/><category term='pascal'/><category term='radianes'/><category term='programación'/><category term='básico'/><category term='Technet'/><category term='estructura'/><category term='referencias'/><category term='videojuegos'/><category term='mercado de videojuegos'/><title type='text'>xnaexplorer</title><subtitle type='html'>En este blog pretendo compartir con ustedes la experiencia que adquiera en mi intento de desarrollar un pequeño juego en XNA.
Espero les resulte tan útil  y divertido como ha resultado para mi.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-8735939299553525827</id><published>2011-04-11T01:56:00.000-03:00</published><updated>2011-04-11T01:56:13.556-03:00</updated><title type='text'>Uso de XML en XNA para definición de niveles</title><content type='html'>En esta versión de pinguinocracia he incorporado la clase Etapa y un archivo XML que define los bloques por los que el usuario no puede pasar. El XML en cuestión contiene las coordenadas, altos y anchos de los rectangulos que definen estas zonas.&lt;br /&gt;&lt;br /&gt;Con esta mejora, es mucho mas sencillo definir los elementos de cada nivel.&lt;br /&gt;&lt;br /&gt;No he utilizado los assets de un xml natural de XNA sinoo que he usado xml común  corriente y la clase system,xml de punto net para acceder al contenido. &lt;br /&gt;&lt;br /&gt;La única salvedad es que en las propiedades del xml ha de especificarse que en lugar de compilar, este xml ha de ser manejado como contenido.&lt;br /&gt;&lt;br /&gt;Dejo acá una muestra de como funciona:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CgsuT5vtCMo?hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/CgsuT5vtCMo?hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Saludos y hasta la próxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-8735939299553525827?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/8735939299553525827/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2011/04/uso-de-xml-en-xna-para-definicion-de.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/8735939299553525827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/8735939299553525827'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2011/04/uso-de-xml-en-xna-para-definicion-de.html' title='Uso de XML en XNA para definición de niveles'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-5203155623680409278</id><published>2010-10-18T01:22:00.000-03:00</published><updated>2010-10-18T01:22:27.599-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='articulos'/><category scheme='http://www.blogger.com/atom/ns#' term='sangria.cl'/><category scheme='http://www.blogger.com/atom/ns#' term='podcaster'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'>No solo de punk vive el hombre</title><content type='html'>Hola&lt;br /&gt;&lt;br /&gt;Como no solo de punk vive el hombre quiero contarles que han publicado un artículo mio sobre podcasts en el sitio Sangria.cl&lt;br /&gt;&lt;br /&gt;Les dejo acá el link para que pasen a ver que tal&lt;br /&gt;&lt;br /&gt;http://sangria.cl/2010/10/tendencias-el-mundo-2-0-segun-podcaster/&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;@mgaticah&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-5203155623680409278?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://sangria.cl/2010/10/tendencias-el-mundo-2-0-segun-podcaster/' title='No solo de punk vive el hombre'/><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/5203155623680409278/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/10/no-solo-de-punk-vive-el-hombre.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/5203155623680409278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/5203155623680409278'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/10/no-solo-de-punk-vive-el-hombre.html' title='No solo de punk vive el hombre'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-504147748573634030</id><published>2010-08-27T15:07:00.000-04:00</published><updated>2010-08-27T15:07:23.178-04:00</updated><title type='text'>Pinguinocracia Beta 9</title><content type='html'>Hola estimados amigos. Hoy tengo algunas novedades:&lt;br /&gt;&lt;br /&gt;1- cambios en el sistema de dificultad. Seguimos teniendo facil, normal y dificil. Pero ahora, en lugar de tener un número fijo de enemigos por nivel, este aumenta en la medida que aumenta el jugador acumula mas puntaje.&lt;br /&gt;&lt;br /&gt;2 - Control de colisión con edificaciones. En la medida que se establece el contorno de las edificaciones estas no pueden ser atravesadas por los jugadores ni personajes no jugadores. aunque cuando tengo muchos personajes no jugadores amontonados intentando pasar por una edificación algunos lo consiguen.&lt;br /&gt;3 - Además, como pueden oír, ya tenemos incluido "Lindo momento frente al caos" en la banda sonora. Uta que me gustó ese tema para este juego.&lt;br /&gt;&lt;br /&gt;Aquí dejo el walktrough de la versión actual:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wVFJYVFu988&amp;hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/wVFJYVFu988&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bueno, eso por ahora, espero pronto tener mas novedades.&lt;br /&gt;&lt;br /&gt;Les cuento que pronto estaremos estrenando otras líneas gráficas, si bien el estilo escolar de cuaderno y lápiz me gusta, con el escanéo se perdió mucho en cuanto a color y detalle por lo que quiero implementar otra línea gráfica, en el mismo estilo pero mejor trabajada.&lt;br /&gt;&lt;br /&gt;Como siempre, saludos, gracias por el interés, colaboración y consejos.&lt;br /&gt;&lt;br /&gt;Manuel&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-504147748573634030?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/watch?v=wVFJYVFu988' title='Pinguinocracia Beta 9'/><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/504147748573634030/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-9.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/504147748573634030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/504147748573634030'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-9.html' title='Pinguinocracia Beta 9'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-8710288250734965672</id><published>2010-08-21T19:07:00.002-04:00</published><updated>2010-08-21T19:07:40.169-04:00</updated><title type='text'>pinguinocracia beta 7</title><content type='html'>nueva beta&lt;br /&gt;&lt;br /&gt;aquí tenemos el video&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pSI8hIJL3-U?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/pSI8hIJL3-U?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;en esta ya tenemos sonido de fondo gracias a las bandas Contraluz y Avalancha.&lt;br /&gt;&lt;br /&gt;Pueden cambiar entre temas con la tecla s&lt;br /&gt;&lt;br /&gt;Además podemos cambiar entre panalla completa y en ventana.&lt;br /&gt;&lt;br /&gt;he mejorado algo la colision entre piedras y "honorables fuerzas de la ley"(a.k.a. pacos culiaos)&lt;br /&gt;&lt;br /&gt;el link para descargarse la beta jugable es&lt;br /&gt;&lt;br /&gt;http://www.megaupload.com/?d=TX4O8SYX&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;ARK&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-8710288250734965672?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/8710288250734965672/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-7.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/8710288250734965672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/8710288250734965672'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-7.html' title='pinguinocracia beta 7'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-6373994257066325282</id><published>2010-08-17T02:34:00.000-04:00</published><updated>2010-08-17T02:34:07.359-04:00</updated><title type='text'>Pinguinocracia Beta 6</title><content type='html'>Estimados&lt;br /&gt;&lt;br /&gt;En esta demo ya tenemos sonido(ejalé)&lt;br /&gt;además un menú simple para seleccionar el modo de dificultad de juego&lt;br /&gt;aparte, el personaje ya tiene puntos de vida y poor tanto puede morir.&lt;br /&gt;&lt;br /&gt;Aquí les dejo el video:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ERar0xOztr0?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ERar0xOztr0?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;espero les guste, nuevamente aquí tienen la demo de esta versión.&lt;br /&gt;&lt;br /&gt;http://www.megaupload.com/?d=JK2DJEXS&lt;br /&gt;&lt;br /&gt;Lamentablemente el Jing(el software que uso para capturar las pantallas) me borra parte del extremo derecho cuando grabo en full screen, espero disculpen este problema técnico.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-6373994257066325282?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/6373994257066325282/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-6.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6373994257066325282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6373994257066325282'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-6.html' title='Pinguinocracia Beta 6'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-6879316024799431056</id><published>2010-08-16T02:56:00.000-04:00</published><updated>2010-08-16T02:56:22.986-04:00</updated><title type='text'>Pinguinocracia Beta 5</title><content type='html'>Estimadísimos&lt;br /&gt;&lt;br /&gt;Tengo ya un nuevo demo del juego pinguinocracia&lt;br /&gt;Aquí está el video &lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/j5KjWHDe1kc?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/j5KjWHDe1kc?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Bien, aquí tenemos otra demo&lt;br /&gt;ahora, como ven, el personaje ya lanza piedras y elimina enemigos con estas, suma puntaje y calcula % de efectividad.&lt;br /&gt;Además, van apareciendo mas y mas enemigos constantemente.&lt;br /&gt;&lt;br /&gt;Esta vez, además, les dejo aquí el ejecutable del programa, quiero saber si les funciona con solo descargarlo, si les da errores al ejecutarlo, cualquier cosa, bueno, me cuentan.&lt;br /&gt;&lt;br /&gt;El ejecutable pueden descargarlo en&lt;br /&gt;&lt;br /&gt;http://www.megaupload.com/?d=GPXRVMCB&lt;br /&gt;&lt;br /&gt;Saludos y gracias por el interés y la buena onda de todo el mundo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-6879316024799431056?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/6879316024799431056/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-5.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6879316024799431056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6879316024799431056'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-5.html' title='Pinguinocracia Beta 5'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-1532369561580599885</id><published>2010-08-14T13:45:00.001-04:00</published><updated>2010-08-14T13:49:41.988-04:00</updated><title type='text'>Pinguinocracia Beta 0000000000004</title><content type='html'>Hola&lt;br /&gt;&lt;br /&gt;Aquí dejo un nuevo beta de Pinguinocracia, el juego sobre la rebelión pinguina&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pHJkh87J0wk?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/pHJkh87J0wk?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Me lo he pasado muy bien haciéndolo.&lt;br /&gt;&lt;br /&gt;Estoy en busca de bandas escolares punk rock que quieran participar de este proyecto para incluir sus demos en la banda sonora del juego.&lt;br /&gt;&lt;br /&gt;No importa si está grabado en el baño de la casa, quiero un contenido bien punk artesa escolar en toda indole, en el dbujo, en la musica, en las ideas. &lt;br /&gt;&lt;br /&gt;La técnica y la perfección son una virtud menor al lado de la pasión y el deseo de hacer cosas.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-1532369561580599885?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/1532369561580599885/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-0000000000004.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/1532369561580599885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/1532369561580599885'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/pinguinocracia-beta-0000000000004.html' title='Pinguinocracia Beta 0000000000004'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-8633844446444729180</id><published>2010-08-11T14:49:00.000-04:00</published><updated>2010-08-11T14:49:16.788-04:00</updated><title type='text'>segundo approach de la rebelion pinguina, el juego</title><content type='html'>LOS PACOOOOSS!!!&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QcIBLbbr9Us&amp;amp;hl=es_ES&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/QcIBLbbr9Us&amp;amp;hl=es_ES&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-8633844446444729180?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/8633844446444729180/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/segundo-approach-de-la-rebelion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/8633844446444729180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/8633844446444729180'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/segundo-approach-de-la-rebelion.html' title='segundo approach de la rebelion pinguina, el juego'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-5732700894791719805</id><published>2010-08-11T14:47:00.002-04:00</published><updated>2010-08-11T14:47:54.400-04:00</updated><title type='text'>primer approach de la rebelión pinguina, el juego</title><content type='html'>&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nP53Pql8liw&amp;amp;hl=es_ES&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/nP53Pql8liw&amp;amp;hl=es_ES&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-5732700894791719805?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/5732700894791719805/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/primer-approach-de-la-rebelion-pinguina.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/5732700894791719805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/5732700894791719805'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/08/primer-approach-de-la-rebelion-pinguina.html' title='primer approach de la rebelión pinguina, el juego'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-6387111391873748012</id><published>2010-05-18T23:19:00.003-04:00</published><updated>2010-05-18T23:51:56.056-04:00</updated><title type='text'>Desarrollo de un juego 2D con XNA IX - Audio</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://woody.typepad.com/Pictures/bong_13_07.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://woody.typepad.com/Pictures/bong_13_07.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Estimadísimos:&lt;br /&gt;&lt;br /&gt;Nuevamente y como siempre, bienvenidos a este, su blog XNAExplorer, donde intentamos, de a poco y paulatinamente ir desentrañando las características de este excelente framework de desarrollo que es XNA.&lt;br /&gt;&lt;br /&gt;Me disculpo por mi ausencia de casi un mes, obligaciones laborales, académicas y domésticas me han hecho difícil sentarme con calma a escribir en este blog que llevo con tanto cariño.&lt;br /&gt;&lt;br /&gt;En el capítulo de hoy escribiré sobre algo que hicimos en la oficina casi jugando con algunos de mis colegas. Habíamos estado conversando respecto a hacer un juego con sonidos onotamopéyicos ordinarios hechos con la boca "tchiúm"(disparo), "pujjjjhh"(explosión), "tu pa tu pa tupa tutu tupa"(Banda sonora), la verdad, lo hicimos, con la grabadora de sonidos de Windows, el microfono incorporado al notebook y hartas ganas de tontear un rato, despues de todo, es un juego, no es un sistema de facturas de una tienda retail, puede ser divertido.&lt;br /&gt;&lt;br /&gt;De antemano, agradezco la asesoría a don Marcelo Acosta, Eduardo Ríos y Finnian Fernandez, por enriquecer con su manantial de tonteras el torrente de ideas que tengo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El agregar audio a un proyecto XNA resulta bastante simple gracias a las herramientas y clases que provee.&lt;br /&gt;&lt;br /&gt;Primero debemos, en la carpeta content, la misma donde guardamos los png o si lo desean en otra carpeta dentro de content que haga referencia a los sonidos, agregar los archivos de audio que hemos capturado con nuestra grabadora de sonidos o cualquier otro medio que ustedes hubiesen utilizado.&lt;br /&gt;&lt;br /&gt;Luego usaremos una clase llamada SoundEffect que servirá, tal como da a entender su nombre, para nuestros efectos de sonido.&lt;br /&gt;&lt;br /&gt;Declararemos, por ejemplo, el efecto de sonido del disparo de esta forma.&lt;br /&gt;&lt;br /&gt;Luego, en el LoadContent agregaremos esta línea &lt;br /&gt;&lt;br /&gt;Disparo= Content.Load&lt;soundeffect&gt;("Disparo"); &lt;/soundeffect&gt;&lt;br /&gt;&lt;br /&gt;Si se dan cuenta, usamos el mismo método Content.Load que utilizamos con las texturas. Al referir entre &amp;lt;&amp;gt; la clase SoundEffect le estamos indicando al método Content.Load que lo que estamos cargando es un efecto de sonido y no una imagen.&lt;br /&gt;&lt;br /&gt;Cno esto, tenemos ya disponible el sonido dentro de nuestra variable ahora podemos reproducir el sonido asociado, para esto usamos el método Play de la clase SoundEffect.&lt;br /&gt;&lt;br /&gt;En cuanto al sonido de fondo, usaremos 2 clases MediaPlayer y Song.&lt;br /&gt;&lt;br /&gt;En el LoadContent pondremos:&lt;br /&gt;&lt;br /&gt;MediaPlayer.IsRepeating=true; //Cone sto indicamos que el audio se repetirá constantemente&lt;br /&gt;&lt;br /&gt;Luego&amp;nbsp; cargaremos nuestro audio de fondo con la siguiente línea:&lt;br /&gt;&lt;br /&gt;MediaPlayer.Play(Content.Load&lt;song&gt;("backgroundMusic"));&lt;/song&gt;&lt;br /&gt;&lt;br /&gt;backgroundMusic es el nombre del archivo wav que he dejado como audio de fondo. Como pueden ver, otra vez usamos el nunca bien ponderado método Content.Load pero en esta ocasión con la clase Song&lt;br /&gt;&lt;br /&gt;He agregado las siguiente variables globales&lt;br /&gt;&lt;br /&gt;bool HaDisparado=false;&lt;br /&gt;bool HaExplotado=true;&lt;br /&gt;&lt;br /&gt;en el método FireCannonball setearé, cuando se dispare, la variable HaDisparado en true, de este modo, en l método Draw evalúo y hago lo siguiente&lt;br /&gt;&lt;br /&gt;&amp;nbsp; if (HaDisparado)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Disparo.Play();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HaDisparado = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;De este modo, cuando se dispara, se ejecuta el sonido de disparo y luego nuevamente se entra al estado de no disparo.&lt;br /&gt;&lt;br /&gt;Eso por hoy, como verán no es muy dificil y es bastante divertido.&lt;br /&gt;&lt;br /&gt;Saludos a mis colegas, amigos, la gente de GameDev, Microsoft y simples entusiastas de mente inquieta y creatividad infinita que ha estado interesada en este humilde blog.&lt;br /&gt;&lt;br /&gt;AH! y un especial saludo a José Carrasco que se ha sumado como diseñador en mi proyecto de título basado en este grandioso framework.&lt;br /&gt;&lt;br /&gt;Manuel Gatica &lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;br /&gt;Una patética muestra de como usar la grabadora de sonidos de windows:&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=O0RC7djYZ7o"&gt;http://www.youtube.com/watch?v=O0RC7djYZ7o&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El juego ejecutándose con el sonido de disparo incorporado: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=u001fXuaxcw"&gt;http://www.youtube.com/watch?v=u001fXuaxcw&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-6387111391873748012?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/6387111391873748012/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/05/desarrollo-de-un-juego-2d-con-xna-ix.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6387111391873748012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6387111391873748012'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/05/desarrollo-de-un-juego-2d-con-xna-ix.html' title='Desarrollo de un juego 2D con XNA IX - Audio'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-9203947218174448389</id><published>2010-04-29T21:59:00.000-04:00</published><updated>2010-04-29T21:59:29.358-04:00</updated><title type='text'>canal youtube</title><content type='html'>Colegas, además de en el blog, los videos capturados los estoy subiendo en este canal de youtube&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/manuelgaticaholtmann"&gt;http://www.youtube.com/manuelgaticaholtmann&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-9203947218174448389?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/9203947218174448389/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/canal-youtube.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/9203947218174448389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/9203947218174448389'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/canal-youtube.html' title='canal youtube'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-7733741500373482820</id><published>2010-04-28T01:29:00.003-04:00</published><updated>2010-04-28T08:44:27.362-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KeyboardState'/><category scheme='http://www.blogger.com/atom/ns#' term='videojuegos'/><category scheme='http://www.blogger.com/atom/ns#' term='cos'/><category scheme='http://www.blogger.com/atom/ns#' term='rectangle'/><category scheme='http://www.blogger.com/atom/ns#' term='2d'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='sin'/><title type='text'>Desarrollo de un juego 2D con XNA VIII - Disparando balas</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.teesforall.com/images/Humor_Enough_Time_Playing_Games_Black_Shirt.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.teesforall.com/images/Humor_Enough_Time_Playing_Games_Black_Shirt.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Estimados amigos, nuevamente, bienvenidos a este, su blog, XNAExplorer.&lt;br /&gt;&lt;br /&gt;En el último post, quedamos con un cañón que rota entre 0 y 90 grados sobre un fondo espacial. Nada muy excitante aún.&lt;br /&gt;&lt;br /&gt;Bien, en el capítulo de hoy vamos(por fín) a disparar.&lt;br /&gt;&lt;br /&gt;Lo primero que debemos considerar es que nuestra clase GameObject queda corta para describir los comportamientos de una bala pues no contiene las propiedades que un objeto que se mueve por la pantalla posee. Hasta ahora no hemos lanzado nuestro cañón por los aires asi que no había sido necesario. A diferencia del cañón, una bala tendrá una trayectoria, bien podríamos ir representando cada punto de una trayectoria actualizando el valor de position de nunestro objeto de juego, pero aún es insuficiente. Por otro lado, la bala disparada, en algún momento "muere" ya sea al abandonar la pantalla o al colisionar con algún objeto la bala debe dejar de estar activa y por tanto dejar de ser dibujada.&lt;br /&gt;&lt;br /&gt;Para cubrir estas necesidades, modificaremos nuestra clase GameObject agregando las propiedades: Velocity y Alive. donde Velocity nos permitirá ir calculando la trayectoria sumándola a una posición inicial de lanzamiento y Alive nos permitirá saber si el objeto está activo o no para dibujarlo.&lt;br /&gt;&lt;br /&gt;Entonces, la clase GameObject quedará de este modo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Audio;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Content;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.GamerServices;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Graphics;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Media;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Net;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Storage;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; JuegoXNADemo1&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; GameObject&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Texture2D Sprite;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector2 Position;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Rotation;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector2 Center;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector2 Velocity;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Alive;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; GameObject(Texture2D LoadedTexture)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            Rotation = 0.0f;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            Position = Vector2.Zero;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            Sprite = LoadedTexture;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            Center = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(Sprite.Width / 2, Sprite.Height / 2);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            Velocity = Vector2.Zero;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            Alive = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Ahora, en nuestra clase Game1 agregaremos una constante que limite la cantidad de balas que pueden estar simultáneamente en pantalla, para el caso del ejemplo, fijaremos este valor en 3. Si quieren que el cañçon pueda disparar mas o menos balas por vez, tan solo cambien el valor de la constante y voilá.&lt;br /&gt;&lt;br /&gt;Además, agregaremos un array de GameObject que represente nuestro conjunto de balas en juego.&lt;br /&gt;&lt;br /&gt;Entonces, la sección de variables globales nos quedará así:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        GraphicsDeviceManager graphics;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        SpriteBatch spriteBatch;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        Texture2D backgroundTexture;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        Rectangle viewPortRect;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        GameObject Cannon;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MaxCannonBalls = 3;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        GameObject[] CannonBalls;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;//Resto del programa&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Como podrán suponer en base a lo visto en los post anteriores, la mecánica general es:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Actualizar datos en el método &lt;b&gt;Update()&lt;/b&gt; y luego dibujar en base a estos datos en el método &lt;b&gt;Draw()&lt;/b&gt;.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Así es y seguiremos haciéndolo aunque con una salvedad.&lt;br /&gt;&lt;br /&gt;Verán, en la medida que uno comienza a desarrollar y el código comienza a crecer y crecer el código se va haciendo menos mantenible(Esto es: se hace mas dificil encontrar errores o secciones de interés y mas dificil de modificar sin provocar errores) para evitar esto se acostumbra ir encerrando aquellos fragmentos de código relacionados con una tarea específica dentro de métodos específicos. Por ejemplo, si en el método update y en el método draw colocamos el código completo necesario para hacer lo propio con cada uno de los distintos objetos manejados(por ejemplo cañón, balas, naves, textos, otros enemigos, etc) Estos metodos crecerán tanto que luego se nos hará dificil de leer.&lt;br /&gt;&lt;br /&gt;Si se hace dificil leer un parrafo como el anterior, que está en español y lenguaje natural, imaginen lo que pasa con código de programación.&lt;br /&gt;&lt;br /&gt;Para concluir la idea anterior, diré que agregaremos 2 métodos que se ocuparan de:&lt;br /&gt;1 - Actualizar los datos de posición y status de las balas(UpdateCannonBall())&lt;br /&gt;2 - De inicializar los datos de las balas cuando se presione la barra espaciadora para dispararlas(FireCannonBall())&lt;br /&gt;&lt;br /&gt;Los métodos son estos:&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FireCannonBall()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        { &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (GameObject cannonBall &lt;span class="kwrd"&gt;in&lt;/span&gt; CannonBalls )&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!cannonBall.Alive)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                    &lt;span class="rem"&gt;//activamos la bala&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                    cannonBall.Alive = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    &lt;span class="rem"&gt;//Establecemos posición inicial segun la posición del cañón&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                    cannonBall.Position = Cannon.Position - cannonBall.Center;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                    &lt;span class="rem"&gt;//Determinamos la velocidad de la bala segun la posición del cañón&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                    cannonBall.Velocity = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2((&lt;span class="kwrd"&gt;float&lt;/span&gt;)Math.Cos(Cannon.Rotation ),&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                        (&lt;span class="kwrd"&gt;float&lt;/span&gt;)Math.Sin(Cannon.Rotation )) * 5;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateCannonBall()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            &lt;span class="rem"&gt;//Revisaremos cada cannoBall existente dentro del array de GameObject llamado CannonBalls&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (GameObject cannonBall &lt;span class="kwrd"&gt;in&lt;/span&gt; CannonBalls)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (cannonBall.Alive)&lt;span class="rem"&gt;//Si la bala está activa, modificaremos su posición&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                    cannonBall.Position += cannonBall.Velocity;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!viewPortRect.Contains(&lt;span class="kwrd"&gt;new&lt;/span&gt; Point((&lt;span class="kwrd"&gt;int&lt;/span&gt;)cannonBall.Position.X,(&lt;span class="kwrd"&gt;int&lt;/span&gt;)cannonBall.Position.Y)))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                   &lt;span class="rem"&gt;//Si la bala sale de la pantalla, la desactivaremos&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                    cannonBall.Alive = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;La gracia de definir estos métodos es que luego podemos invocarlos por su nombre y así ejecutar el código que contienen sin contaminar al método que los invoque con código que pudiera hacer compleja su lectura. &lt;br /&gt;&lt;br /&gt;En este caso, ambos métodos serán invocados por el método Update(), cuyo código dejo aquí:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="rem"&gt;// Allows the game to exit&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;.Exit();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            KeyboardState keyboardState = Keyboard.GetState();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(keyboardState.IsKeyDown(Keys.Left ))&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                Cannon.Rotation -= 0.1f;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (keyboardState.IsKeyDown(Keys.Right ))&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                Cannon.Rotation += 0.1f;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (keyboardState.IsKeyDown(Keys.Space) &amp;amp;&amp;amp; !previousKeyboardState.IsKeyDown(Keys.Space ))&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                &lt;span class="rem"&gt;//si la barra espaciadora se ha presionado y antes no estaba presionada&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                &lt;span class="rem"&gt;//Disparamos una bala&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                FireCannonBall();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your update logic here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            Cannon.Rotation = MathHelper.Clamp(Cannon.Rotation, -MathHelper.PiOver2, 0);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            &lt;span class="rem"&gt;//Actualizaremos los estados y posiciones de las balas invocando el método UpdateCannonBall&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            UpdateCannonBall();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="rem"&gt;//Almacenamos el estado actual del teclado&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            previousKeyboardState = keyboardState;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Por si no lo notaron, ha aparecido una nueva variable(&lt;b&gt; previousKeyboardState&lt;/b&gt;) que es una variable global de tipo KeyboardState, lo que hace es, en cada ciclo, almacenar el último estado del teclado. La usaremos para controlar que las balas se disparen solo cuando se presiona la barra espaciadora y no cuando se deja presionada, sin este control, dada la velocidad a la que se ejecutan estos métodos, las tres balas saldrían disparadas juntas y nos daría la impresión de ser una única bala alargada.&lt;br /&gt;&lt;br /&gt;Para que no les de error, han de agregarla tambien a la sección de variables globales, con lo que el encabezado de la clase Game1 queda así:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        GraphicsDeviceManager graphics;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        SpriteBatch spriteBatch;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        Texture2D backgroundTexture;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        Rectangle viewPortRect;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        GameObject Cannon;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MaxCannonBalls = 3;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        GameObject[] CannonBalls;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        KeyboardState previousKeyboardState = Keyboard.GetState();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;//Resto del programa&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Ahora, solo nos queda modificar el método draw para que revise el status de las balas y si están activas, las dibuje en pantalla.&lt;br /&gt;&lt;br /&gt;Entonces, el nuevo método Draw es este:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            spriteBatch.Begin();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            spriteBatch.Draw(backgroundTexture, viewPortRect, Color.White);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            spriteBatch.Draw(Cannon.Sprite, Cannon.Position, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Color.White, Cannon.Rotation, Cannon.Center, 1.0f, SpriteEffects.None, 0);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="rem"&gt;//Revisamos cada cannonBall existente en el array CannonBalls&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (GameObject cannonball &lt;span class="kwrd"&gt;in&lt;/span&gt; CannonBalls)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (cannonball.Alive)&lt;span class="rem"&gt;//Si la bala está activa&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                    &lt;span class="rem"&gt;//La dibujamos&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                    spriteBatch.Draw(cannonball.Sprite, cannonball.Position, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Color.White, cannonball.Rotation, cannonball.Center, 1.0f, SpriteEffects.None, 0);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            spriteBatch.End();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your drawing code here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Bueno, ahora, si han modificado sus códigos del modo correcto, nada mas presionen F5, con las teclas de dirección muevan su cañón y con la barra espaciadora disparen sus balas. ¿A qué ahora si da mas gustito?.. Como diría don Raúl Guerrero:"Tasstyy! "("teeeiiistii!").&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Aviso:&lt;/b&gt; Por una molesta tos que me impide hablar 5 minutos continuos sin que me de un ataque horripilante de abuelito montepiado, solo incluiré código por ahora, los videos se los debo. &lt;br /&gt;&lt;br /&gt;Como siempre, gracias por su tiempo e interés, un abrazo y recuerden "El volar es un arte o, mejor dicho, un don. El don consiste en aprender a tirarse al suelo y fallar."&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bonus track&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;JA, aqui un extracto de uno de mis libros favoritos de Douglas Adams, "La guía del viajero intergaláctico"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instrucciones de como Volar&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;El volar es un arte o, mejor dicho, un don.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;El don consiste en aprender a tirarse al suelo y fallar.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Elija un día que haga bueno -sugiere- e inténtelo.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;La primera parte es fácil.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Lo único que se necesita es simplemente la habilidad de tirarse hacia adelante con todo el peso del cuerpo, y buena voluntad para que a uno no le importe que duela.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Es decir, dolerá si no se logra evitar el suelo.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;La mayoría de la gente no consigue evitar el suelo, y si de verdad lo intenta como es debido, lo más probable es que no logra evitarlo de ninguna manera.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Está claro que la segunda parte, la de evitar el suelo, es la que presenta dificultades. &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-7733741500373482820?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/7733741500373482820/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-juego-2d-con-xna-viii.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/7733741500373482820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/7733741500373482820'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-juego-2d-con-xna-viii.html' title='Desarrollo de un juego 2D con XNA VIII - Disparando balas'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-291385446394545427</id><published>2010-04-22T01:31:00.000-04:00</published><updated>2010-04-22T01:31:03.648-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercado'/><category scheme='http://www.blogger.com/atom/ns#' term='mercado de videojuegos'/><category scheme='http://www.blogger.com/atom/ns#' term='europa'/><category scheme='http://www.blogger.com/atom/ns#' term='tendencias'/><category scheme='http://www.blogger.com/atom/ns#' term='industria'/><category scheme='http://www.blogger.com/atom/ns#' term='videojuegos'/><category scheme='http://www.blogger.com/atom/ns#' term='isfe'/><title type='text'>Sobre el mercado de videojuegos en el mundo (Ahora un poco de estadística)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.isfe-eu.org/tzr/scripts/resizer.php?filename=T009/F0007/98/7c/08a1f6cc6054412c945d634762763f03&amp;amp;mime=image%2Fjpeg&amp;amp;geometry=580%3E" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://www.isfe-eu.org/tzr/scripts/resizer.php?filename=T009/F0007/98/7c/08a1f6cc6054412c945d634762763f03&amp;amp;mime=image%2Fjpeg&amp;amp;geometry=580%3E" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Estimados, nuevamente, bienvenidos a XNAExplorer. Esta vez plantearé un tema distinto a las aristas técnicas que siempre estamos tratando y se trata de estadísticas que no son sino una imagen global del mercado al que estamos apuntando con esto que estamos creando. Porque nos guste o no, ese programita que nos quita el sueño y que mimamos como un hijo poniéndole un detallito aquí y otro detallito allá es a la vez un producto que puede salr al mercado y aparte de ego, retribuir económicamente nuestro sudor, lágrimas y tendinitis. &lt;br /&gt;&lt;br /&gt;No solo de punk vive el hombre y por mucho que nos gusten los videojuegos y el desarrollo de los mismos no hay que dejar de considerar que esta es un área de negocio.&lt;br /&gt;&lt;br /&gt;Al menos eso es lo que tuve que considerar ahora que estoy trabajando como proyecto de título en el desarrollo de un videojuego. &lt;br /&gt;&lt;br /&gt;Mi profesor me dice: "Ya, es bonita tu idea, pero dime en que sustentas el que pueda ser un proyecto económicamente viable." &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.isfe-eu.org/tzr/scripts/resizer.php?filename=T009/F0007/d8/a3/0544daa68b5f30df3e3134df088c3910&amp;amp;mime=image%2Fjpeg&amp;amp;geometry=580%3E" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="123" src="http://www.isfe-eu.org/tzr/scripts/resizer.php?filename=T009/F0007/d8/a3/0544daa68b5f30df3e3134df088c3910&amp;amp;mime=image%2Fjpeg&amp;amp;geometry=580%3E" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Entonces tuve que preguntarme cosas como:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;¿Manuel, Qué sabes de la demanda por videojuegos mas allá de que te encanta Metal Gear (Kojima es mi copiloto), que piensas que Silent Hill Shattered Memories es una delicia, que te encanta salir a pasear en bicicleta en GTA San Andreas o que gastaste un dineral en tu infancia y adolescencia en los locales de videojuegos del barrio?"&lt;/li&gt;&lt;li&gt;¿Manuel, en base a qué puedes decir que puedes vender 1, 10, 20 o un millón de copias? &lt;/li&gt;&lt;li&gt;¿Cómo se segmenta el mercado?&lt;/li&gt;&lt;li&gt;¿Quien compra mas?¿Donde compra mas?&lt;/li&gt;&lt;li&gt;etc&lt;/li&gt;&lt;/ol&gt;Luego de darme cuenta que mas allá de mis febriles delirios quijotescos no tenía una idea concreta tuve que ponerme a buscar. ¿Sabían ustedes que generalmente esta información se encuentra en estudios de mercado o benchmarks que son pagados?&amp;nbsp; Yo tenía alguna idea pero cuando empecé a googlear y me di cuenta que para casi cualquier cosa que querñia saber tenía que abrir la billetera la verdad me empecé a desalentar un poco.&lt;br /&gt;&lt;br /&gt;Afortunadamente di con el sitio de la Federación Europea de Software Interactivo(Interactive Software Federation of Europe aka ISFE) cuyo sitio es &lt;a href="http://www.isfe-eu.org/"&gt;http://www.isfe-eu.org/&lt;/a&gt;&amp;nbsp; donde encontré una serie de estudios, algunos en español otros en inglés sobre la situación de Europa en general y algunos específicos sobre España.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.isfe-eu.org/images/isfe.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.isfe-eu.org/images/isfe.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;De acá pude extraer interesante información como la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Los videojuegos son una de las actividades de ocio más comunes entre los europeos. El 40% de los jugadores les dedica entre 6 y 14 horas semanales, al mismo nivel que el tiempo que pasa viendo la televisión, navegando por Internet o visitando a familiares y amigos.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * La percepción general es que los videojuegos ofrecen ventajas únicas en relación con otras actividades de entretenimiento habituales como la televisión o el cine. El 72% juega por placer, el 57% como una forma de estimular la imaginación y el 45% afirma que los juegos le hacen pensar. El aspecto social de jugar online con otras personas es un importante factor secundario para los jugadores.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * En casa, los europeos juegan de forma responsable. El 81% de los padres que juegan lo hacen con sus hijos y más de la mitad de los padres jugadores controlan siempre los juegos que compran y a los que juegan sus hijos.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Entre los no jugadores, no parece existir ningún sentimiento negativo hacia los videojuegos. Casi la mitad de los que no juegan (48%) citan como motivo la falta de tiempo.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * En España, el 28% de la población con edades comprendidas entre los 16 y los 49 años se describe a sí misma como jugadores activos, el 16% de de entre 30 y 49 años.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Las mujeres representan una proporción destacable del mercado de los videojuegos: en España el 18% de las mujeres de entre 16 y 49 años se consideran jugadoras activas.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Más del 60% de los jugadores afirma jugar online.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * El 72% de los jugadores utiliza su consola como dispositivo multimedia para otras actividades.&lt;br /&gt;&lt;br /&gt;También tienen una sección de Hechos sobre el mercado, donde indican lo siguiente:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp; Uno de cada 3 europeos usa juegos de computadora o consola regularmente.&lt;br /&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp; Los jugadores, regularmente tienen entre 20 y 30 años de edad, jugando 6 horas a la semana.&lt;br /&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp; Aún con sus treinta años, la industria del video juego sigue convocando y asombrando.&lt;br /&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp; Un asombroso crecimiento de 12%&amp;nbsp; se determinó el 2002. Los rangos de crecimiento, se espera, crecerán sobre esto en los próximos años&amp;nbsp; con Europa liderando la demanda.&lt;br /&gt;5.&amp;nbsp;&amp;nbsp;&amp;nbsp; La industria del videojuego generó 18.1 billones de euros el 2001. 6,7 de los cuales fueron generados tan solo en Europa.&lt;br /&gt;6.&amp;nbsp;&amp;nbsp;&amp;nbsp; Los videojuegos generan mas dividendos que el cine o el dvd.&lt;br /&gt;7.&amp;nbsp;&amp;nbsp;&amp;nbsp; Los videojuegos estimulan nuevas tecnologías de comunicación. Pueden ser jugados en múltiples plataformas, incluso celulares y crean demanda por mayores anchos de banda.&lt;br /&gt;&lt;br /&gt;Tienen además una zona de descarga de papers que están accesibles sin costo donde se puede ahondar mas aún. Está buenísimo, denle un vistazo en estos links&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.isfe-eu.org/index.php?PHPSESSID=jmqt54ptdvp88rjq59e6374vn5&amp;amp;oidit=T001:662b16536388a7260921599321365911"&gt;Industria y jugadores&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.isfe-eu.org/index.php?PHPSESSID=jmqt54ptdvp88rjq59e6374vn5&amp;amp;oidit=T001:8ca835a1574ad46296a34393b4e28c57"&gt;Estadístico$$&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.isfe-eu.org/index.php?PHPSESSID=jmqt54ptdvp88rjq59e6374vn5&amp;amp;oidit=T001:fc19fa9938e2ffefd5b0dd163a351f10"&gt;Violencia y uso excesivo&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.isfe-eu.org/index.php?PHPSESSID=jmqt54ptdvp88rjq59e6374vn5&amp;amp;oidit=T001:0e44dd59580a535bad61f03ba03d86f6"&gt;&amp;nbsp;Educación&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bueno, como pueden ver, hay montón por leer y considerar. Que esto no es solo ponerse a dibujar y programar.&lt;br /&gt;&lt;br /&gt;Espero estos datos les sean útiles, como siempre, un abrazo y hasta pronto.&lt;br /&gt;&lt;br /&gt;Manuel Gatica Holtmann&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-291385446394545427?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/291385446394545427/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/sobre-el-mercado-de-videojuegos-en-el.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/291385446394545427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/291385446394545427'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/sobre-el-mercado-de-videojuegos-en-el.html' title='Sobre el mercado de videojuegos en el mundo (Ahora un poco de estadística)'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-6494609987619150279</id><published>2010-04-22T00:51:00.003-04:00</published><updated>2010-04-22T00:59:31.544-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rotación'/><category scheme='http://www.blogger.com/atom/ns#' term='Clamp'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='sprite'/><category scheme='http://www.blogger.com/atom/ns#' term='MAthHelper'/><title type='text'>Desarrollo de un juego 2D con XNA VII - MathHelper.Clamp aplicado en el control de rotación de un objeto</title><content type='html'>Estimados amigos, nuevamente bienvenidos a XNAExplorer.&lt;br /&gt;&lt;br /&gt;Lamento haber bajado el ritmo esta última semana pero por motivos laborales con jornadas de 15 horas diarias ante pronta entrega de un sitio en el que estoy trabajando se me ha hecho algo complejo, no obstante, como no quiero perder la periodicidad, dejo un pequeño entremes mientras tentenpie algo de material mas extenso y contundente.&lt;br /&gt;&lt;br /&gt;En el post anterior los estuve lateando quizas con mucha teoria y matemáticas,que mathHelper, que radianes, que vectores y blah blah blah.&lt;br /&gt;&lt;br /&gt;En esta ocasión, en un video muy breve mostraré como con MathHelper.Clamp es posible, de una manera muy simple(apenas una línea de código), acotar el ángulo de rotación de un objeto, en este caso, de nuestro cañón. La idea es que el cañón siempre dispare hacia el cielo, es decir con un ángulo entre 0 y 90 grados( entre cero y pi medio radianes). Para esto, justo despues de actualizar el ángulo de rotación en base a las teclas presionadas, incluiremos la siguiente línea en el código:&lt;br /&gt;&lt;br /&gt;Cannon.Rotation = MathHelper.Clamp(Cannon.Rotation, -MathHelper.PiOver2, 0);&lt;br /&gt;&lt;br /&gt;Como ven, muy simple, ahora como se ve esto, pueden apreciarlo en el video que dejo a continuación:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- copy and paste.  Modify height and width if desired. --&gt; &lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,1,15" width="500" height="430" id="ScreencastMediaRoll" align="middle"&gt;       &lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;param name="wmode" value="opaque"&gt;&lt;/param&gt;&lt;param name="movie" value="http://www.screencast.com/inc/flash/ScreencastMediaRoll.swf"&gt;&lt;/param&gt;&lt;param name="quality" value="high"&gt;&lt;/param&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;/param&gt;&lt;param name="FlashVars" value="configfile=http://www.screencast.com/users/ManuelGaticaHoltmann/playlists/XNAExplorer%20VII/mediaRollConfig.xml"&gt;&lt;/param&gt;&lt;embed src="http://www.screencast.com/inc/flash/ScreencastMediaRoll.swf" quality="high" bgcolor="#FFFFFF" wmode="opaque" width="220" height="430" name="ScreencastMediaRoll" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" FlashVars="configfile=http://www.screencast.com/users/ManuelGaticaHoltmann/playlists/XNAExplorer%20VII/mediaRollConfig.xml"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Eso por hoy.&lt;br /&gt;&lt;br /&gt;No quiero despedirme sin antes agradecer el apoyo, los comentarios y la buena onda de amigos y colegas que se han interesado por este tema. En especial a Jesús Bosch, cuyo blog he estado leyendo y está buenísimo, sobre todo para quien quiera explotar XNA en 3d, denle un vistazo a este link &lt;a href="http://geeks.ms/blogs/jbosch/default.aspx"&gt;http://geeks.ms/blogs/jbosch/default.aspx&lt;/a&gt;, tambien a Maic, a Ariel Martinez, Jonathan Monroy y&amp;nbsp; a Sergio Pinto.&lt;br /&gt;&lt;br /&gt;Otro sitio con el que di esta semana, gracias al grupo de facebook XNA Chile, fue a &lt;a href="http://www.gamedev.cl/"&gt;GameDev Chile&lt;/a&gt;, está interesante, denle una vuelta tambien.&lt;br /&gt;&lt;br /&gt;Saludos y hasta pronto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-6494609987619150279?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/6494609987619150279/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-juego-2d-con-xna-vii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6494609987619150279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6494609987619150279'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-juego-2d-con-xna-vii.html' title='Desarrollo de un juego 2D con XNA VII - MathHelper.Clamp aplicado en el control de rotación de un objeto'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-4735793868461520168</id><published>2010-04-11T18:37:00.001-04:00</published><updated>2010-04-11T18:54:26.859-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distance'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='matemáticas'/><category scheme='http://www.blogger.com/atom/ns#' term='radianes'/><category scheme='http://www.blogger.com/atom/ns#' term='vector2'/><category scheme='http://www.blogger.com/atom/ns#' term='MAthHelper'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='interpolación lineal'/><category scheme='http://www.blogger.com/atom/ns#' term='vectores'/><category scheme='http://www.blogger.com/atom/ns#' term='balística'/><category scheme='http://www.blogger.com/atom/ns#' term='Clamp'/><category scheme='http://www.blogger.com/atom/ns#' term='Lerp'/><category scheme='http://www.blogger.com/atom/ns#' term='recuerdos'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><category scheme='http://www.blogger.com/atom/ns#' term='2d'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Desarrollo de un juego 2D con XNA VI - Un poco de matemáticas</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_taRRRvHtCPo/S8JBNZnt5UI/AAAAAAAAACY/thqZW9x_26s/s1600/balistica.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_taRRRvHtCPo/S8JBNZnt5UI/AAAAAAAAACY/thqZW9x_26s/s320/balistica.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Estimados amigos, nuevamente, bienvenidos a este blog.&lt;br /&gt;&lt;br /&gt;En el post anterior ya pasamos por el orgasmo de controlar un objeto de juego(el sprite de nuestro cañón) con nuestro teclado. &lt;br /&gt;&lt;br /&gt;Este post será un poco menos excitante pues no trataremos temas gráficos sino que veremos temas matemáticos, los que serán esencialmente usados en el método Update() o en los métodos que nosotros creemos que sean invocados por Update().&lt;br /&gt;&lt;br /&gt;Recordemos que el loop principal del juego consiste en el ir y venir entre el método Update() y el método Draw(), donde Update() ha de ser usado para los cálculos de posiciones, detección de colisiones y cambios de cualquier dato o inteligencia relacionado con nuestros objetos de juego, mientras que el método Draw() debe remitirse solo al volcado de los objetos a la pantalla en función de lo calculado en el método Update().&lt;br /&gt;&lt;br /&gt;&lt;b&gt;¿Qué es un vector?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ya en&amp;nbsp; los post anteriores hemos usado la clase &lt;b&gt;Vector2&lt;/b&gt;, la documentación en detalle de esta clase la podemos encontrar en MSDN en este &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.vector2_members.aspx"&gt;link&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;Algunas cosas importantes a saber en lo inmediato las trataremos aquí.&lt;br /&gt;&lt;br /&gt;Un Vector2, es análogo a un vector, un punto dentro de un plano cartesiano, es un par ordenado de números reales. En efecto, Vector2 expone 2 propiedades: X e Y, con X e Y de tipo float. Esta estructura es ideal para el manejo de coordenadas en un plano de 2 dimensiones(2D) como es el caso del juego que estamos desarrollando. Es por lo anterior que para definir, por ejemplo, la posición de un objeto en la pantalla hemos definido propiedades como &lt;b&gt;Vector2 position&lt;/b&gt; donde position es una variable tipo &lt;b&gt;Vector2&lt;/b&gt;, por lo que podemos definir &lt;b&gt;position.X&lt;/b&gt; y &lt;b&gt;position.Y&lt;/b&gt; para indicar un punto en la pantalla.&lt;br /&gt;&lt;br /&gt;Pero, ¿Por qué usar Vector2 en lugar de colocar X e Y directamente como variables que indiquen la posición?,esto es porque la clase Vector2, además de proveer estos valores X e Y, provee una serie de métodos optimizados para realizar cálculos de posición y otras tareas propias de un vector.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;El método &lt;/b&gt;&lt;b&gt;Distance:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;float&lt;/span&gt; Distance (&lt;br /&gt;         Vector2 value1,&lt;br /&gt;         Vector2 value2&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;Nos entrega la distancia entre 2 vectores, si usáramos X e Y directo sobre el objeto de juego, en lugar de usar un Vector2, tendríamos que implemtnar la ecuación de la recta para calcular la distancia entre el X e Y de un objeto y el X e Y de otro. De forma un poco mas práctica, si tuviésemos los vectores de posición de una bala y de un enemigo, podríamos saber rapidamente si la bala ha alcanzado al enemigo con el método Distance.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;Vector2 PosicionDeBala; &lt;span class="rem"&gt;//Vector que indica la posición de la bala&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;Vector2 PosicionEnemigo;&lt;span class="rem"&gt;//Vector que indica la posición de el enemigo&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;           &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="rem"&gt;//bla bla bla, ejecución del juego&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt;(Vector2.Distance(PosicionDeBala,PosicionEnemigo )==0)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;         &lt;span class="rem"&gt;//Hemos alcanzado al enemigo&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Vector2.Zero()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nos devuelve un Vector2 con los valores X e Y iguales a cero.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vector2.One()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Nos devuelve un Vector2 con los valores X e Y iguales a uno.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vector2.Lerp(Vector1 valor1, Vector2 valor2, Float monto), con monto entre 0 y 1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Este método(Lerp) nos devolverá un nuevo &lt;b&gt;Vector2&lt;/b&gt; que estará mas cercano a &lt;b&gt;valor1&lt;/b&gt;, mientras mas cercano esté &lt;b&gt;monto&lt;/b&gt; a 0 y, viceversa, nos devolverá un &lt;b&gt;Vector2&lt;/b&gt; mas cercano a &lt;b&gt;valor2&lt;/b&gt; cuando &lt;b&gt;monto&lt;/b&gt; tienda a 1.&lt;br /&gt;¿Para qué diablos nos puede servir esto tan raro? Imaginemos que en lugar de una bala estamos disparando un misil teledirigido. podríamos, en base a la distancia existente entre el misil y algún&amp;nbsp; enemigo podríamos determinar el curso a seguir por el misil, suponiendo que si no estña cercano a un enemigo el misil deba seguir una linea recta y si está cerca de un enemigo deba avanzar hacia él.&lt;br /&gt;&lt;br /&gt;Eso como algo muy superficial respecto a Vector2, les invito a leer sobre los demás métodos en el link de MSDN que les indiqué.&lt;br /&gt;&lt;br /&gt;Tenemos además, otro set de métodos especiales para realizar nuestros cálculos y son ptovistos por la clase &lt;b&gt;MathHelper&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MathHelper&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;MathHelper nos provee un conjunto de métodos triginométricos, que nos serán extremadamente útiles en el cálculo de posiciones, balística, ondas, etcétera.&lt;br /&gt;&lt;br /&gt;Hemos de considerar que MathHelper va a operar los ángulos en base a radianes. ¿Qué diablos es eso? Bueno, cuando en la escuela nos enseñaron ángulos, normalmente se nos enseñó a medir ángulos en grados. Ahí se nos explica como, por ejemplo, un ángulo recto está compuesto por 2 rayos que componen un ángulo de 90 grados(90º), mientras que una recta son 2 rayos con un ángulo de 180 grados y una circunferencia en su totalidad conforma 360 grados. Radianes tiene la misma finalidad, medir ángulos, pero usa un sistema de numeración distinto. Podemos hacer una analogía a lo que pasa cuando medimos distancias en centimetros o en pulgadas.&lt;br /&gt;&lt;br /&gt;Aquí dejo una imagen que encontré en wikipedia que muestra la conversión entre radianes y ángulos, además nos indica el comportamiento de las funciones trigonométriicas esenciales(seno, coseno, tangente, etcétera) .&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_taRRRvHtCPo/S8JDL17hOeI/AAAAAAAAACg/ORdITCmY6kI/s1600/radianes+versus+grados.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/_taRRRvHtCPo/S8JDL17hOeI/AAAAAAAAACg/ORdITCmY6kI/s640/radianes+versus+grados.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Acá, un diagrama mas sencillo de como se divide una circunferencia en radianes.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_taRRRvHtCPo/S8JErIssFrI/AAAAAAAAACo/IJtQ567pJXI/s1600/Arco1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="352" src="http://1.bp.blogspot.com/_taRRRvHtCPo/S8JErIssFrI/AAAAAAAAACo/IJtQ567pJXI/s400/Arco1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Para ahondar mas en el tema pueden leer esta entrada de &lt;a href="http://es.wikipedia.org/wiki/Radianes"&gt;wikipedia&lt;/a&gt; que está bastante clara.&lt;br /&gt;&lt;br /&gt;La documentación de MathHelper en MSDN la podemos encontrar &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper_members.aspx"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Y en ella podemos ver los siguientes miembros.&lt;br /&gt;&lt;br /&gt;&lt;table xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;br /&gt;&lt;/th&gt;&lt;th&gt;Nombre&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Public Field" id="pubfield" src="http://i.msdn.microsoft.com/dynimg/IC26598.gif" xmlns="" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.e.aspx"&gt;E&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Representa la constante matemática e&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Public Field" id="pubfield" src="http://i.msdn.microsoft.com/dynimg/IC26598.gif" xmlns="" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.log10e.aspx"&gt;Log10E&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Representa el logarítmo base 10 de e.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Public Field" id="pubfield" src="http://i.msdn.microsoft.com/dynimg/IC26598.gif" xmlns="" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.log2e.aspx"&gt;Log2E&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Representa el logarísmo base 2 de e&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Public Field" id="pubfield" src="http://i.msdn.microsoft.com/dynimg/IC26598.gif" xmlns="" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.pi.aspx"&gt;Pi&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Representa el valor de Pi.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Public Field" id="pubfield" src="http://i.msdn.microsoft.com/dynimg/IC26598.gif" xmlns="" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.piover2.aspx"&gt;PiOver2&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Representa el valor de Pi medio (Pi dividido por 2).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Public Field" id="pubfield" src="http://i.msdn.microsoft.com/dynimg/IC26598.gif" xmlns="" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.piover4.aspx"&gt;PiOver4&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Representa el valor de Pi cuarto (Pi dividido por 4).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Public Field" id="pubfield" src="http://i.msdn.microsoft.com/dynimg/IC26598.gif" xmlns="" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.mathhelper.twopi.aspx"&gt;TwoPi&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Representa el valor de 2 Pi (2 veces Pi).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Y sus métodos. Algunos métodos que nos pueden resultar útiles son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MathHelper.Clamp&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Clamp (&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;         &lt;span class="kwrd"&gt;float&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;         &lt;span class="kwrd"&gt;float&lt;/span&gt; min,&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;         &lt;span class="kwrd"&gt;float&lt;/span&gt; max&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Clamp nos entregará:&lt;br /&gt;&lt;br /&gt;si value&amp;lt;=min = min&lt;br /&gt;si value&amp;gt;=max = max&lt;br /&gt;sino =value&lt;br /&gt;&lt;br /&gt;Esto nos servirá por ejemplo, cuando queremos acotar los rangos de la pantalla, por ejemplo, que cuando se llegue al tope superior o inferior de la pantalla nuestro Vector2.Y no exceda de este rango.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MathHelper.Lerp&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;MathHelper tambien provee una interpolación lineal, pero en este caso, sobre valores float en lugar de sobre vectores.&lt;br /&gt;&lt;br /&gt;La fórmula que Lerp utiliza internamente es esta&lt;br /&gt;&lt;br /&gt;&lt;pre xmlns="http://www.w3.org/1999/xhtml"&gt;value1 + (value2 - value1) * amount &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Aquí algunos ejemplos de como funcionaría en base a algunos valores:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1px solid blue" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 461px;" x:str=""&gt;&lt;col span="3" style="width: 60pt;" width="80"&gt;&lt;/col&gt;  &lt;col style="width: 166pt;" width="221"&gt;&lt;/col&gt;  &lt;tbody&gt;&lt;tr height="20" style="height: 15pt;"&gt;   &lt;td class="xl25" height="20" style="height: 15pt; width: 60pt;" width="80"&gt;value1&lt;/td&gt;   &lt;td class="xl25" style="border-left: 1px solid blue; width: 60pt;" width="80"&gt;value2&lt;/td&gt;   &lt;td class="xl25" style="border-left: 1px solid blue; width: 60pt;" width="80"&gt;amount&lt;/td&gt;   &lt;td class="xl26" style="border-left: 1px solid blue; width: 166pt;" width="221" x:str="value1 + (value2 - value1) * amount "&gt;value1 + (value2 - value1) *   amount&amp;nbsp;&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="17" style="height: 12.75pt;"&gt;   &lt;td class="xl24" height="17" style="border-top: 1px solid blue; height: 12.75pt;" x:num=""&gt;2&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;6&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;0&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:fmla="=A2+(B2-A2)*C2" x:num=""&gt;2&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="17" style="height: 12.75pt;"&gt;   &lt;td class="xl24" height="17" style="border-top: 1px solid blue; height: 12.75pt;" x:num=""&gt;2&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;6&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num="0.2"&gt;0,2&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:fmla="=A3+(B3-A3)*C3" x:num="2.8"&gt;2,8&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="17" style="height: 12.75pt;"&gt;   &lt;td class="xl24" height="17" style="border-top: 1px solid blue; height: 12.75pt;" x:num=""&gt;2&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;6&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num="0.3"&gt;0,3&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:fmla="=A4+(B4-A4)*C4" x:num="3.2"&gt;3,2&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="17" style="height: 12.75pt;"&gt;   &lt;td class="xl24" height="17" style="border-top: 1px solid blue; height: 12.75pt;" x:num=""&gt;2&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;6&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num="0.4"&gt;0,4&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:fmla="=A5+(B5-A5)*C5" x:num="3.6"&gt;3,6&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="17" style="height: 12.75pt;"&gt;   &lt;td class="xl24" height="17" style="border-top: 1px solid blue; height: 12.75pt;" x:num=""&gt;2&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;6&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num="0.5"&gt;0,5&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:fmla="=A6+(B6-A6)*C6" x:num=""&gt;4&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="17" style="height: 12.75pt;"&gt;   &lt;td class="xl24" height="17" style="border-top: 1px solid blue; height: 12.75pt;" x:num=""&gt;2&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;6&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num="0.7"&gt;0,7&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:fmla="=A7+(B7-A7)*C7" x:num="4.8"&gt;4,8&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="17" style="height: 12.75pt;"&gt;   &lt;td class="xl24" height="17" style="border-top: 1px solid blue; height: 12.75pt;" x:num=""&gt;2&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;6&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:num=""&gt;1&lt;/td&gt;   &lt;td class="xl24" style="border-left: 1px solid blue; border-top: 1px solid blue;" x:fmla="=A8+(B8-A8)*C8" x:num=""&gt;6&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Como ven, dando los valores 2 y 6, en función de como varíe amount va a cambiar el resultado.&lt;br /&gt;&lt;br /&gt;Esto nos podría servir, por ejemplo, para calcular el daño provocado. Si 2 y 6 fuesen el mínimo y máximo daño hecho por un arma, podríamos definir el amount en base a, por ejemplo, la distancia entre el arma y el objetivo(una escopeta podría hacer mas daño a quemarropa que a 20 metros) o en base a la armadura utilizada por el objetivo. A modo de analogía, esto nos da esa aleatoriedad que apunta al realismo que se puede ver en las tiradas de dados de un juego RPG.&lt;br /&gt;&lt;br /&gt;Bueno, eso por hoy. espero no haber dado tanta lata con esto de la matemática, puede ser un poco agotadora pero es lo que nos permitirá dar realismo a nuestros juegos.&lt;br /&gt;&lt;br /&gt;Consideremos que los videojuegos, como cualquier otro sistema informático, busca representar una realidad y en esto, la física y las matemáticas son herramientas esenciales. Imaginen un Pro Evolution Soccer donde no se contemple el efecto del pasto mojado o del viento sobre el índice de velocidad de los jugadores o del curso tomado por un balón o un Grand Theft Auto donde el peso de un vehículo no sea contemplado al lanzarse cerro abajo, o un shooter donde los misiles salgan sismpre disparados en linea recta en lugar de contemplar la el ángulo de lanzamiento, la distancia&amp;nbsp; o el alcance del arma en cuestión no tendrían ni la mitad del atractivo que tienen. &lt;br /&gt;&lt;br /&gt;Recuerdo que cuando estaba en enseñanza media(16 años apróx.) y ya estaba aburrido de programar juegos 2D con Ascii Art y quise empezar a programar juegos 3D con la librería TurboGraph de Turbo Pascal no tenía,o al menos desconocía, un conjunto de métodos matemáticos como los provistos por MathHelper o estas clases de vectores. Entonces me vi en la necesidad de ir creando yo mismo librerías que, por ejemplo, miplementarán formulas de recta, cálculo de distancia entre pares ordenados y la verdad fue una tarea árdua y que terminó siendo insuficiente pues estaba limitado a los escasos conocimientos matemáticos que un chico "normal" de 16 años puede tener. Rotar una recta me resultaba trazada con pascal usando estas funciones creadas por mi resultaba complejísimo, mientras en el post anterior pudimos rotar un objeto completo respecto de un eje de una forma simple, casi trivial, gracias a esas herramientas. &lt;br /&gt;&lt;br /&gt;Como siempre, gracias por la paciencia y el apoyo, un abrazo y jueguen harto.&lt;br /&gt;&lt;br /&gt;Manuel Gatica Holtmann&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-4735793868461520168?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/4735793868461520168/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-juego-2d-con-xna-vi-un.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/4735793868461520168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/4735793868461520168'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-juego-2d-con-xna-vi-un.html' title='Desarrollo de un juego 2D con XNA VI - Un poco de matemáticas'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_taRRRvHtCPo/S8JBNZnt5UI/AAAAAAAAACY/thqZW9x_26s/s72-c/balistica.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-3456328517399399321</id><published>2010-04-08T01:47:00.001-04:00</published><updated>2010-04-08T10:26:39.164-04:00</updated><title type='text'>Desarrollo de un juego 2D con XNA V - Insertar y controlar un sprite</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_taRRRvHtCPo/S73nSdXyRZI/AAAAAAAAACQ/gNey8iI2uiU/s1600/lisergia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://3.bp.blogspot.com/_taRRRvHtCPo/S73nSdXyRZI/AAAAAAAAACQ/gNey8iI2uiU/s200/lisergia.png" width="100" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Estimados amigos&lt;br /&gt;&lt;br /&gt;Nuevamente, bienvenidos a este blog.&lt;br /&gt;&lt;br /&gt;En el post de hoy seguiremos extendiendo el caso presentado anteriormente. La última vez quedamos con un juego que solo muestra un fondo espacial. Hoy, agregaremos un sprite, un objeto de juego que puede ser controlado por teclado. El sprite en cuestión será un cañon, el que al presionar las teclas izquierda o derecha rotara sobre su centro.&lt;br /&gt;&lt;br /&gt;Tal como indiqué en el post anterior, los sprites, como los fondos son texturas(Texture2D) pero los sprites, al no ser estáticos sino que tienen posiciones, rotaciones, transformaciones que a lo largo del juego varían han de implementarse de una forma un tanoto distinta.&lt;br /&gt;&lt;br /&gt;Para empezar, vamos a crear una clase que contendrá los datos pertinentes a posición, rotación, su centro y a la imagen en si que representará a nuestro objeto de juego. Implementada esta clase y su constructor, veremos las modificaciones necesarias para desplegarlo en pantalla y para controlar su movimiento con nuestro teclado.&lt;br /&gt;&lt;br /&gt;Al igual que en el post anterior, dejo acá la lista de videos de lo hecho para que sea mas fácil seguirlo y a continuación los codigos fuentes modificados.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LISTA DE VIDEOS&lt;/b&gt;&lt;br /&gt;&lt;object align="middle" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,1,15" height="430" id="ScreencastMediaRoll" width="500"&gt;       &lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;param name="wmode" value="opaque"&gt;&lt;/param&gt;&lt;param name="movie" value="http://www.screencast.com/inc/flash/ScreencastMediaRoll.swf"&gt;&lt;/param&gt;&lt;param name="quality" value="high"&gt;&lt;/param&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;/param&gt;&lt;param name="FlashVars" value="configfile=http://www.screencast.com/users/ManuelGaticaHoltmann/playlists/Desarrollo%20de%20un%20juego%202D%20con%20XNA%20V/mediaRollConfig.xml"&gt;&lt;/param&gt;&lt;embed src="http://www.screencast.com/inc/flash/ScreencastMediaRoll.swf" quality="high" bgcolor="#FFFFFF" wmode="opaque" width="220" height="430" name="ScreencastMediaRoll" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" FlashVars="configfile=http://www.screencast.com/users/ManuelGaticaHoltmann/playlists/Desarrollo%20de%20un%20juego%202D%20con%20XNA%20V/mediaRollConfig.xml"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Acá el código de nuestra clase &lt;b&gt;GameObject&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Audio;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Content;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.GamerServices;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Graphics;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Media;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Net;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Storage;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; JuegoXNADemo1&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; GameObject&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Texture2D Sprite;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector2 Position;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;float&lt;/span&gt; Rotation;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Vector2 Center;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; GameObject(Texture2D LoadedTexture)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            Rotation = 0.0f;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            Position = Vector2.Zero;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            Sprite = LoadedTexture;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            Center = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(Sprite.Width / 2, Sprite.Height / 2);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Y ahora el código de nuestra clase &lt;b&gt;Game1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Audio;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Content;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.GamerServices;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Graphics;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Media;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Net;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Storage;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; JuegoXNADemo1&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        GraphicsDeviceManager graphics;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        SpriteBatch spriteBatch;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        Texture2D backgroundTexture;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        Rectangle viewPortRect;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        GameObject Cannon;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Game1()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            graphics = &lt;span class="kwrd"&gt;new&lt;/span&gt; GraphicsDeviceManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            Content.RootDirectory = &lt;span class="str"&gt;"Content"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Allows the game to perform any initialization it needs to before starting to run.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="rem"&gt;/// This is where it can query for any required services and load any non-graphic&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        &lt;span class="rem"&gt;/// related content.  Calling base.Initialize will enumerate through any components&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="rem"&gt;/// and initialize them as well.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your initialization logic here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        &lt;span class="rem"&gt;/// LoadContent will be called once per game and is the place to load&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        &lt;span class="rem"&gt;/// all of your content.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadContent()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            &lt;span class="rem"&gt;// Create a new SpriteBatch, which can be used to draw textures.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;            spriteBatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; SpriteBatch(GraphicsDevice);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;            backgroundTexture = Content.Load&amp;lt;Texture2D&amp;gt;(&lt;span class="str"&gt;"background"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;            Cannon = &lt;span class="kwrd"&gt;new&lt;/span&gt; GameObject(Content.Load&amp;lt;Texture2D&amp;gt;(&lt;span class="str"&gt;"cannon"&lt;/span&gt;));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;            Cannon.Position = &lt;span class="kwrd"&gt;new&lt;/span&gt; Vector2(120,graphics.GraphicsDevice.Viewport.Height-80);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;            viewPortRect = &lt;span class="kwrd"&gt;new&lt;/span&gt; Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: use this.Content to load your game content here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;        &lt;span class="rem"&gt;/// UnloadContent will be called once per game and is the place to unload&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;        &lt;span class="rem"&gt;/// all content.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UnloadContent()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Unload any non ContentManager content here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Allows the game to run logic such as updating the world,&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;        &lt;span class="rem"&gt;/// checking for collisions, gathering input, and playing audio.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="gameTime"&amp;gt;Provides a snapshot of timing values.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;            &lt;span class="rem"&gt;// Allows the game to exit&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;.Exit();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;            KeyboardState keyboardState = Keyboard.GetState();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(keyboardState.IsKeyDown(Keys.Left ))&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;                Cannon.Rotation -= 0.1f;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (keyboardState.IsKeyDown(Keys.Right ))&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;                Cannon.Rotation += 0.1f;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your update logic here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  92:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  93:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  94:  &lt;/span&gt;        &lt;span class="rem"&gt;/// This is called when the game should draw itself.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  95:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  96:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="gameTime"&amp;gt;Provides a snapshot of timing values.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  97:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  98:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  99:  &lt;/span&gt;            GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 100:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101:  &lt;/span&gt;            spriteBatch.Begin();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 102:  &lt;/span&gt;            spriteBatch.Draw(backgroundTexture,viewPortRect,Color.White );&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103:  &lt;/span&gt;            spriteBatch.Draw(Cannon.Sprite,Cannon.Position, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Color.White, Cannon.Rotation, Cannon.Center, 1.0f,SpriteEffects.None, 0);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 104:  &lt;/span&gt;            spriteBatch.End();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 106:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your drawing code here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 108:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 110:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt; 112:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Bueno, como siempre, gracias por su atención, un abrazo y hasta la próxima.&lt;br /&gt;&lt;br /&gt;Manuel Gatica Holtmann&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-3456328517399399321?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/3456328517399399321/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-juego-2d-con-xna-v.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/3456328517399399321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/3456328517399399321'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-juego-2d-con-xna-v.html' title='Desarrollo de un juego 2D con XNA V - Insertar y controlar un sprite'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_taRRRvHtCPo/S73nSdXyRZI/AAAAAAAAACQ/gNey8iI2uiU/s72-c/lisergia.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-6643106617890738733</id><published>2010-04-05T01:07:00.016-04:00</published><updated>2010-04-05T01:34:09.520-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='texture2d'/><category scheme='http://www.blogger.com/atom/ns#' term='jing'/><category scheme='http://www.blogger.com/atom/ns#' term='draw'/><category scheme='http://www.blogger.com/atom/ns#' term='loadcontent'/><category scheme='http://www.blogger.com/atom/ns#' term='spritebatch'/><category scheme='http://www.blogger.com/atom/ns#' term='rectangle'/><category scheme='http://www.blogger.com/atom/ns#' term='background'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><title type='text'>Desarrollo de un cuego 2D con XNA IV - Colocando un fondo</title><content type='html'>Estimados&lt;br /&gt;&lt;br /&gt;Ya vimos en el post la estructura de un proyecto XNA en blanco, revisamos sus métodos y tuvimos la vertiginosa experiencia(jaja) de verlo funcionando.&lt;br /&gt;&lt;br /&gt;Pues bien, en esta ocasión haremos algo un poco menos abúlico y se trata de colocar una imagen de fondo.&lt;br /&gt;&lt;br /&gt;Me he valido para esto de unas imágenes y código que están en los proyectos de de la &lt;a href="http://creators.xna.com/es-ES/education/gettingstarted/bg2d/chapter1"&gt;guía para principiantes del sitio de XnaCreators&lt;/a&gt;. Este sitio, que por cierto está buenísimo, introduce al desarrollo de juegos tanto en 2D como en 3D por medio de una serie de videos que están muy bien explicados, aunque en inglés lo que para algunos puede ser un poco incómodo.&lt;br /&gt;&lt;br /&gt;Siguiendo elejemplo de XnaCreators he decidido presentar lo hecho en los videos que dejo a continuación.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LISTA DE VIDEOS&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- copy and paste.  Modify height and width if desired. --&gt; &lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,1,15" width="500" height="430" id="ScreencastMediaRoll" align="middle"&gt;       &lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;param name="wmode" value="opaque"&gt;&lt;/param&gt;&lt;param name="movie" value="http://www.screencast.com/inc/flash/ScreencastMediaRoll.swf"&gt;&lt;/param&gt;&lt;param name="quality" value="high"&gt;&lt;/param&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;/param&gt;&lt;param name="FlashVars" value="configfile=http://www.screencast.com/users/ManuelGaticaHoltmann/playlists/XNA%20-%20Insertar%20una%20imagen%20de%20fondo/mediaRollConfig.xml"&gt;&lt;/param&gt;&lt;embed src="http://www.screencast.com/inc/flash/ScreencastMediaRoll.swf" quality="high" bgcolor="#FFFFFF" wmode="opaque" width="220" height="430" name="ScreencastMediaRoll" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" FlashVars="configfile=http://www.screencast.com/users/ManuelGaticaHoltmann/playlists/XNA%20-%20Insertar%20una%20imagen%20de%20fondo/mediaRollConfig.xml"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Les contaré que para grabar estos videos he usado una herramienta que me ha recomentado mi buen amigo Maic, se trata de JING, de los mismos creadores de Camtasia. Excelente y gratuita.&lt;br /&gt;&lt;br /&gt;El código que contiene la clase Game1.cs de nuestro anterior proyecto en blanco, luego de este ejemplo es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Audio;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Content;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.GamerServices;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Graphics;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Media;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Net;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Storage;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; JuegoXNADemo1&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        GraphicsDeviceManager graphics;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        SpriteBatch spriteBatch;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        Texture2D backgroundTexture;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        Rectangle viewPortRect;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Game1()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            graphics = &lt;span class="kwrd"&gt;new&lt;/span&gt; GraphicsDeviceManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            Content.RootDirectory = &lt;span class="str"&gt;"Content"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Allows the game to perform any initialization it needs to before starting to run.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        &lt;span class="rem"&gt;/// This is where it can query for any required services and load any non-graphic&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="rem"&gt;/// related content.  Calling base.Initialize will enumerate through any components&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        &lt;span class="rem"&gt;/// and initialize them as well.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your initialization logic here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        &lt;span class="rem"&gt;/// LoadContent will be called once per game and is the place to load&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        &lt;span class="rem"&gt;/// all of your content.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadContent()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;            &lt;span class="rem"&gt;// Create a new SpriteBatch, which can be used to draw textures.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            spriteBatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; SpriteBatch(GraphicsDevice);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;            backgroundTexture = Content.Load&amp;lt;Texture2D&amp;gt;(&lt;span class="str"&gt;"background"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;            viewPortRect = &lt;span class="kwrd"&gt;new&lt;/span&gt; Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: use this.Content to load your game content here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        &lt;span class="rem"&gt;/// UnloadContent will be called once per game and is the place to unload&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        &lt;span class="rem"&gt;/// all content.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UnloadContent()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Unload any non ContentManager content here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Allows the game to run logic such as updating the world,&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;        &lt;span class="rem"&gt;/// checking for collisions, gathering input, and playing audio.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="gameTime"&amp;gt;Provides a snapshot of timing values.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;            &lt;span class="rem"&gt;// Allows the game to exit&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;.Exit();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;            &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your update logic here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;        &lt;span class="rem"&gt;/// This is called when the game should draw itself.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="gameTime"&amp;gt;Provides a snapshot of timing values.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;            GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;            spriteBatch.Begin();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt;            spriteBatch.Draw(backgroundTexture,viewPortRect,Color.White );&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;            spriteBatch.End();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  92:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  93:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your drawing code here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  94:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  95:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  96:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  97:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  98:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  99:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Nuevamente y como siempre, saludos y gracias por darse el tiempo de leer este blog y que(como diría don &lt;a href="http://www.superneurona.com/"&gt;Raúl Guerrero&lt;/a&gt;) nunca les falte &lt;b&gt;"la pasión del desarrollador"&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Manuel Gatica Holtmann&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-6643106617890738733?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/6643106617890738733/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-cuego-2d-con-xna-iv.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6643106617890738733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/6643106617890738733'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/04/desarrollo-de-un-cuego-2d-con-xna-iv.html' title='Desarrollo de un cuego 2D con XNA IV - Colocando un fondo'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-7942216412452832488</id><published>2010-03-30T23:42:00.003-03:00</published><updated>2010-04-04T11:31:44.336-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='referencias'/><category scheme='http://www.blogger.com/atom/ns#' term='juego'/><category scheme='http://www.blogger.com/atom/ns#' term='2d'/><category scheme='http://www.blogger.com/atom/ns#' term='básico'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='pipeline'/><category scheme='http://www.blogger.com/atom/ns#' term='estructura'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Desarrollo de un cuego 2D con XNA III - Proyecto en blanco</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_taRRRvHtCPo/S7LPOfdPBOI/AAAAAAAAABk/a8EYrGYdL-k/s1600/whywastegoodtechnology.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5454649946568328418" src="http://1.bp.blogspot.com/_taRRRvHtCPo/S7LPOfdPBOI/AAAAAAAAABk/a8EYrGYdL-k/s320/whywastegoodtechnology.jpg" style="cursor: pointer; float: left; height: 320px; margin: 0pt 10px 10px 0pt; width: 252px;" /&gt;&lt;/a&gt;Ok, estimados luego de una pausa debida a contratiempos con terremotos y otras tragedias de por medio(como entrar a clases y tener que trabajar)  he vuelto.&lt;br /&gt;&lt;br /&gt;En este post veremos el esqueleto que nos entrega Visual Studio cuando creamos un proyecto de tipo &lt;span style="font-weight: bold;"&gt;"Windows Game (3.1)". &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primero, veremos que carpetas y archivos crea:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_taRRRvHtCPo/S7K9LDCWPRI/AAAAAAAAABE/m0mQdEnoaco/s1600/proyectoenblanco.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5454630096190455058" src="http://3.bp.blogspot.com/_taRRRvHtCPo/S7K9LDCWPRI/AAAAAAAAABE/m0mQdEnoaco/s400/proyectoenblanco.PNG" style="cursor: pointer; display: block; height: 215px; margin: 0px auto 10px; text-align: center; width: 242px;" /&gt;&lt;/a&gt;Bien pues, aquí tenemos, sin haber escrito una sola línea de código, solo indicando el tipo de proyecto que deseamos crear, esta estructura.&lt;br /&gt;&lt;br /&gt;Tenemos en References, entre otras, las referencias a las dlls de XNA&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Microsoft.Xna.Framework&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Microsoft.Xna.Framework.Game&lt;/span&gt;&lt;br /&gt;Son los espacios de nombre esenciales de XNA, déjenlas tal cual por ahora.&lt;br /&gt;&lt;br /&gt;Luego tenemos la carpeta content donde tenemos las dlls que refieren a los &lt;span style="font-weight: bold;"&gt;Pipelines&lt;/span&gt;, que estudiaremos mas adelante pero por lo pronto podemos decir que son los que nos permiten manejar distintos tipos de contenido que podremos agregar a esta carpeta.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_taRRRvHtCPo/S7K-n_JTgcI/AAAAAAAAABM/2uSovF1LHV0/s1600/pipelines+de+content.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5454631692873728450" src="http://3.bp.blogspot.com/_taRRRvHtCPo/S7K-n_JTgcI/AAAAAAAAABM/2uSovF1LHV0/s400/pipelines+de+content.PNG" style="cursor: pointer; display: block; height: 133px; margin: 0px auto 10px; text-align: center; width: 388px;" /&gt;&lt;/a&gt;Como podrán suponer por los nombres de las dlls, algunos de estos pipelines nos permitirán operar con audio, video, texturas, etc.&lt;br /&gt;&lt;br /&gt;Luego tenemos el &lt;span style="font-weight: bold;"&gt;Game.Ico&lt;/span&gt; que es el ícono de nuestro programa.&lt;br /&gt;&lt;br /&gt;Y luego tenemos 2 clases que son la médula de nuestro humilde primer proyecto en blanco:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Program.cs&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Game1.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Program.cs es nuestra clase de entrada al juego, lo primero en ejecutarse.&lt;br /&gt;&lt;br /&gt;En su código que incluyo aquí verán en el método &lt;span style="font-weight: bold;"&gt;Main()&lt;/span&gt; que lo único que hace es instanciar la clase &lt;span style="font-weight: bold;"&gt;Game1&lt;/span&gt; y luego ejecuta el método &lt;span style="font-weight: bold;"&gt;Run() &lt;/span&gt;de la clase Game1&lt;span style="font-weight: bold;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; JuegoXNADemo1&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="rem"&gt;/// The main entry point for the application.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (Game1 game = &lt;span class="kwrd"&gt;new&lt;/span&gt; Game1())&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                game.Run();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A continuación el contenido de la clase &lt;span style="font-weight: bold;"&gt;Game1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Audio;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Content;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.GamerServices;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Graphics;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Input;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Media;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Net;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Xna.Framework.Storage;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; JuegoXNADemo1&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Game1 : Microsoft.Xna.Framework.Game&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        GraphicsDeviceManager graphics;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        SpriteBatch spriteBatch;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Game1()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            graphics = &lt;span class="kwrd"&gt;new&lt;/span&gt; GraphicsDeviceManager(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            Content.RootDirectory = &lt;span class="str"&gt;"Content"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Allows the game to perform any initialization it needs to before starting to run.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        &lt;span class="rem"&gt;/// This is where it can query for any required services and load any non-graphic&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        &lt;span class="rem"&gt;/// related content.  Calling base.Initialize will enumerate through any components&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        &lt;span class="rem"&gt;/// and initialize them as well.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Initialize()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your initialization logic here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Initialize();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        &lt;span class="rem"&gt;/// LoadContent will be called once per game and is the place to load&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        &lt;span class="rem"&gt;/// all of your content.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadContent()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;            &lt;span class="rem"&gt;// Create a new SpriteBatch, which can be used to draw textures.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;            spriteBatch = &lt;span class="kwrd"&gt;new&lt;/span&gt; SpriteBatch(GraphicsDevice);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: use this.Content to load your game content here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;        &lt;span class="rem"&gt;/// UnloadContent will be called once per game and is the place to unload&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;        &lt;span class="rem"&gt;/// all content.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UnloadContent()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Unload any non ContentManager content here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Allows the game to run logic such as updating the world,&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;        &lt;span class="rem"&gt;/// checking for collisions, gathering input, and playing audio.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="gameTime"&amp;gt;Provides a snapshot of timing values.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Update(GameTime gameTime)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;            &lt;span class="rem"&gt;// Allows the game to exit&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;.Exit();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;            &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your update logic here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Update(gameTime);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;        &lt;span class="rem"&gt;/// This is called when the game should draw itself.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="gameTime"&amp;gt;Provides a snapshot of timing values.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Draw(GameTime gameTime)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;            GraphicsDevice.Clear(Color.CornflowerBlue);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;            &lt;span class="rem"&gt;// TODO: Add your drawing code here&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Draw(gameTime);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El contenido de la clase &lt;span style="font-weight: bold;"&gt;Game1&lt;/span&gt;, como puede apreciarse, no es tan escueto como el de la clase &lt;span style="font-weight: bold;"&gt;Program&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Si nos abstraemos de detalles podemos ver la clase &lt;span style="font-weight: bold;"&gt;Game1&lt;/span&gt; como lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_taRRRvHtCPo/S7LJmLa4OBI/AAAAAAAAABU/O271DVz8cq4/s1600/VistaGlobalGame1.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5454643756436830226" src="http://1.bp.blogspot.com/_taRRRvHtCPo/S7LJmLa4OBI/AAAAAAAAABU/O271DVz8cq4/s400/VistaGlobalGame1.PNG" style="cursor: pointer; display: block; height: 389px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Primero, &lt;span style="font-weight: bold;"&gt;Game1&lt;/span&gt; es una clase que hereda del espacio de nombres &lt;span style="font-weight: bold;"&gt;Microsoft.Xna.Framework.Game&lt;/span&gt;(El que está en nuestra carpeta de referencias del proyecto).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Game1&lt;/span&gt; (Y todo juego Xna que desarrollemos) tiene, cuando menos, los métodos&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Initialize()&lt;/li&gt;&lt;li&gt;LoadContent()&lt;/li&gt;&lt;li&gt;UnloadContent()&lt;/li&gt;&lt;li&gt;Update(GameTime gameTime)&lt;/li&gt;&lt;li&gt;Draw(GameTime gameTime)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Estos métodos incluidos en Game1 nos dan una idea del ciclo de vida de esta aplicación.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El primer método en ejecutarse es &lt;span style="font-weight: bold;"&gt;Initialize()&lt;/span&gt;, en este debiésemos inicializar nuestros dispositivos y configuraciones.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;LoadContent()&lt;/span&gt; Vuelca el contenido que necesitemos(gráficos, audio, etc) sobre nuestros dispositivos dejándolos disponibles para suutilización en el loop del juego.&lt;/li&gt;&lt;li&gt;El &lt;span style="font-style: italic;"&gt;"loop del juego"&lt;/span&gt; está compuesto por 2 loops asíncronos que son los llevados a cabo por los métodos &lt;span style="font-weight: bold;"&gt;Update(GameTime gameTime) &lt;/span&gt;y &lt;span style="font-weight: bold;"&gt;Draw(GameTime gameTime)&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;En el método Update(GameTime gameTime) debemos incorporar la lógica de nuestro juego, por ejemplo: controlar si un proyectil alcanza a un personaje, calcular la trayectoria y posición de un proyectil, analizar el nivel de vida, calcular puntajes,  etc.&lt;/li&gt;&lt;li&gt;En el método &lt;span style="font-weight: bold;"&gt;Draw(GameTime gameTime)&lt;/span&gt;, en función de la data calculada en el método &lt;span style="font-weight: bold;"&gt;Update(GameTime gameTime) &lt;/span&gt;debiésemos &lt;span style="font-style: italic;"&gt;"dibujar"&lt;/span&gt; el estado actual del juego.&lt;/li&gt;&lt;li&gt;Finalmente, una vez terminado el loop del juego, ya sea por muerte del personaje o cualquier otra condición que determine este punto de término han de descargarse los contenidos en el método &lt;span style="font-weight: bold;"&gt;UnloadContent()&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Este pequeño código entregado por el proyecto en blanco ya inicia el dispositivo gráfico y establece un fondo de pantalla de color azul(CornFlowerBlue para ser mas exacto).&lt;br /&gt;&lt;br /&gt;Si les apetece, pueden ejecutar este proyecto y verán esta ventana.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_taRRRvHtCPo/S7LNIL9QMTI/AAAAAAAAABc/_y6USxFnkzg/s1600/ejecucionproyectoenblanco.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5454647639231443250" src="http://1.bp.blogspot.com/_taRRRvHtCPo/S7LNIL9QMTI/AAAAAAAAABc/_y6USxFnkzg/s400/ejecucionproyectoenblanco.PNG" style="cursor: pointer; display: block; height: 314px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;Estamos de acuerdo, no es nada muy excitante, ni nos consume el vértigo, pero créalo o no, este es su primer juego en Xna.&lt;br /&gt;&lt;br /&gt;Bueno, eso por hoy, ya estaremos de vuelta analizando mas a fondo los métodos de la clase game&lt;br /&gt;&lt;br /&gt;Desde la terremoteada pero aperrada tierra de Chile les saluda.&lt;br /&gt;&lt;br /&gt;Manuel Gatica Holtmann&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;PD: No puedo terminar el post sin agradecer a quien hizo &lt;a href="http://www.manoli.net/csharpformat/"&gt;http://www.manoli.net/csharpformat/&lt;/a&gt; un excelente sitio para taggear codigo para incluir en blogspot y que es el sitio que utilicé en esta ocasión para poder mostrar el código de manera decente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-7942216412452832488?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/7942216412452832488/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/03/desarrollo-de-un-cuego-2d-con-xna-iii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/7942216412452832488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/7942216412452832488'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/03/desarrollo-de-un-cuego-2d-con-xna-iii.html' title='Desarrollo de un cuego 2D con XNA III - Proyecto en blanco'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_taRRRvHtCPo/S7LPOfdPBOI/AAAAAAAAABk/a8EYrGYdL-k/s72-c/whywastegoodtechnology.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-101851675151204415</id><published>2010-02-19T23:56:00.000-03:00</published><updated>2010-02-20T02:38:47.564-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plano cartesiano'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplo'/><category scheme='http://www.blogger.com/atom/ns#' term='videojuegos'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='consola'/><category scheme='http://www.blogger.com/atom/ns#' term='sprite'/><category scheme='http://www.blogger.com/atom/ns#' term='vector2'/><title type='text'>Programación de un juego 2D con XNA II</title><content type='html'>OK. en la entrega anterior les contaba de aquel juego un juego que desarrollé con Pascal en una 8086 hace como mil años.&lt;br /&gt;&lt;br /&gt;Pues bien, para desarrollar aquel juego necesitaba que el bendito helicóptero se moviese por la pantalla.&lt;br /&gt;&lt;br /&gt;mmmhhh...&lt;br /&gt;&lt;br /&gt;Al final descubrí que tanto como "mover" un helicoptero por la pantalla no era posible. Al menos no con las herramientas que disponía(turbo 5 y ascii art). No obstante, era posible conseguir que el usuario se convenciera de estar viendo un helicóptero que se mueve. El truco es el mismo que se usaba en el cine: Superponer imágenes y aprovechar el retardo que tiene el cerebro para procesar las imágenes y dar al final la sensación de movimiento.&lt;br /&gt;&lt;br /&gt;Entonces esto se reducía a:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Limpiar pantalla&lt;/li&gt;&lt;li&gt;Imprimir imagen 1&lt;/li&gt;&lt;li&gt;Dar un retardo en milisegundos&lt;/li&gt;&lt;li&gt;Limpiar pantalla&lt;/li&gt;&lt;li&gt;Imprimir imagen 2&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Dar un retardo en milisegundos&lt;/li&gt;&lt;li&gt;Limpiar pantalla&lt;/li&gt;&lt;li&gt;Imprimir imagen 3&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Dar un retardo en milisegundos&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Así sucesivamente.&lt;br /&gt;&lt;br /&gt;Gracias hermanos Lumiere.&lt;br /&gt;&lt;br /&gt;Para efectos de ejemplo, he escrito en C# una pequeña aplicación de consola que muestra un caracter moviendose de izquierda a derecha y viceversa.&lt;br /&gt;&lt;br /&gt;El código es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_taRRRvHtCPo/S39ab3JS_KI/AAAAAAAAAAs/yOYEg1ndubQ/s1600-h/codigoDemoConsola1.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 682px; height: 655px;" src="http://3.bp.blogspot.com/_taRRRvHtCPo/S39ab3JS_KI/AAAAAAAAAAs/yOYEg1ndubQ/s400/codigoDemoConsola1.bmp" alt="" id="BLOGGER_PHOTO_ID_5440166309592759458" border="0" /&gt;&lt;/a&gt;Ejecutándolo, el resultado es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;object width="647" height="537" class="BLOG_video_class" id="BLOG_video-166a85f598a33752" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v15.nonxt5.googlevideo.com/videoplayback?id%3D166a85f598a33752%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1332968635%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D17819BF47370CF7E8EB58F747A92AD056F7F6233.8467FD6091BCF81D78BD9B7748B7DB87000C6601%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D166a85f598a33752%26offsetms%3D5000%26itag%3Dw160%26sigh%3DdWtsUIqjjVqWyC2IM3rmZXD3Rz8&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="647" height="537" bgcolor="#FFFFFF"flashvars="flvurl=http://v15.nonxt5.googlevideo.com/videoplayback?id%3D166a85f598a33752%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1332968635%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D17819BF47370CF7E8EB58F747A92AD056F7F6233.8467FD6091BCF81D78BD9B7748B7DB87000C6601%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D166a85f598a33752%26offsetms%3D5000%26itag%3Dw160%26sigh%3DdWtsUIqjjVqWyC2IM3rmZXD3Rz8&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;OK, estamos de acuerdo, hasta aquí, parece que de XNA no hemos visto cosa alguna, pero lo cierto es que hay elementos comunes.&lt;br /&gt;&lt;br /&gt;En un juego 2D en XNA no moveremos un caracter, sino un objeto, por ejemplo: una imagen de un helicóptero. A estos objetos los llamaremos Sprites.&lt;br /&gt;&lt;br /&gt;Para mover estos sprites tendremos que establecer su posición dentro de un plano.&lt;br /&gt;&lt;br /&gt;Supongo que recordarán de sus ramos matemáticos el concepto:"Plano Cartesiano".&lt;br /&gt;&lt;br /&gt;Para los que no, un plano cartesiano es un espacio de dos dimensiones donde es posible ubicar un punto con su coordenada en el eje vertical y el eje horizontal(X,Y o columna, fila).&lt;br /&gt;&lt;br /&gt;Entonces, la posición de cada punto está definido por un par de números(par ordenado) .&lt;br /&gt;&lt;br /&gt;A modo de ejmplo, aquí pongo un plano cartesiano:&lt;br /&gt;&lt;img src="file:///C:/DOCUME%7E1/MANUEL%7E1/CONFIG%7E1/Temp/moz-screenshot-2.png" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_taRRRvHtCPo/S39kLUAGa0I/AAAAAAAAAA8/CDtZ1s9j0aY/s1600-h/PlanoCartesiano.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 353px; height: 337px;" src="http://1.bp.blogspot.com/_taRRRvHtCPo/S39kLUAGa0I/AAAAAAAAAA8/CDtZ1s9j0aY/s400/PlanoCartesiano.JPG" alt="" id="BLOGGER_PHOTO_ID_5440177020397316930" border="0" /&gt;&lt;/a&gt;Bien, según el plano del ejemplo, el punto  A estaría en la posición (2,2), el B en la (5,5) y el C en la (4,-4).&lt;br /&gt;&lt;br /&gt;Para ubicar ya sea un caracter o de aquí en adelante un sprite, usaremos tambien un sistema de coordenadas, solo que no estará basado en el centro de nuestra pantalla, sino que nuestro punto (0,0) estará en la esquina superior izquierda de nuestra pantalla. Entonces, mientras mas a la derecha queramos ubicar nuestro Sprite nuestro X del par ordenado debiese incrementarse y mientras mas abajo quisiésemos ubicarlo respecto de la esquina superior izquierda, mas debiésemos incrementar nuestro Y.&lt;br /&gt;&lt;br /&gt;Entonces, si tuviésemos los siguientes puntos.&lt;br /&gt;&lt;br /&gt;A=(0,0)&lt;br /&gt;B=(10,1)&lt;br /&gt;C=(10,5)&lt;br /&gt;&lt;br /&gt;podríamos decir que el punto A está en la esquina superior izquierda, el punto B está 10 posiciones(píxeles en el caso de un sprite, caracteres en el caso de la aplicación de consola) mas a la derecha que el punto A y que el punto C está 4 posiciones mas abajo que el punto B.&lt;br /&gt;&lt;br /&gt;Nuestro tope tanto hacia la derecha como hacia abajo estará determinado por la resolución de pantalla con la que estemos trabajando. Por ejemplo, cuando trabajaba con caracteres en Pascal, tenía un tope de 80 columnas contra 24 filas, pero con XNA podríamos estar trabajando con resoluciones de 320 pixeles en horizontal y 240 pixeles en vertical, o 640*480(640 pixeles horizontal, 480 vertical), 800*600 o los que estimen y sean soportados por la tarjeta de video y monitor.&lt;br /&gt;&lt;br /&gt;Para establecer estas posiciones en XNA usaremos la clase Vector2.&lt;br /&gt;&lt;br /&gt;Así como usé el Thread.Sleep para definir los milisegundos de espera antes de limpiar la pantalla y volver a imprimir, en XNa deberemos definir la cantidad de FPS(Frames Per Second) que indicarán cuantas veces por segundo ha de refescarse el contenido de la pantalla.  A mayor FPS podríamos llegar a tener movimientos mas fluidos y detallados, pero esto podría ir en desmedro del desempeño por lo que habrá que ser cuidadoso en la definición de este parámetro.&lt;br /&gt;&lt;br /&gt;Pero bueno, por hoy ya ha sido bastante.&lt;br /&gt;&lt;br /&gt;Como siempre, saludos y espero que les haya sido útil.&lt;br /&gt;&lt;br /&gt;Manuel Gatica Holtmann.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-101851675151204415?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/101851675151204415/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/02/programacion-de-un-juego-2d-con-xna-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/101851675151204415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/101851675151204415'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/02/programacion-de-un-juego-2d-con-xna-ii.html' title='Programación de un juego 2D con XNA II'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_taRRRvHtCPo/S39ab3JS_KI/AAAAAAAAAAs/yOYEg1ndubQ/s72-c/codigoDemoConsola1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-5097208761914536833</id><published>2010-02-17T01:40:00.000-03:00</published><updated>2010-02-17T02:49:54.996-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adolescencia'/><category scheme='http://www.blogger.com/atom/ns#' term='recuerdos'/><category scheme='http://www.blogger.com/atom/ns#' term='videojuegos'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><category scheme='http://www.blogger.com/atom/ns#' term='2d'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Programación de un juego 2D con XNA I</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/b/b6/IBM_Personal_System2_Model_25.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 296px; height: 317px;" src="http://upload.wikimedia.org/wikipedia/commons/b/b6/IBM_Personal_System2_Model_25.jpg" alt="" border="0" /&gt;&lt;/a&gt;Estando en 2º de enseñanza media, allá por el año 95(UF!) programé un par de juegos en Pascal. Nada muy complejo la verdad, consideremos que la programación de videojuegos no era algo que se enseñara en el colegio, no señor, eran solo aventuras personales en las que un par de amigos tan faltos de vida social y atractivo para el sexo opuesto como yo se embarcaba.&lt;br /&gt;&lt;br /&gt;Ahí nos conseguíamos un IBM 25(el de la foto) y nos quedábamos despues de clase en el liceo con alguna fotocopia que hubiesemos conseguido sobre como crear TPU's con pascal o cosas similares, nuestros borradores de lo que habiamos avanzado en nuestros programas(porque primero programabamos a lapiz pues no habia un pc casa por medio) y nuestros disquetes de 3 y media pulgadas ojalá sin virus.&lt;br /&gt;&lt;br /&gt;Aprovecho para mandarle un par de chuchadas al malnacido que hizo ese virus que colocaba la frase "You are here CPW!"(&lt;a href="http://www.f-secure.com/v-descs/cpw.shtml"&gt;Info del virus&lt;/a&gt;) que me hizo perder tantas horas de pega y disquetes en aquel entonces. Aunque debo admitir que tambien tenía montón de ganas de hacer un virus(El que esté libre de pecado que tire la primera piedra).&lt;br /&gt;&lt;br /&gt;Bueno, el punto es que entre los juegos que programé, uno de los mas divertidos era un shooter de un helicoptero que tenía que exterminar a la horda de extraterrestres(los trulululus... si, ya sé que el nombre era harto penca) que invadía la tierra.&lt;br /&gt;&lt;br /&gt;La estructura del programa era algo así&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Inicio del Juego&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;Inicialización de variables&lt;/span&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;Repetir&lt;/span&gt;&lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;Determinar posiciones&lt;/span&gt;&lt;br /&gt;              Determinar posicion de helicoptero&lt;br /&gt;              Determinar posicion de naves enemigas&lt;br /&gt;              Determinar posicion de misiles del helicoptero&lt;br /&gt;              Determinar posición de misiles enemigos&lt;br /&gt;       &lt;span style="font-weight: bold;"&gt;Determinar Colisiones&lt;/span&gt;&lt;br /&gt;              Determinar si helicoptero choca con nave enemiga&lt;br /&gt;              Determinar si helicoptero es alcanzado por misil&lt;br /&gt;              Determinar si nave enemiga es alcanzada por misil&lt;br /&gt;      &lt;span style="font-weight: bold;"&gt;Dibujar &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;               &lt;/span&gt;Dibujar Fondo&lt;br /&gt;             Dibujar Helicoptero&lt;br /&gt;             Dibujar Naves enemigas&lt;br /&gt;             Dibujar misiles&lt;br /&gt;     &lt;span style="font-weight: bold;"&gt;Lectura de dispositivos&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;             &lt;/span&gt;Determinar si el usuario presionaba:&lt;br /&gt;                  una flecha del teclado&lt;br /&gt;                  la tecla de disparo&lt;br /&gt;                  la tecla de abandono de juego&lt;br /&gt;     &lt;span style="font-weight: bold;"&gt;Determinar nuevas posiciones&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                    &lt;/span&gt;de Helicoptero&lt;br /&gt;                  de naves enemigas&lt;br /&gt;                  de misiles&lt;br /&gt;                  del fondo&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;Hasta que Helicoptero es destruido o usuario presiona tecla de salida&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bueno, lo anterior bien a grandes rasgos. Todo esto muy procedural, con Turbo pascal 5 y nada de orientación a objetos que no la enseñaban(menos mal, despues de todo es una materia un tanto abstracta para chicos de 15 años antes de internet).&lt;br /&gt;&lt;br /&gt;Recuerdo que llegar a esa estructura me habrá tomado al menos unas 2 semanas de cabeceo.&lt;br /&gt;&lt;br /&gt;Afortunadamente la cosa ahora va algo mas simple. Si abres ahora tu XNA studio y creas un nuevo proyecto del tipo Windows Game verás que este tiene una algunas estructuras en común con la que acabo de describir. A saber, cuando creas un proyecto de este tipo XNA crea automáticamente parte del código y en este la siguiente estructura:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_taRRRvHtCPo/S3t80oAourI/AAAAAAAAAAU/lWUk8BvnEYE/s1600-h/estructurageneraldegame1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 214px;" src="http://4.bp.blogspot.com/_taRRRvHtCPo/S3t80oAourI/AAAAAAAAAAU/lWUk8BvnEYE/s320/estructurageneraldegame1.JPG" alt="" id="BLOGGER_PHOTO_ID_5439078218515135154" border="0" /&gt;&lt;/a&gt;Tenemos una clase principal que es Game1(), nuestro juego con todo lo que contiene y en este algunos métodos que se irán ejecutando en el transcurso del juego.&lt;br /&gt;&lt;br /&gt;Tenemos, por ejemplo el Initialize() que es donde debiécemos establecer nuestros parámetros iniciales, el Update() que es donde debiesemos actualizar los valores de nuestras variables y status, asçi com tambien tenemos el método Draw() que es donde debiésemos "dibujar" lo que el usuario verá en este momento.&lt;br /&gt;&lt;br /&gt;A propósito de dibujar. En aquel entonces los computadores a los que tenía acceso no tenían ni la velocidad de procesador que tenemos hoy,(recuerdo que el año 96 en una softel vi el primer computador de 100 MHZ y era caro como una casa... casi me oriné cuando corrieron un DIR de DOS y se demoró menos de un segundo en desplegar la información) ni tarjetas de video especializadas para videojuegos ni nada por el estilo por lo que el proceso de dibujar podía hacerse realmente lento. En mis primeros intentos usé la graph.tpu(una librería de pascal con herramientas para dibujar contenido en pantalla)    y resultó asquerosamente lento por lo que finalmente opté por usar ascii art. Así teniamos un helicoptero mas o menos así:&lt;br /&gt;&lt;br /&gt;          ----+---&lt;br /&gt;    +----/       \&lt;br /&gt;             =====&lt;br /&gt;&lt;br /&gt;Sí, ríanse nomas. Era mejor dibujado, pero ya no me acuerdo de todos los caracteres ascii que usaba(había que aprenderse la tabla ascii de memoria o usar programas que ayudasen, como sidekick... que gran programa aquel). Aún así, esto iba mas allá, en cada ciclo de juego el helicoptero cambiaba con lo que daba la idea de algún grado de animación.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;          ----+----&lt;br /&gt;    +----/       \&lt;br /&gt;             =====&lt;br /&gt;&lt;br /&gt;              --+--&lt;br /&gt;    x----/       \&lt;br /&gt;             =====&lt;br /&gt;&lt;br /&gt;             ---+---&lt;br /&gt;    +----/       \&lt;br /&gt;             =====&lt;br /&gt;&lt;br /&gt;Ja, ahora sí que han de estar riéndose a mandíbula batiente.&lt;br /&gt;&lt;br /&gt;Créase o no, resultaba bastante efectivo.&lt;br /&gt;&lt;br /&gt;Afortunadamente, en XNA no haremos esa bestialidad sino que usaremos otras características que nos permitirán mostrar figuras complejas con una gran facilidad y excelente desempeño.&lt;br /&gt;&lt;br /&gt;Pero eso ya lo veremos en la próxima entrega.&lt;br /&gt;&lt;br /&gt;Como siempre, saludos.&lt;br /&gt;&lt;br /&gt;Manuel Gatica Holtmann&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-5097208761914536833?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/5097208761914536833/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/02/programacion-de-un-juego-2d-con-xna-i.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/5097208761914536833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/5097208761914536833'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/02/programacion-de-un-juego-2d-con-xna-i.html' title='Programación de un juego 2D con XNA I'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_taRRRvHtCPo/S3t80oAourI/AAAAAAAAAAU/lWUk8BvnEYE/s72-c/estructurageneraldegame1.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-5826380873114200349</id><published>2010-01-14T23:19:00.001-03:00</published><updated>2010-01-15T14:29:49.704-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='starter'/><category scheme='http://www.blogger.com/atom/ns#' term='tecnología'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='Technet'/><category scheme='http://www.blogger.com/atom/ns#' term='Gratis'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Viva .NEXT</title><content type='html'>Algo de lo que se jacta la gente que gusta de las aplicaciones Open Source, GNU y gratuitas en general es, precisamente, de esa cualidad de gratuidad.&lt;br /&gt;&lt;br /&gt;Siempre se asocia a Microsoft esa bestia capitalista que destruye el software y blah blah blah blah.&lt;br /&gt;&lt;br /&gt;Sinceramente y pese a que con esto quizás pierda crédito ante todos ess "puristas informáticos" que hablan mal de microsoft(como si dejara de dormir porque un linuxero o un javero no me de pelota), debo decir que las aplicaciones microsoft me gustan. Y no es por una cosa a priori, porque la haya visto en un documental en history channel o algo así, sino que mi cariño por microsoft viene de la empiria.&lt;br /&gt;&lt;br /&gt;Llevo alrededor de 10 años ganando dinero por saber usar herramientas microsoft(Desde instalar Windows, levantar un Active Directory, al desarrollo de aplicaciones de uso gubernamental sobre .NET). Ni Dios me ha provisto de comida como indirectamente lo ha hecho Bill Gates XD.&lt;br /&gt;&lt;br /&gt;Llevo alrededor de 10 años consumiendo los canales de capacitación e información que Microsoft provee. Léase Technet, MSDN, Desarrollador 5 Estrellas, Microsoft Academy, etc. de forma gratuita.&lt;br /&gt;&lt;br /&gt;En estos 10 años he aprendido lo bien que Microsoft hace las cosas. Esto, claro está es un juicio subjetivo, pero nace de la siguiente situación:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;¿Alguien ha tenido alguna vez que configurar Eclipse para usar java, Ejb, Hibernate, MySQL para levantar un sitio con acceso a bases de datos sobre una arquitectura SOA?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;¿Alguien ha tenido que instalar Visual Studio y Sql Server para levantar un sitio con acceso a bese de datos sobre una arquitectura SOA?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Si han visto ambas situaciones:¿Cual de los dos tipos pudo estar trabajando antes de mediodia?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En Microsoft, con un par de Next Next Next... y por si tienes dudas una vueltecita a MSDN, ya estás listo.&lt;br /&gt;&lt;br /&gt;En Java, te descargas un componente, luego el otro...ah! depende de la versión...ah! documentación... claro, podemos ver javahispano o luego podemos ver(por si no está actualizado) el sitio del desarrollador del framework java que usemos(Struts, JBOSS, Hibernate.... etc)... algo falló... chucha... otro dia perdido.&lt;br /&gt;&lt;br /&gt;Debo decir que me gusta la simpleza que Microsoft provee en ese sentido pues me deja el tiempo libre para:PROGRAMAR.&lt;br /&gt;&lt;br /&gt;y si además de esa productividad añadimos que no debo pagar un peso por las herramientas,  o por la actualizadísima y centralizada información, pues ¿Qué mejor?.&lt;br /&gt;&lt;br /&gt;Pues bueno, en el escenario del desarrollo de juegos puedo desarrollar, con un entorno de desarrollo legalmente licenciado sin pagar un solo peso. BUENO Y GRATIS, COMO EL AIRE.&lt;br /&gt;&lt;br /&gt;Para empezar a desarrollar un juego con las herramientas que microsoft provee, claro está, primero debo cumplir con algunos requisitos de hardware y sistema operativo, los que detallo a continuación:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hardware&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cualquier pc actual sirve(PIV o superior) siempre y cuando tenga una tarjeta de video con &lt;span style="font-style: italic; font-weight: bold;"&gt;Shadder 2.0 o superior&lt;/span&gt;, si no tienes, en el mercado se consguen por 35 USD aprox, mas o menos 15 lucas chilenas y ya estás listo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;sistemas Operativos&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Soportados&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;• Windows XP Home Edition&lt;br /&gt;• Windows XP Professional Edition&lt;br /&gt;• Windows XP Media Center Edition&lt;br /&gt;• Windows XP Tablet Edition&lt;br /&gt;• Windows Vista Home Basic Edition&lt;br /&gt;• Windows Vista Home Premium Edition&lt;br /&gt;• Windows Vista Business Edition&lt;br /&gt;• Windows Vista Enterprise Edition&lt;br /&gt;&lt;br /&gt;XP, con Service Pack 2 o superior&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Entorno de desarrollo&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Visual C# Express                     GRATUITO&lt;br /&gt;&lt;/li&gt;&lt;li&gt;XNA  Game Studio Express     GRATUITO&lt;br /&gt;&lt;/li&gt;&lt;li&gt;DirectX 9                                     GRATUITO&lt;/li&gt;&lt;/ol&gt;Las herramientas de desarrollo necesarias son, como ya indiquñe: gratuitas y están disponibles para su descarga en la sección de downloads de Microsoft...Sí, chúpense esa javeros, todito en un solo sitio.&lt;br /&gt;&lt;br /&gt;Hay que dejar en claro, eso si, que esto es gratuito para fines no comerciales. Si quieres, por ejemplo, explotar tu juego con fines de lucro debes pagar una suscripción al club de creadores.&lt;br /&gt;En el FAQ del XNA Creators club posdemos encontrar lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-style: italic;"&gt;&lt;a name="anchor_2_30"&gt;¿Tengo que ser un miembro de XNA Creators Club para publicar mis juegos de Xbox LIVE Community Games?&lt;/a&gt; &lt;/strong&gt;&lt;span style="font-style: italic;"&gt;                                                                   Sí. Deberá disponer de una suscripción a Creators Club para poder crear y publicar juegos para Xbox 360. Puede adquirir una suscripción especial a XNA Creators Club para Xbox 360 mediante el Bazar Xbox LIVE por 99 USD al año (o 49 USD para cuatro meses).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;                         Bueno, mientras estamos desarrollando, en esta etapa inicial no hay que ponerse con nada mas que con las ganas así que aquí van los links para preparar nuestro entorno de desarrollo y par tener alguna noción de que haremos en nuestro próximo post:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://creators.xna.com/es-ES/downloads"&gt;Recursos en general del sitio XNA Creators Club&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=80782277-d584-42d2-8024-893fcd9d3e82"&gt;XNA Game Studio Express&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb200104%28XNAGameStudio.31%29.aspx"&gt;Documentación MSDN sobre XNA &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/express/download/default.aspx"&gt;Visual C# Express Edition&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2da43d38-db71-4c1b-bc6a-9b6652cd92a3&amp;amp;displaylang=en"&gt;DirectX 9 Runtime Web Installer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://creators.xna.com/es-ES/education/gettingstarted/bgintro/chapter1"&gt;Introducción a desarrollador Novato&lt;/a&gt; Webcast en inglés&lt;br /&gt;&lt;br /&gt;Eso por ahora, descarguen, den una ojeada al starter y nos estamos leyendo luego.&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;MAGH&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-5826380873114200349?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/5826380873114200349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/01/viva-next.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/5826380873114200349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/5826380873114200349'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/01/viva-next.html' title='Viva .NEXT'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7541954136311498680.post-3171827472722522050</id><published>2010-01-13T23:48:00.000-03:00</published><updated>2010-01-14T00:10:26.666-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='infancia'/><category scheme='http://www.blogger.com/atom/ns#' term='recuerdos'/><category scheme='http://www.blogger.com/atom/ns#' term='videojuegos'/><category scheme='http://www.blogger.com/atom/ns#' term='xna'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>kick off</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://t1.gstatic.com/images?q=tbn:ekLpdLZxmv--uM%3Ahttp://www.64juegos.com/imagenes/Champions07Juegodefutbolapurogol_974E/ScreenHunter_13Jul.2510.27.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 135px; height: 111px;" src="http://t1.gstatic.com/images?q=tbn:ekLpdLZxmv--uM%3Ahttp://www.64juegos.com/imagenes/Champions07Juegodefutbolapurogol_974E/ScreenHunter_13Jul.2510.27.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nunca fuí muy bueno para el Kick Off.&lt;br /&gt;&lt;br /&gt;A mis primos les duraban mucho mas sus 30 pesos en fichas que a mi jugando este bendito juego de futbol.&lt;br /&gt;&lt;br /&gt;No obstante lo anterior, de pequeño, no siendo muy hábil pa la pelota, el volantín, el trompo y un largo etcétera de juegos que todo niño debiera manejar, la aparición de los juegos de video en mi barrio a principios de los años 80 fue un hecho de importancia casi vital.&lt;br /&gt;&lt;br /&gt;Recuerdo, con apenas 6 años haber estado encaramado en un cajón de bebidas para ver la pantalla del space invaders y luego tratar ser diestro en gálaga y así todos los juegos con los que el bendito dueño del bazar llenaba de niños y jovenes el patio donde tenía puestas las tan novedosas y fantásticamente futuristas máquinas de video.&lt;br /&gt;&lt;br /&gt;Este cariño y gusto por los videojuegos así como los mismos videojuegos, fué evolucionando. al punto que cuando tuve 12 años pedí de regalo un Atari 2600.  Para mi sorpresa me llegó de regalo un computador Atari XE Game System, con su casetera y su pantallita azul, con su basic y ese sonido glorioseo de cuando uno digita en ese teclado.&lt;br /&gt;&lt;br /&gt;Tanto me gustó el asunto que a los 13 años estaba metido en un politécnico estudiando una carrera relacionada con computación y a los 15 hice mi primer humilde y simple jueguito en pascal a punta de ingenio y ascii art.&lt;br /&gt;&lt;br /&gt;Es curioso cuanto puede uno patear sus sueños, así como es curioso que los sueños nunca lo abandonan a uno.&lt;br /&gt;&lt;br /&gt;Hoy, con treinta años, me encuentro terminando mi ingeniería en informática y empezando a preparar mi trabajo proyecto de título que he de presentar a fines del 2010. Este trabajo, no podía ser sino el pelear contra mi molino de viento: &lt;span style="font-weight: bold;"&gt;Desarrollar un juego como dios manda.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y bueno, llevo algunos meses investigando que herramientas hay en el mercado para llevar a cabo esta quijotesca tarea y la verdad es que de todo lo que he visto, XNA, un framework provisto por Microsoft de forma gratuita para el desarrollo de juegos para plataforma PC y XBOX, es lo que mas me ha gustado.&lt;br /&gt;&lt;br /&gt;En este blog y con este Post puntal, doy hoy el Kick Off a mi proyecto de desarrollo de juegos. Espero:&lt;br /&gt;1 - Hacer un juego que me guste&lt;br /&gt;2 - Hacer un juego que a mi hijo le guste&lt;br /&gt;3 - Hacer un juego que a mis amigos le guste&lt;br /&gt;4 - ah... si, tambien hay un fin práctico, dar un examen de título la raja.&lt;br /&gt;&lt;br /&gt;Espero, de aqui a diciembre ir posteando los devenires de este desarrollo, las técnicas, los trucos, los materiales... en fin, todo cuanto pueda servir para que ustedes aprendan junto conmigo.&lt;br /&gt;&lt;br /&gt;Bueno, eso por ahora.&lt;br /&gt;&lt;br /&gt;Estoy con el pecho hinchado mientras estoy descargando el XNA Game Studio 3.1 desde esta&lt;br /&gt;URL&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=80782277-d584-42d2-8024-893fcd9d3e82&amp;amp;displayLang=en"&gt;Xna Game Studio 3.1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Otras herramientas están disponibles en el &lt;a href="http://creators.xna.com/es-ES/downloads"&gt;Sector de descargas del sitio de creadores de XNA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por ahora saludos, ya estaremos en contacto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7541954136311498680-3171827472722522050?l=xnaexplorer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://xnaexplorer.blogspot.com/feeds/3171827472722522050/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://xnaexplorer.blogspot.com/2010/01/kick-off.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/3171827472722522050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7541954136311498680/posts/default/3171827472722522050'/><link rel='alternate' type='text/html' href='http://xnaexplorer.blogspot.com/2010/01/kick-off.html' title='kick off'/><author><name>Manuel Gatica Holtmann (ARK)</name><uri>http://www.blogger.com/profile/13577019696554064355</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_taRRRvHtCPo/S73m7TjXUcI/AAAAAAAAABw/ZfQ3SIFQKCQ/S220/P6290701.JPG'/></author><thr:total>0</thr:total></entry></feed>
