<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://labloguera.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>XNACommunity Blog</title><link>http://labloguera.net/blogs/xnacommunity/default.aspx</link><description>XNAndo todo lo XNAble</description><dc:language /><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Nueva secci&#243;n en XNACommunity</title><link>http://labloguera.net/blogs/xnacommunity/archive/2009/04/05/nueva-secci-n-en-xnacommunity.aspx</link><pubDate>Sun, 05 Apr 2009 16:21:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:70369</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/70369.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=70369</wfw:commentRss><description>&lt;p&gt;Se ha incluido una nueva sección en la web de XNACommunity, se trata de un apartado de juegos completamente terminados que podemos descargar para jugar (&lt;img src="http://labloguera.net/emoticons/emotion-1.gif" alt="Smile" /&gt;) y ver como están construidos.&lt;/p&gt;&lt;p&gt;De momento están disponibles 5 de los 8 juegos finalistas del concurso de videojuegos del DotNetClub de Alicante. &lt;/p&gt;&lt;p&gt;A continuación os dejo unos pantallazos de los juegos:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=64049" width="202" height="158"&gt;&amp;nbsp;&amp;nbsp; &lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=64050" width="202" height="158"&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=64051" width="202" height="158"&gt;&amp;nbsp;&amp;nbsp; &lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=64052" width="202" height="158"&gt;&lt;/p&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=64053" width="202" height="158"&gt;&lt;br&gt;&lt;br&gt;Tienen muy buena pinta ¿no creeis? &lt;img src="http://labloguera.net/emoticons/emotion-1.gif" alt="Smile" /&gt; podeis leer la descripción de cada uno de ellos desde &lt;a href="http://xnacommunity.codeplex.com/Wiki/View.aspx?title=Juegos&amp;amp;referringTitle=Home" target="_blank"&gt;aquí&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;br&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=70369" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Componente barra de progreso en XNA</title><link>http://labloguera.net/blogs/xnacommunity/archive/2009/04/04/componente-barra-de-progreso-en-xna.aspx</link><pubDate>Sat, 04 Apr 2009 18:45:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:70356</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/70356.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=70356</wfw:commentRss><description>&lt;P&gt;José Manuel Silvestre nos ha dejado esta vez en &lt;A class="" href="http://labloguera.net/controlpanel/blogs/www.codeplex.com/xnacommunity" target=_blank&gt;XNACommunity&lt;/A&gt; un componente muy sencillo y fácil de utilizar para nuestros juegos en XNA.&lt;/P&gt;
&lt;P&gt;Se trata de una barra de progreso con la que podemos mostrar la carga de las pantallas, la energía, etc.&lt;/P&gt;
&lt;P&gt;&lt;IMG style="WIDTH:393px;HEIGHT:464px;" height=589 src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=62886" width=783&gt;&lt;/P&gt;
&lt;P&gt;El componente lo tenéis disponible en &lt;A class="" href="http://xnacommunity.codeplex.com/Wiki/View.aspx?title=Componente%20Barra&amp;amp;referringTitle=Home" target=_blank&gt;XNACommunity&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Saludetes &lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;/P&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=70356" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Componente de LCD para XNA</title><link>http://labloguera.net/blogs/xnacommunity/archive/2009/03/14/componente-de-lcd-para-xna.aspx</link><pubDate>Sat, 14 Mar 2009 13:26:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:69861</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/69861.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=69861</wfw:commentRss><description>&lt;P&gt;José Manuel Silvestre nos trae su primer componente hecho en XNA. Se trata de un visor que simula una pantalla de LCD con el que podremos mejorar el aspecto de nuestros juegos.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;En el paquete se incluyen los archivos .PSD (PhotoShop) por si queremos crear nuestros propios tipos de dígitos.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Este es el aspecto del componente:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=61506" width=385 height=315&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Como siempre podeis descargarlo desde &lt;A href="http://xnacommunity.codeplex.com/Wiki/View.aspx?title=Componente%20LCD&amp;amp;referringTitle=Home" target=_blank&gt;XNACommunity&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;/P&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=69861" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Aprende a crear aplicaciones multitouch usando XNA</title><link>http://labloguera.net/blogs/xnacommunity/archive/2009/03/14/aprende-a-crear-aplicaciones-multitouch-usando-xna.aspx</link><pubDate>Sat, 14 Mar 2009 12:47:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:69859</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/69859.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=69859</wfw:commentRss><description>&lt;P&gt;Aquí tenemos un ejemplo de una aplicación para pantallas multitouch desarrollado con XNA.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;IMG title=undefined border=0 alt="" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=59064" width=300 height=300&gt;&lt;/P&gt;
&lt;P&gt;En el desarrollo han colaborado:&amp;nbsp;&lt;SPAN style="FONT-FAMILY:'Segoe UI';" class=Apple-style-span&gt;Juliet R. Moreiro Bockhop,&amp;nbsp;Sergio Escalada Beltrán y&amp;nbsp;Javier Cantón Ferrero.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Podeis bajaros el código como siempre desde el repositorio de &lt;A href="http://xnacommunity.codeplex.com/Wiki/View.aspx?title=Multitouch&amp;amp;referringTitle=Home" target=_blank&gt;XNACommunity&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Bueno lo mejor de esto es verlo en vivo:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OBJECT width=425 height=344&gt;&lt;PARAM NAME="movie" VALUE="http://www.youtube.com/v/_jEK1SXKOUY&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;PARAM NAME="allowFullScreen" VALUE="true"&gt;
&lt;embed src="http://www.youtube.com/v/_jEK1SXKOUY&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/OBJECT&gt;
&lt;P&gt;Tambíen tenemos la suerte de contar con los videos de la presentación de este proyecto &lt;img src="http://labloguera.net/emoticons/emotion-2.gif" alt="Big Smile" /&gt;.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OBJECT width=425 height=344&gt;&lt;PARAM NAME="movie" VALUE="http://www.youtube.com/v/jJoh69Hfq3A&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;PARAM NAME="allowFullScreen" VALUE="true"&gt;&lt;PARAM NAME="allowscriptaccess" VALUE="always"&gt;
&lt;embed src="http://www.youtube.com/v/jJoh69Hfq3A&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/OBJECT&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OBJECT width=425 height=344&gt;&lt;PARAM NAME="movie" VALUE="http://www.youtube.com/v/Z-288xcE2gQ&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;PARAM NAME="allowFullScreen" VALUE="true"&gt;&lt;PARAM NAME="allowscriptaccess" VALUE="always"&gt;
&lt;embed src="http://www.youtube.com/v/Z-288xcE2gQ&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/OBJECT&gt;
&lt;P&gt;Felicidades al equipo por este proyecto tan chulo.&lt;/P&gt;
&lt;P&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;/P&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=69859" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/multitouch/default.aspx">multitouch</category></item><item><title>Sombras omnidireccionales</title><link>http://labloguera.net/blogs/xnacommunity/archive/2009/01/15/sombras-omnidireccionales.aspx</link><pubDate>Thu, 15 Jan 2009 10:04:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:66049</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/66049.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=66049</wfw:commentRss><description>
&lt;p&gt;&lt;span id="ctl00_ctl00_MasterContent_Content_wikiSourceLabel"&gt;En este
ejemplo se muestran sombras omnidireccionales usando 'dual-paraboloid
mapping'.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id="ctl00_ctl00_MasterContent_Content_wikiSourceLabel"&gt; Este tipo de proyección permite representar las profundidades
de todos los puntos de la escena en sólo dos texturas, a diferencia de
otros métodos como las sombras hechas con cubemaps que requieren
actualizar seis superficies, dando como resultado una técnica bastante
óptima aunque con ciertas fallos en la calidad de imagen.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=54856" height="290" width="387"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como siempre video y código:&lt;/p&gt;
&lt;p&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_mliL_qiy_M&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/_mliL_qiy_M&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" height="344" width="425"&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;El código lo podéis bajar de &lt;a href="http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=OmnidirectionalShadows&amp;amp;referringTitle=Home" target="_blank"&gt;XNACommunity&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt; &lt;br&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=66049" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Empieza a crear tu propio Guitar Hero</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/11/12/empieza-a-crear-tu-propio-guitar-hero.aspx</link><pubDate>Tue, 11 Nov 2008 23:16:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:63836</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>1</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/63836.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=63836</wfw:commentRss><description>
&lt;p&gt;¿Ya te has pasado el Guitar Hero mil veces? pues ahora puedes hacerte tu propia versión con ayuda del ejemplo que Javier Cantón ha subido a XNACommunity.&lt;/p&gt;

&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/i4Kv2sGTc1E&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/i4Kv2sGTc1E&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;fs=1" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/object&gt;

&lt;p&gt;&amp;nbsp; &lt;br&gt;&lt;/p&gt;
&lt;p&gt;Podeis descargar el archivo con el proyecto desde la web de XNACommunity.&lt;/p&gt;&lt;p&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt; &lt;br&gt;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=63836" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>ToonShading o como hacer que tu juego parezca un comic</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/10/28/toonshading-o-como-hacer-que-tu-juego-parezca-un-comic.aspx</link><pubDate>Tue, 28 Oct 2008 19:05:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:57788</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/57788.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=57788</wfw:commentRss><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Pues eso mismo, aquí os dejo la info sobre el último ejemplo que Alex Urbano ha hecho para XNACommunity.&lt;/p&gt;&lt;p&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=47267" alt="toonsec.jpg" width="486" height="254"&gt;&lt;/p&gt;

&lt;p&gt;&lt;span id="ctl00_ctl00_MasterContent_TabContentPanel_Content_wikiSourceLabel"&gt;Este
ejemplo muestra una mezcla de técnicas destinadas a pintar una escena
3D simulando que es un dibujo animado hecho a mano. Se mezclan cosas
tales como cel shading usando una textura para modular la intensidad de
la luz, siluetas mediante geometría y detección de las mismas en un
post-proceso, y una simulación de trazos a lápiz en las zonas
sombreadas.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span id="ctl00_ctl00_MasterContent_TabContentPanel_Content_wikiSourceLabel"&gt;&lt;br&gt;&amp;nbsp; &lt;/span&gt;&lt;br&gt;&lt;/p&gt;

&lt;object width="425" height="344"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/cs9xUmu3aMA&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;fs=1"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;embed src="http://www.youtube.com/v/cs9xUmu3aMA&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;fs=1" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/object&gt;


&lt;br&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;El ejemplo lo podeis descargar desde &lt;a href="http://www.codeplex.com/XNACommunity/%20" target="_blank"&gt;XNACommunity&lt;/a&gt; en la sección de ejemplos. &lt;br&gt;&lt;/p&gt;&lt;p&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt; &lt;br&gt;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=57788" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Generaci&#243;n de terrenos usando 3D studio max </title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/10/19/generaci-n-de-terrenos-usando-3d-studio-max.aspx</link><pubDate>Sun, 19 Oct 2008 10:36:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:53124</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/53124.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=53124</wfw:commentRss><description>&lt;p&gt;&lt;br&gt;Bueno la idea de este tutorial es aprender a crear modelos de terrenos para nuestras demos XNA con 3D Studio Max. La generación de Terrains en los videojuegos se suele hacer mediante código durante el tiempo de carga o de forma dinámica durante el juego. Uno de los últimos videojuegos comerciales que presentan un sistema de terrenos muy avanzado es BattleField Bad Company, en el cual los terrenos se modifican en tiempo de juego a causa de explosiones provocadas por las armas de los jugadores. &lt;br&gt;Sin embargo muchas veces no se necesitan sistemas de generación de terrenos tan complejos, por lo que podemos precalcular estos y añadirlos en forma de content directamente a nuestros proyectos. Y esto precisamente es lo que vamos a explicar en este tutorial.&lt;br&gt; &lt;br&gt;&lt;b&gt;Manos a la obra&lt;/b&gt;&lt;br&gt; &lt;br&gt;Bueno lo primero que vamos a necesitar será una textura para nuestro terreno, está podéis crearla ustedes o buscar alguna por internet, yo para este ejemplo voy a usar esta:&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46555" alt="Landscape.jpg"&gt;&lt;br&gt; &lt;br&gt;Bien lo siguiente que vamos a necesitar es una textura de alturas (heightMap), es decir, una textura con tonalidades que van de blanco a negro y que luego usaremos para establecer las alturas de nuestro terreno. Los pixeles negros estarán a nivel de mar y los pixeles de color blanco serán los picos más altos de nuestro terreno. Posiblemente podáis encontrar también algunos heightMap buscando por internet, pero en mi caso voy a generarlo mediante Photoshop. &lt;br&gt; &lt;br&gt;Bien nos vamos a Photoshop y creamos un nuevo fichero de dimesiones 512x512, ya que nuestro terreno será cuadrado:&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46540" alt="Image1.jpg"&gt;&lt;br&gt; &lt;br&gt;Y luego pintaremos el fondo completamente de negro para que inicialmente todo esté a nivel del mar:&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46541" alt="Image2.jpg"&gt;&lt;br&gt; &lt;br&gt;El siguiente paso será usar la brocha para pintar las zonas de nuestro terreno que estarán sobre el nivel del mar. Seleccionamos la herramienta y configuramos algunas propiedades para que la brocha al pintar genere degradados en los bordes y de esa forma el terreno que generemos esté suavizado.&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46542" alt="Image3.jpg"&gt;&lt;br&gt; &lt;br&gt;Y por último nos ponemos a pintar las alturas, esto es a gusto del consumidor, según lo que necesitéis para vuestro proyecto. Os recomiendo para la mayoría de los casos dibujar una especie de muralla rodeando toda la imagen pero dejando un margen negro, entonces si colocamos una cámara en el centro del terreno nunca veamos el final de este, sino montañas que no nos dejan ver más allá. Yo he dibujado esto XD:&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46556" alt="heightMap.jpg"&gt;&lt;br&gt; &lt;br&gt;Bien ya tenemos las texturas que necesitábamos, ahora nos vamos al 3d Studio Max y lo primero que vamos a hacer es crear un plano en el centro del mundo.  Para ello dentro de la pestaña Create del menú de la derecha y teniendo seleccionada Geometric podremos ver un botón en el que pone Plane.&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46543" alt="Image4.jpg"&gt;&lt;br&gt; &lt;br&gt;Presinamos el botón de plane y manteniendo pulsada la tecla control para que nos salga un plano cuadrado, creamos un plano en el centro del mundo.&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46544" alt="Image5.jpg"&gt;&lt;br&gt; &lt;br&gt;Para asegurarnos que está en el centro, haremos click con el botón derecho del ratón sobre el botón mover del toolbar superior y en la ventana que nos aparecerá colocaremos todas las coordenadas a 0.&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46545" alt="Image6.jpg"&gt;&lt;br&gt; &lt;br&gt;Ahora nos vamos a la pestaña modify y en un cuadro blanco de debajo aparecerá solo plane. Bien más abajo están las propiedades de creación de este plano, las cuales vamos a modificar para darle mayor número de vértices de forma que luego el terreno tenga un aspecto más suavizado. Para ello modificaremos los parámetros length segs y width segs, yo les voy a poner 40 a cada uno pero este valor difiere según el tamaño del terrain y del suavizado que necesitéis, lo óptimo sería tener un vértice para cada pixel de la textura del heigthMap.&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46546" alt="Image7.jpg"&gt;&lt;br&gt; &lt;br&gt;Lo siguiente será irnos a la lista de modificadores y añadirle uno a nuestro plano llamado Displace:&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46547" alt="Image8.jpg"&gt;&lt;br&gt; &lt;br&gt;Luego en sus propiedades nos iremos a Map y le aplicaremos el heigthMap que hemos generado con el photoshop.&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46548" alt="Image9.jpg"&gt;&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46549" alt="Image10.jpg"&gt;&lt;br&gt; &lt;br&gt;Y por último para apreciar las alturas de nuestro heightMap sobre el plano le indicaremos mediante el parámetro Strength cuál será la altura de aquellos pixeles que esté en blanco:&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46550" alt="Image11.jpg"&gt;&lt;br&gt; &lt;br&gt;Bien ya tenemos nuestro terreno generado, solo falta aplicarle la textura. Para ello abrimos el editor de materiales ( la forma más fácil es presionando la tecla ‘M’). Sobre cualquier material por defecto seleccionamos en la pestaña Maps, y le añadimos una textura al canal diffuse.&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46558" alt="Image12.jpg"&gt;&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46552" alt="Image13.jpg"&gt;&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46553" alt="Image14.jpg"&gt;&lt;br&gt; &lt;br&gt;Y para aplicar la textura al plano realizamos los siguientes pasos que se muestran en la imagen (debemos tener el plano seleccionado).&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=46554" alt="Image15.jpg"&gt;&lt;br&gt; &lt;br&gt;Ok, pues aquí termina este tutorial, lo único que nos faltaría sería exportar ya dicho modelo en fbx o en el formato que se quiera. &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt;Created by Javier Cantón Ferrero.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=53124" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Primeros pasos en Inteligencia Artificial</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/10/13/primeros-pasos-en-inteligencia-artificial.aspx</link><pubDate>Mon, 13 Oct 2008 10:58:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:49392</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/49392.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=49392</wfw:commentRss><description>
&lt;p&gt;Hola a tod@s, tenemos un nuevo artículo en XNACommunity, en esta ocasión va sobre inteligencia artificial en los videojuegos, se la ha currado Marc García. Podeis también bajaros el código y leerlo en &lt;a href="http://www.codeplex.com/XNACommunity" target="_blank"&gt;XNACommunity&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;span id="ctl00_ctl00_MasterContent_TabContentPanel_Content_wikiSourceLabel"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br&gt;&lt;/p&gt;

Primeros pasos en Inteligencia Artificial: 
&lt;h1&gt;
Modelos de comportamiento usando máquinas de estados
&lt;/h1&gt; &lt;br&gt;En el mundo de los videojuegos, está muy bien que los enemigos parezca que piensen y actúen en consecuencia a nuestros actos.&lt;br&gt;Básicamente si no lo hicieran, luchar contra un enemigo o contra una palmera no tendría diferencia alguna (los cocos, quizás).&lt;br&gt; &lt;br&gt;En este artículo pretendo explicar qué hace decidir a un enemigo actuar de una manera o de otra, y poner un ejemplo práctico.&lt;br&gt;Mi intención es, que alguien que no sepa nada del tema, después de leer el artículo pueda jugar a un juego y entender porqué ese enemigo viene corriendo hacia mí cuando claramente tengo un bazooka en la mano.&lt;br&gt; &lt;br&gt;&lt;b&gt;CONTENIDO&lt;/b&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Máquinas de Estados&lt;/li&gt;&lt;li&gt;Montando el tinglado&lt;/li&gt;&lt;ul&gt;

&lt;li&gt;Patrullar&lt;/li&gt;&lt;li&gt;Buscar&lt;/li&gt;&lt;li&gt;Seguir&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Conclusiones&lt;/li&gt;&lt;li&gt;Ejemplo&lt;/li&gt;
&lt;/ul&gt; &lt;br&gt; &lt;br&gt;&lt;h2&gt;
Máquinas de Estados
&lt;/h2&gt;Me referiré a ellas como autómatas. Hay de muchos tipos, de estados finitos, infinitos, con transiciones lambda/epsilon etc. etc.&lt;br&gt; &lt;br&gt;La mejor manera de explicar su funcionamiento es con el siguiente diagrama:&lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=45907" alt="fsm1.jpg"&gt;&lt;br&gt;Los autómatas cuentan con términos propios (lenguaje, palabra, estado, ...), pero como eso es más complicado, vamos a lo básico.&lt;br&gt;Simplificando: empezamos en un estado, y cuando se cumple una condición, saltamos a otro estado.&lt;br&gt;Tanto las condiciones como los estados pueden ser abstracciones de cosas más complejas. De hecho, hasta pueden ser tratados como otros autómatas aparte.&lt;br&gt; &lt;br&gt; &lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=45908" alt="fsm2.jpg"&gt;&lt;br&gt;Esto nos puede ayudar a ser organizados y no acabar con tiras y tiras y tiras de papel/hojas de &amp;lt;mi procesador de texto&amp;gt;. Ya sabéis, divide y vencerás.&lt;br&gt; &lt;br&gt; &lt;br&gt;Sabiendo eso, se puede hacer un esquema parecido al siguiente...&lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=45909" alt="fsm3.jpg"&gt;&lt;br&gt;... en el que dejamos externa la parte de inicio/fin. Si además lo llamamos, por ejemplo, 'soldado'... pues supongo que ya se empieza a ver por dónde van los tiros.&lt;br&gt; &lt;br&gt; &lt;br&gt;Y hasta aquí la parte teórica, que no quiere decir ni por asomo que no exista nada más que explicar (je). Simplemente he contado lo básico que creo que es necesario para entenderlo.&lt;br&gt;De todos modos, si alguien siente curiosidad, wikipedia es tu amiga -&amp;gt;&lt;br&gt;   &lt;a href="http://en.wikipedia.org/wiki/Automata_theory" class="externalLink"&gt;http://en.wikipedia.org/wiki/Automata_theory&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br&gt;   &lt;a href="http://en.wikipedia.org/wiki/Finite_state_machine" class="externalLink"&gt;http://en.wikipedia.org/wiki/Finite_state_machine&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br&gt; &lt;br&gt;Pasemos al ejemplo práctico&lt;br&gt; &lt;br&gt;&lt;h2&gt;

Montando el tinglado
&lt;/h2&gt;Para nuestro ejemplo contamos con un par de modelos, a los que asignaremos diferentes comportamientos.&lt;br&gt; &lt;br&gt;Ya que el comportamiento puede variar, creamos una clase base, de la que heredarán el resto.&lt;br&gt;&lt;pre&gt;public class CBehaviourModel
{
	public CBehaviourModel() { }
	public virtual void Update(GameTime gameTime, ref Vector3 position, ref Vector3 direction, ref Vector3 rotation) { }
}
&lt;/pre&gt; &lt;br&gt; &lt;br&gt;El método importante es el &lt;i&gt;Update&lt;/i&gt; (bueno, estando sólo el constructor y un método tampoco queda mucho más).&lt;br&gt;Como alguno de los comportamientos modificará la posición, etc. de su modelo, lo pasamos por referencia en el &lt;i&gt;Update&lt;/i&gt;.&lt;br&gt; &lt;br&gt;Teniendo ya la clase base, podemos crear el resto.&lt;br&gt;El planning es que uno de los modelos estará en modo patrulla, y el otro estará buscándolo. Cuando lo vea, lo seguirá.&lt;br&gt; &lt;br&gt;Hacemos 3 clases entonces: &lt;b&gt;CPatroller&lt;/b&gt;, &lt;b&gt;CStraightSearcher&lt;/b&gt; y &lt;b&gt;CFollower&lt;/b&gt;.&lt;br&gt;Además, hacemos una cuarta &lt;b&gt;CStandStiller&lt;/b&gt;, que no hace nada. Realmente es como la clase base, pero con el nombre adecuado a lo que hace, quedarse quieto.&lt;br&gt; &lt;br&gt;Para las explicaciones me centraré en los métodos "importantes", básicamente los &lt;i&gt;Update&lt;/i&gt;. Ya que en los métodos &lt;i&gt;Draw&lt;/i&gt;, &lt;i&gt;Load&lt;/i&gt;, etc. no hay nada excesivamente raro, no los comentaré.&lt;br&gt; &lt;br&gt;&lt;h2&gt;

Patrullar
&lt;/h2&gt;Se trata de una clase muy simple.&lt;br&gt;Contiene un array de &lt;i&gt;N&lt;/i&gt; posiciones, que le indican la ruta a seguir. El punto &lt;i&gt;N&lt;/i&gt; conecta con el primero, de manera que hace un recorrido cerrado.&lt;br&gt; &lt;br&gt;En el Update, va guardando el tiempo pasado entre frame y frame (&lt;i&gt;cumul_time&lt;/i&gt;) para determinar la distancia que avanza.&lt;br&gt;Hace un Lerp entre 2 vectores: pilla vector1, pilla vector2, y con un factor alpha [0..1] devuelve un nuevo vector. Si alpha = 0.5f, devuelve el vector medio entre v1 y v2. Como va de 0 a 1, usamos el tiempo para determinar alpha.&lt;br&gt;Una vez llegado al destino (&lt;i&gt;cumul_time = 1&lt;/i&gt;), se avanzan los corners (si es el final se vuelve al principio).&lt;br&gt;&lt;pre&gt;public override void Update(GameTime gameTime, ref Vector3 position, ref Vector3 direction, ref Vector3 rotation)
{
	// update time: takes X seconds to go from corner to corner
	cumul_time += (float)gameTime.ElapsedGameTime.TotalSeconds / corner_to_corner_time;
 
	if (cumul_time &amp;gt; 1f)    // reached max?
	{
		cumul_time = 0f;
 
		// Change corners
		++actual_corner;
		rotation.Y -= 90f;
		if (actual_corner &amp;gt;= corner_points.Length)
		{
			actual_corner = 0;
			rotation.Y = 0f;
		}
	}
 
	// patrolling
	int next_corner = actual_corner + 1;
	if (next_corner &amp;gt;= corner_points.Length)
		next_corner = 0;
 
	Vector3 from = corner_points[actual_corner];
	Vector3 to = corner_points[next_corner];
	position = Vector3.Lerp(from, to, cumul_time);
}

&lt;/pre&gt; &lt;br&gt; &lt;br&gt;Apunte: siempre suelo decir que a la hora de calcular cualquier cosa en videojuegos hay que tener en cuenta tanto los números como los gráficos.&lt;br&gt;Es decir, que hay que cuadrar los valores de los elementos con los de las meshes que se van a pintar.&lt;br&gt;Por eso cuando se cambia de esquina se actualiza la rotación del modelo. Si no, iría pululando por el escenario sin más (ver el caso de &lt;b&gt;CFollower&lt;/b&gt;).&lt;br&gt; &lt;br&gt; &lt;br&gt;&lt;h2&gt;
Buscar
&lt;/h2&gt;Esta clase está hecha a modo de alarma típica de láser infrarrojo. Tenemos el modelo quieto, que "emite" un rayo; si alguien cruza ese rayo se cambia de comportamiento a &lt;b&gt;CFollower&lt;/b&gt;.&lt;br&gt;Para simular el rayo usaremos dos planos. El segundo se usa para limitar la "altura" del primero, ya que un plano es infinito y por tanto cualquier cosa que estuviera por detrás del modelo se detectaría también.&lt;br&gt; &lt;br&gt;Aunque no se vea, en la escena tenemos&lt;br&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=45910" alt="scene.jpg"&gt;&lt;br&gt;las rayas de colores son los dos planos.&lt;br&gt; &lt;br&gt;En el &lt;i&gt;Update&lt;/i&gt; se hace la comprobación que el objeto esté por delante del plano rojo, y que intersecte con el plano amarillo.&lt;br&gt;&lt;pre&gt;public bool Intersects(BoundingSphere sphere)
{
	intersection_front = false;
	intersection_straight = false;
 
	// check0: front of plane
	if (Front.Intersects(sphere) != PlaneIntersectionType.Front)
	{
		return false;
	}
 
	intersection_front = true;
 
	// check1: straight plane
	if (Straight.Intersects(sphere) == PlaneIntersectionType.Intersecting)
	{
		intersection_straight = true;
	}
 
	return (intersection_front &amp;amp;&amp;amp; intersection_straight);
}

&lt;/pre&gt; &lt;br&gt; &lt;br&gt;&lt;h2&gt;
Seguir
&lt;/h2&gt;Finalmente, esta clase se encarga de seguir una posición con una distancia de seguridad (para no montar un modelo con otro).&lt;br&gt;Cada &lt;i&gt;Update&lt;/i&gt; se ha de actualizar la posición a seguir, por lo que se hace desde el &lt;i&gt;Update&lt;/i&gt; del juego principal.&lt;br&gt;&lt;pre&gt;if (dino.Behaviour is CFollower)
{
	((CFollower)dino.Behaviour).TargetPosition = sword.Position;
}
 
dino.Update(gameTime);
sword.Update(gameTime);
&lt;/pre&gt; &lt;br&gt; &lt;br&gt;y en el update correspondiente, se calcula la nueva posición&lt;br&gt;&lt;pre&gt;public override void Update(GameTime gameTime, ref Vector3 position, ref Vector3 direction, ref Vector3 rotation)
{
	Vector3 dir = target_position - position;
	dir = dir - dir / 10; // security distance = 1/10;
 
	position += dir * (float)gameTime.ElapsedGameTime.TotalSeconds;
	dir.Normalize();
	direction = dir;
}

&lt;/pre&gt; &lt;br&gt; &lt;br&gt;En este modelo no se actualiza la rotación del modelo, por lo que se ve "mal" cuando se mueve. Este es el ejemplo que comentaba en la clase &lt;b&gt;CPatroller&lt;/b&gt;.&lt;br&gt; &lt;br&gt;&lt;h2&gt;
Conclusiones
&lt;/h2&gt;&lt;p&gt;Con todo lo anterior se puede conseguir lo que se ve en el ejemplo, que es muy básico.&lt;br&gt;Con algo más de complejidad, se podría hacer, por ejemplo, que si un elemento se escapa a más de una distancia &lt;i&gt;X&lt;/i&gt;, el otro elemento cambia a &lt;b&gt;CSearcher&lt;/b&gt;.&lt;br&gt;También &lt;b&gt;CStraightSearcher&lt;/b&gt; se podría convertir en &lt;b&gt;CSearcher&lt;/b&gt;, haciendo no sólo una línea recta, si no que vaya rotando en un arco para ampliar la búsqueda, añadir un cono de visión, etc.&lt;br&gt; &lt;br&gt;Los controles básicos son &lt;i&gt;WASDZX + mouse&lt;/i&gt; para la cámara, &lt;i&gt;espacio&lt;/i&gt; para iniciar el comportamiento de patrulla, &lt;i&gt;R&lt;/i&gt; para resetear y &lt;i&gt;ESC&lt;/i&gt; para salir.&lt;br&gt; &lt;br&gt;Finalmente, espero que este artículo haya ayudado a alguien a entender, o entender mejor, como funcionan algunas de las Inteligencias Artificiales en los videojuegos.&lt;br&gt;Hay que tener en cuenta que las máquinas de estados se usaban hace mil millones de años, y que los juegos next-gen usan algoritmos muchos más complejos.&lt;br&gt;Pero bueno, que de algún lado ha venido todo.&lt;br&gt; &lt;br&gt;Lo dicho, que espero que haya sido útil.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt; &lt;br&gt;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=49392" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Nuevos recursos en XNACommunity</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/09/24/nuevos-recursos-en-xnacommunity.aspx</link><pubDate>Wed, 24 Sep 2008 18:59:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:39865</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/39865.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=39865</wfw:commentRss><description>&lt;p&gt;Tenemos nuevos recursos en esta nuestra comunidad de XNA.&lt;/p&gt;&lt;p&gt;Concretamente es un componente de menú para añadir a nuestros videojuegos y además un artículo en el que se explica como se ha hecho.&lt;/p&gt;&lt;p&gt;Por poner algo más el autor es &lt;a href="http://labloguera.net/blogs/csharp"&gt;César Reneses&lt;/a&gt; que por una vez se ha dejado la vaguería en el cajón y se ha puesto a escribir &lt;img src="http://labloguera.net/emoticons/emotion-2.gif" alt="Big Smile" /&gt;&lt;/p&gt;&lt;p&gt;La dirección del componente es &lt;a href="http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=Componente%20Menu&amp;amp;referringTitle=Home" target="_blank"&gt;esta&lt;/a&gt;, y la dirección del artículo &lt;a href="http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=menu&amp;amp;referringTitle=Home" target="_blank"&gt;aquí&lt;/a&gt;. &lt;br&gt;&lt;/p&gt;&lt;p&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt; &lt;br&gt;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=39865" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Actualizaci&#243;n del componente Skydome</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/09/14/actualizaci-n-del-componente-skydome.aspx</link><pubDate>Sun, 14 Sep 2008 18:42:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:33284</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/33284.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=33284</wfw:commentRss><description>&lt;p&gt;Pues eso, que Alex Urbano ha actualizado su componente que permite añadir un &lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;skydome con efecto de atmospheric scattering y transición día/noche. En esta actualización se han añadido &lt;/span&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;sencillas nubes generadas con Perlin Noise en la GPU.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;El enlace &lt;a href="http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=Componente%20Scatter&amp;amp;referringTitle=Home" target="_blank"&gt;aquí &lt;/a&gt;&lt;/p&gt;&lt;p&gt;Saludetes &lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt; &lt;br&gt;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=33284" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>XNA y Windows Forms</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/09/07/xna-y-windows-forms.aspx</link><pubDate>Sun, 07 Sep 2008 10:55:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:27392</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/27392.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=27392</wfw:commentRss><description>&lt;p&gt;Ya tenemos un nuevo tutorial en XNACommunity gentileza de Javier Cantón &lt;img src="http://labloguera.net/emoticons/emotion-2.gif" alt="Big Smile" /&gt;.&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;En
este tutorial aprenderemos a crear aplicaciones Windows Forms que usen
XNA a las que podríamos catalogar como aplicaciones “híbridas”. Este
tipo de aplicaciones se están volviendo cada vez más y más común en el
mundo de la informática.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;Empezaremos comentando que el framework de
XNA no viene preparado para que se pueda usar junto con Windows Forms,
ya que el graphicsDeviceManager que es el que se encarga de crear la
ventana sobre la que pinta XNA y de inicializar el device no nos
permite especificar el handle de la superficie sobre la que queremos
pintar. Tenemos la opción inicializar nosotros a mano nuestro device,
pero estaríamos perdiendo gran parte de la funcionalidad que nos aporta
el graphicsDeviceManager, como puede ser el ContentManager. En la
página de ejemplos de Microsoft http://creators.xna.com podemos
encontrar dos ejemplos en los que utilizan Windows Forms junto con XNA.
En el primero llamado WindowsForms Series 1: Graphics Device podemos
aprender a crear el device a mano y a poder usarlo para pintar un
triangulo:&lt;/span&gt;&lt;/p&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="margin-bottom:12pt;text-align:justify;"&gt;&lt;span style="font-size:12pt;"&gt;&lt;span&gt;&lt;/span&gt;&lt;a href="http://labloguera.net/photos/csharp/picture27379.aspx" target="_blank"&gt;&lt;img src="http://labloguera.net/photos/csharp/images/27379/640x480.aspx" border="0" height="401" width="535"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:12pt;text-align:justify;"&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;El
problema que nos encontramos con este ejemplo es que hemos perdido con
ContentManager (no podemos cargar contenido como texturas, modelos,
sonidos, etc usando los contentloaders de XNA) y por lo tanto tenemos
que crear ese triangulo a mano. Esto nos llevaría a desaprovechar gran
parte del Framework de XNA. Sin embargo en el siguiente ejemplo
WinForms Serie 2: Content Loading que proponen en dicha web podemos ver
como cargan un FBX con textura:&lt;/span&gt; &lt;br&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom:12pt;text-align:justify;"&gt;&lt;a href="http://labloguera.net/photos/csharp/picture27383.aspx" target="_blank"&gt;&lt;img src="http://labloguera.net/photos/csharp/images/27383/640x477.aspx" border="0" height="396" width="532"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:12pt;text-align:justify;"&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;Y
si nos vemos el código de dicho ejemplo es mucho más extenso que el del
anterior ya que han creado se crean sus propias clases encargadas de
hacer unos de ContentBuilder. ¿Y esto en qué consiste?, pues en coger
todos los ficheros de content que hay en nuestro proyecto, usar el
loader adecuado para compilarlo y generar los ficheros xnb en el
directorio de trabajo de nuestra solución.&lt;br&gt; &lt;br&gt;Personalmente tras
ver estas dos propuestas no me convenció ninguna de las dos, ya que en
la primera desperdicias el framework y para eso usas directamente
DirectX, y en la segunda en la implementación que haces uso del
ContentBuilder me parece muy engorroso. Tras investigar un poco
encontré una solución parcialmente buena, su principal característica
es que es bastante sencilla de implementar y puedes seguir usando el
ContentManager por defecto.&lt;br&gt; &lt;br&gt;Pongámonos manos a la obra para
explicar cómo sería este nuevo método, bien lo primero que tenemos que
hacer es crear un nuevo proyecto XNA, el cual si lo ejecutamos pues ya
nos creará una ventana en donde pintará con XNA. Pero nosotros no
queremos pintar en esa ventana, nosotros queremos crear por ejemplo un
editor en donde lo que necesitamos es que XNA pinte sobre un panel de
nuestra ventana. Por ello lo primero que vamos a hacer es añadir un
formulario a nuestra solución y como una imagen vale más que mil
palabras:&lt;/span&gt; &lt;br&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom:12pt;text-align:justify;"&gt;&lt;span style="font-size:12pt;"&gt;
&lt;span&gt;
 
&lt;/span&gt;&lt;a href="http://labloguera.net/photos/csharp/picture27384.aspx" target="_blank"&gt;&lt;img src="http://labloguera.net/photos/csharp/images/27384/444x462.aspx" border="0" height="341" width="328"&gt;&lt;/a&gt;&lt;br&gt;
&lt;span&gt;
 
&lt;/span&gt;&lt;a href="http://labloguera.net/photos/csharp/picture27385.aspx" target="_blank"&gt;&lt;img src="http://labloguera.net/photos/csharp/images/27385/640x405.aspx" border="0" height="320" width="506"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:12pt;text-align:justify;"&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;Y
ahora le añadiremos el aspecto de un pequeño editor con un menuStrip,
un propertyGrid a la izq y un panel a la derecha separados por un
splitter para luego poder redimensionar el espacio, todo esto quedaría
de la siguiente forma:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:12pt;"&gt;&lt;/span&gt;&lt;span style="font-size:12pt;"&gt;
 
&lt;/span&gt;&lt;span style="font-size:12pt;"&gt;&lt;a href="http://labloguera.net/photos/csharp/picture27386.aspx" target="_blank"&gt;&lt;img src="http://labloguera.net/photos/csharp/images/27386/587x480.aspx" border="0" height="400" width="490"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_wikiSourceLabel"&gt;Una
vez que tenemos esto ahora tenemos que hacer que XNA pinte sobre
nuestro panel. Para ello primero nos dirigiremos al código de nuestro
formulario y le añadiremos la siguiente propiedad:&lt;br&gt; &lt;br&gt;&lt;pre&gt;public Control Panel&lt;br&gt;{&lt;br&gt;   get { return splitContainer.Panel; }&lt;br&gt;}&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;Después de hacer esto lo único que nos hace falta saber
es que existe una forma de cambiar el handle de la superficie sobre la
que pinta el device de XNA, y esta es:&lt;br&gt; &lt;br&gt;&lt;pre&gt;GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;Propiedad que intersectaremos justo cuando la cuando el
Graphics esté preparando los parámetros para crear el device. Los
cambios que vamos a realizar a continuación serán sobre el fichero
program.cs y sobre el game.cs. &lt;br&gt; &lt;br&gt;Empecemos por el program:&lt;br&gt; &lt;br&gt;&lt;pre&gt;    static class Program&lt;br&gt;    {&lt;br&gt;        static Game1 game;&lt;br&gt; &lt;br&gt;        [STAThread]&lt;br&gt;        static void Main(string[] args)&lt;br&gt;        {&lt;br&gt;            Main form = new Main();&lt;br&gt;            form.Disposed += new EventHandler(form_Disposed);&lt;br&gt;            using (game = new Game1(form))&lt;br&gt;            {&lt;br&gt;                form.Show();&lt;br&gt;                form.TopMost = true;&lt;br&gt;                game.Run();&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt; &lt;br&gt;        static void form_Disposed(object sender, EventArgs e)&lt;br&gt;        {&lt;br&gt;            game.Exit();&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;Como se puede ver hemos creado una variable static de
tipo Game1, y luego dentro del Main hemos inicializado nuestro
formulario. Hemos suscrito un método al enveto Disposed de nuestro
formulario ya que vamos a dejar que Game lleve el thread de nuestra
aplicación mediante el Game.Run () y por lo tanto tendremos que
avisarle de que queremos salir de esta cuando el usuario cierre el
formulario.&lt;br&gt; &lt;br&gt;Luego hemos creado una instancia de nuestra clase
Game1 a la que como véis se le pasa el formulario como parámetro, hemos
mostrado el formulario, activado la opción TopMost de este y llamado a
Game.Run(). La pregunta que todos os podréis hacer aquí es porque hemos
activado la opción TopMost, vayamos a explicar esto antes de continuar.
El graphicsDeviceManager creará una ventana por defecto al arrancar
pero no es esta sobre la que queremos que pinte pero sin embargo dicha
ventana se creará y podrán verse las dos ventanas abiertas en nuestra
pantalla, para disimular esto vamos a hacer un pequeño truco que
consistirá en decirle a nuestro formulario que se cree en pantalla por
encima de todas las ventanas de forma que la ventana por defecto
quedará escondida detrás de la nuestra, en ese momento ya le habremos
cambiado a XNA el handle sobre el que debe pintar y por lo tanto
pintará sobre el panel de nuestro formulario. Y como no existe forma de
decirle a el graphicsDeviceManager que no cree su ventana por defecto
pues una vez que esta reciba el foco del sistema la pondremos invisible
mediante mediante la propiedad Visible y restauraremos la propiedad
TopMost de nuestro formulario a false. &lt;br&gt; &lt;br&gt;Si no hacéis este
pequeño truco se notará un pequeño parpadeo al arrancar la aplicación
que consistirá en la ventana de XNA que se crea y desaparece
rápidamente, por este motivo cuando hable de esta solución la califiqué
como parcialmente buena pero es la única pega.&lt;br&gt; &lt;br&gt;Bueno pues una
vez que lo tenemos todo claro solo queda escribir código en Game. Para
empezar necesitamos un atributo del tipo de nuestro formulario, que
inicializaremos en nuestro constructor:&lt;br&gt; &lt;br&gt;&lt;pre&gt;Main form;&lt;br&gt;public Game1(Main form)&lt;br&gt;{&lt;br&gt;   this.form = form;&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;Una vez que tenemos esto tenemos que realizar tres tareas importantes:&lt;br&gt;-	Cambiar el handle sobre el que pintará XNA.&lt;br&gt;-	Cuando la ventana por defecto reciba el foco hacerla invisible y cambiar la propiedad TopMost de nuestro formulario.&lt;br&gt;-
Y adaptar el device y el aspectRatio de la cámara cada vez que el
tamaño del panel del formulario cambia, para no perder las proporciones.&lt;br&gt; &lt;br&gt;&lt;b&gt;Cambiar el handle sobre el que pintará XNA&lt;/b&gt;&lt;br&gt; &lt;br&gt;La constructor de Game la añadimos la siguiente línea para suscribirnos al evento de preparación de parámetros del device:&lt;br&gt; &lt;br&gt;&lt;pre&gt;graphics.PreparingDeviceSettings += new EventHandler&amp;lt;PreparingDeviceSettingsEventArgs&amp;gt;(graphics_PreparingDeviceSettings);&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;Luego dentro del método cambiamos el handle sobre el que el device pintará:&lt;br&gt; &lt;br&gt;&lt;pre&gt;void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)&lt;br&gt;{&lt;br&gt;    e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = form.Panel.Handle;&lt;br&gt;}&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;&lt;b&gt;Cuando la ventana por defecto reciba el foco hacerla invisible y cambiar la propiedad TopMost de nuestro formulario&lt;/b&gt;&lt;br&gt; &lt;br&gt;En el constructor escribiremos lo siguiente para obtener el puntero a la ventana que XNA crea por defecto:&lt;br&gt; &lt;br&gt;&lt;pre&gt;Form xnaWindow = (Form)Control.FromHandle((this.Window.Handle));&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;Y después nos suscribiremos al método GotFocus un
método que se encargará de poner la ventana invisible y de volver a
cambiar la propidad TopMost de nuestro formulario:&lt;br&gt; &lt;br&gt;&lt;pre&gt;xnaWindow.GotFocus += new EventHandler(xnaWindow_GotFocus);&lt;br&gt;void xnaWindow_GotFocus(object sender, EventArgs e)&lt;br&gt;{&lt;br&gt;    ((Form)sender).Visible = false;&lt;br&gt;    form.TopMost = false;&lt;br&gt;}&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;&lt;b&gt;Y adaptar el device y el aspectRatio de la cámara
cada vez que el tamaño del panel del formulario cambia, para no perder
las proporciones&lt;/b&gt;&lt;br&gt; &lt;br&gt;En el constructor añadimos también la
suscripción al evento Resize del panel, para después cambiar las
propiedades de tamaño del device y las del aspectRatio de la cámara:&lt;br&gt; &lt;br&gt;&lt;pre&gt;form.Panel.Resize += new EventHandler(Panel_Resize);&lt;br&gt;void Panel_Resize(object sender, EventArgs e)&lt;br&gt;{&lt;br&gt;   graphics.PreferredBackBufferWidth = form.Panel.Width;&lt;br&gt;   graphics.PreferredBackBufferHeight = form.Panel.Height;&lt;br&gt;   aspectRatio = (float)form.Panel.Width / form.Panel.Height;&lt;br&gt;   graphics.ApplyChanges();&lt;br&gt;}&lt;br&gt;&lt;/pre&gt; &lt;br&gt; &lt;br&gt;Bien pues ya está todo implementado para hacer uso de
XNA y su ContentManager para crear aplicaciones hibridas junto con
Windows Forms, aquí os dejo un pequeño ejemplo en donde se pone en
práctica todo lo explicado.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:12pt;font-family:'Calibri','sans-serif';"&gt;&lt;a href="http://labloguera.net/photos/csharp/picture27388.aspx" target="_blank"&gt;&lt;img src="http://labloguera.net/photos/csharp/images/27388/640x415.aspx" border="0" height="296" width="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;span&gt;
 
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;El código de ejemplo lo podeis descargar de &lt;a href="http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=XNAEditor&amp;amp;referringTitle=Home" target="_blank"&gt;aquí&lt;/a&gt;. &lt;br&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Saludetes &lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;br&gt;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=27392" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Nuevo Componente: Skydome con atmospheric scattering</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/08/25/nuevo-componente-skydome-con-atmospheric-scattering.aspx</link><pubDate>Mon, 25 Aug 2008 19:24:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:20065</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/20065.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=20065</wfw:commentRss><description>
&lt;p&gt;Aquí tenemos un nuevo componente que permite añadir en tu juego un skydome 
con efecto de atmospheric scattering y transición día/noche.&lt;/p&gt;

&lt;p&gt;Verdaderamente esta muy trabajado y lo mejor que podéis hacer es bajarlo y 
probarlo, Aunque como siempre aquí tenéis unas capturas y un vídeo:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=42059" width="341" height="255"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=XNACommunity&amp;amp;DownloadId=42060" width="342" height="256"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pulsa aquí para ver el &lt;a href="http://www.youtube.com/watch?v=QgMBt7SxZJc" target="_blank"&gt;video&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;El componente está hecho por Alex Urbano y podéis encontrar &lt;a href="http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=Componente%20Scatter&amp;amp;referringTitle=Componentes" target="_blank"&gt;aquí&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=20065" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/noticias/default.aspx">noticias</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Making of Blue Dragon</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/08/20/making-of-blue-dragon.aspx</link><pubDate>Tue, 19 Aug 2008 23:16:00 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:17746</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>1</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/17746.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=17746</wfw:commentRss><description>&lt;P&gt;Bueno la idea de escribir este artículo surgió del foro de XNACommunity, donde se preguntó cómo se podría hacer en XNA una situación parecida a la de las luchas que aparecen en Blue Dragon, donde aparecen los luchadores y a la izquierda una pequeña pantalla que enfoca en primer plano a alguno de estos. Aquí podéis ver una imagen en donde veréis mejor a que me refiero:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://labloguera.net/ControlPanel/Blogs/$BlueDragon17.png"&gt;&lt;/A&gt;&lt;A href="http://labloguera.net/photos/csharp/picture17740.aspx" target=_blank&gt;&lt;IMG src="http://labloguera.net/photos/csharp/images/17740/640x360.aspx" border=0&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;Manos a la obra&lt;/B&gt; &lt;BR&gt;Bien lo primero será tener claro que es lo que queremos hacer, simplemente haremos dos renders de la escena, uno desde una posición cercana a alguno de los luchadores y otra desde un punto de vista más global. Por lo que necesitaremos dos cámaras y dos superficies sobre las que pintar, empezaremos hablando sobre las superficies. &lt;BR&gt;Sobre un renderTarget pintaremos la imagen desde cámara zoom, que será la que recoja un primer plano de alguno de los luchadores, para ello nos creamos un atributo de tipo RenderTarget:&lt;/P&gt;&lt;PRE&gt;RenderTarget2D RT;&lt;/PRE&gt;&lt;BR&gt;Inicializamos el renderTarget dentro de método Initialize, con unos parámetros habituales y con un tamaño de 512 pixeles. &lt;PRE&gt;protected override void Initialize()
{
 base.Initialize();
 
 RT = new RenderTarget2D(GraphicsDevice, 512, 512, 1, SurfaceFormat.Color);
}&lt;/PRE&gt;&lt;BR&gt;Ahora para la otra superficie usaremos directamente el target buffer, por lo que no hace falta nada más. &lt;BR&gt;Ahora necesitamos crear dos cámaras que capten la escena desde cada uno de los puntos de vista que queremos. Para ello crearemos una clase camera dentro de un nuevo fichero camera.cs, este será una cámara muy simple con unos atributos habituales. Para más información mirar directamente el fichero en el ejemplo, nosotros ahora solo le echaremos un vistazo al constructor para conocer sus parámetros: &lt;PRE&gt;public Camera(Vector3 position, Vector3 lookat, float nearPlane, float farPlane, float aspectRatio, float fieldOfView)&lt;/PRE&gt;&lt;BR&gt;Bien una vez que tenemos esto ya podemos crear las dos cámaras que necesitábamos, e inicializarlas con los parámetros correctos: &lt;PRE&gt;Camera camera;
Camera cameraZoom;
 
protected override void Initialize()
{
    base.Initialize();
 
    RT = new RenderTarget2D(GraphicsDevice, 512, 512, 1, SurfaceFormat.Color);
 
    camera = new Camera(new Vector3(0, 20, 50), Vector3.Zero, 1, 10000,
        GraphicsDevice.Viewport.Width / GraphicsDevice.Viewport.Height, MathHelper.PiOver4);
    cameraZoom = new Camera(new Vector3(0, 10, 1), new Vector3(5, 10, 0), 1, 10000, 1, MathHelper.PiOver4);
}&lt;/PRE&gt;&lt;BR&gt;Ok, el siguiente paso será usar la cámara normal para renderizar la escena: &lt;PRE&gt;protected override void Draw(GameTime gameTime)
{
    RenderScene();
 
    base.Draw(gameTime);
}
 
private void RenderScene()
{
    GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.CornflowerBlue, 1, 0);
 
    DrawTerrain(camera);
 
    DrawMD3();
 
    DrawText();
}&lt;/PRE&gt;
&lt;P&gt;&lt;BR&gt;El resultado de nuestra escena en estos momentos es:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://labloguera.net/photos/csharp/picture17742.aspx" target=_blank&gt;&lt;IMG src="http://labloguera.net/photos/csharp/images/17742/612x480.aspx" border=0&gt;&lt;/A&gt;&lt;A href="http://labloguera.net/photos/csharp/picture17742.aspx" target=_blank&gt;&lt;/A&gt;&lt;A href="http://labloguera.net/ControlPanel/Blogs/$Image17.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Bien el siguiente paso será renderizar sobre el rendertarget la escena desde el punto de vista de camerazoom. Para ello crearemos un método llamado DrawCameraZoom, que se encargará de hacer esto:&lt;/P&gt;&lt;PRE&gt;protected override void Draw(GameTime gameTime)
{
    DrawCameraZoom();
 
    RenderScene();
 
    base.Draw(gameTime);
}
 
private void DrawCameraZoom()
{
    GraphicsDevice.SetRenderTarget(0, RT);
 
    GraphicsDevice.Clear(Color.CornflowerBlue);
 
    DrawTerrain(cameraZoom);
 
    models[0].render(GraphicsDevice,
                        getLocalWorld(new Vector3(40, 70, 0), new Vector3(-MathHelper.PiOver2, -MathHelper.PiOver2, 0), 0.1f),
                        cameraZoom.View,
                        cameraZoom.Projection); 
 
    GraphicsDevice.SetRenderTarget(0, null);
}&lt;/PRE&gt;
&lt;P&gt;&lt;BR&gt;Como se puede ver en el código, lo primero que hacemos es configurar el GraphicsDevice para que renderize sobre nuestro renderTarget, después limpiamos la escena y renderizamos esta. Como solo va a aparecer un modelo en pantalla será este el único que dibujemos y por último configuramos otra vez el device para que pinte sobre el target por defecto.&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Bien en este momento ya tenemos dentro de RT.GetTexture() almacenada la siguiente imagen:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://labloguera.net/photos/csharp/picture17743.aspx" target=_blank&gt;&lt;IMG src="http://labloguera.net/photos/csharp/images/17743/300x235.aspx" border=0&gt;&lt;/A&gt;&lt;A href="http://labloguera.net/photos/csharp/picture17743.aspx" target=_blank&gt;&lt;/A&gt;&lt;A href="http://labloguera.net/ControlPanel/Blogs/$Image26.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Que es precisamente con la que vamos a texturizar el plano que vamos a colocar en la escena con forma de pantalla. Por lo que añadiremos un nuevo método DrawPlane() al método RenderScene():&lt;/P&gt;&lt;PRE&gt;private void RenderScene()
{
    GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.CornflowerBlue, 1, 0);
 
    DrawPlane();
 
    DrawTerrain(camera);
 
    DrawMD3();
 
    DrawText();
}&lt;/PRE&gt;&lt;BR&gt;En este método renderizaremos el plano y utilizando basicEffect le aplicaremos la textura de nuestro renderTarget: &lt;PRE&gt;private void DrawPlane()
        {
            foreach (ModelMesh mesh in plane.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.EnableDefaultLighting();
                    effect.Texture = RT.GetTexture();
                    effect.TextureEnabled = true;
                    effect.World = getLocalWorld(new Vector3(-100, 140, 50), new Vector3(MathHelper.PiOver2, MathHelper.Pi / 2.5f, 0), 0.12f);
                    effect.View = camera.View;
                    effect.Projection = camera.Projection;
                }
                mesh.Draw();
            }
        }&lt;/PRE&gt;
&lt;P&gt;&lt;BR&gt;Ahora ya tenemos la escena terminada:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://labloguera.net/photos/csharp/picture17744.aspx" target=_blank&gt;&lt;IMG src="http://labloguera.net/photos/csharp/images/17744/612x480.aspx" border=0&gt;&lt;/A&gt;&lt;A href="http://labloguera.net/ControlPanel/Blogs/$Image37.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;En el juego BlueDragon esta pantalla aparece y desaparece durante las luchas, pero eso ya lo dejo en vuestras manos XD. Espero que os haya ayudado este artículo y el ejemplo en donde se aplica todo lo explicado.&lt;/P&gt;
&lt;P&gt;Bueno, todo este artículo y el código correspondiente lo podéis encontrar en &lt;A href="http://www.codeplex.com/XNACommunity" target=_blank&gt;XNACommunity&lt;/A&gt;. Todo gentileza de Javier Cantón.&lt;/P&gt;
&lt;P&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;/P&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=17746" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item><item><title>Nuevo ejemplo: Metaballs</title><link>http://labloguera.net/blogs/xnacommunity/archive/2008/08/11/nuevo-ejemplo-metaballs.aspx</link><pubDate>Mon, 11 Aug 2008 09:25:12 GMT</pubDate><guid isPermaLink="false">982ae711-7ac7-407a-b99e-5d5a6cc12179:16675</guid><dc:creator>Cesar Reneses</dc:creator><slash:comments>0</slash:comments><comments>http://labloguera.net/blogs/xnacommunity/comments/16675.aspx</comments><wfw:commentRss>http://labloguera.net/blogs/xnacommunity/commentrss.aspx?PostID=16675</wfw:commentRss><description>&lt;p&gt;Este ejemplo muestra un efecto de metaballs (tambi&amp;#233;n conocidas como blobs o isosuperficies) generado como un postproceso. Se pierde algo de sensaci&amp;#243;n de tridimiensionalidad, pero el efecto es muy r&amp;#225;pido.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://labloguera.net/blogs/xnacommunity/WindowsLiveWriter/NuevoejemploMetaballs_A086/image_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="319" alt="image" src="http://labloguera.net/blogs/xnacommunity/WindowsLiveWriter/NuevoejemploMetaballs_A086/image_thumb.png" width="425" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;   &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:67ff90e0-fa58-49ce-8122-0d898cb27f91" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;div id="fa5d38cd-c711-4ded-ab12-44c2eb6157e3" style="margin:0px;padding:0px;display:inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=FQGzr8IVxto" target="_new"&gt;&lt;img src="http://labloguera.net/blogs/xnacommunity/WindowsLiveWriter/NuevoejemploMetaballs_A086/video7c863470dab6.jpg" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;By Alex Urbano, lo podeis encontrar todo &lt;a href="http://www.codeplex.com/XNACommunity/Wiki/View.aspx?title=Blobs&amp;amp;referringTitle=Home" target="_blank"&gt;aqu&amp;#237;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Saludetes&lt;img src="http://labloguera.net/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;/p&gt;&lt;img src="http://labloguera.net/aggbug.aspx?PostID=16675" width="1" height="1"&gt;</description><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/xna/default.aspx">xna</category><category domain="http://labloguera.net/blogs/xnacommunity/archive/tags/XNACommunity/default.aspx">XNACommunity</category></item></channel></rss>