<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Razón Artificial</title>
	
	<link>http://razonartificial.com</link>
	<description>La ciencia y el arte de crear videojuegos</description>
	<lastBuildDate>Sun, 07 Apr 2013 22:10:23 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/RazonArtificial" /><feedburner:info uri="razonartificial" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>RazonArtificial</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>[RAGE] Sistema de Objetos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/MoQDxW1q-60/</link>
		<comments>http://razonartificial.com/2013/01/rage-sistema-de-objetos/#comments</comments>
		<pubDate>Fri, 25 Jan 2013 03:56:13 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RAGE]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Teoría]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2206</guid>
		<description><![CDATA[En RAGE, a diferencia de otras muchas bibliotecas y engines 2D las escenas no contarán con un método Draw(), al menos no por defecto. Todo juego sigue principalmente el siguiente esquema: Es el llamado GameLoop, este esquema es solo un concepto con los componentes más básicos, hay en medio luego siempre hay controles de tiempo, vsync, gestión de pausas, etc. Pero todo se basa en lo mismo actualizar todos los componentes (física, IA, etc), dibujarlos en pantalla según los nuevos datos, procesar los eventos (pulsación de teclas, cierre de una ventana, etc) y vuelta a empezar el ciclo. Esto en muchas bibliotecas se implementa por el medio de escenas, como puedes leer en este artículo. El programador se debe de encargar de mediante tres métodos que se suelen llamar Event(), Update() y Draw() de implementarlos según requiera la escena en cuestión. Hay una problemática común en el método de dibujado. Qué se debe dibujar y que no y en que orden. Qué se debe dibujar En la programación de videojuegos hay una regla de oro: Nunca dibujar nada que no se vaya a ver en pantalla. Esto es debido a que el dibujado de gráficos en pantalla es una de [...]]]></description>
				<content:encoded><![CDATA[<p>En RAGE, a diferencia de otras muchas bibliotecas y engines 2D las escenas no contarán con un método Draw(), al menos no por defecto. Todo juego sigue principalmente el siguiente esquema:</p>
<p><img class="aligncenter size-full wp-image-1773" alt="bucle_simple" src="http://razonartificial.com/wp-content/uploads/2011/09/bucle_simple.png" width="262" height="382" /></p>
<p>Es el llamado GameLoop, este esquema es solo un concepto con los componentes más básicos, hay en medio luego siempre hay controles de tiempo, vsync, gestión de pausas, etc. Pero todo se basa en lo mismo actualizar todos los componentes (física, IA, etc), dibujarlos en pantalla según los nuevos datos, procesar los eventos (pulsación de teclas, cierre de una ventana, etc) y vuelta a empezar el ciclo. Esto en muchas bibliotecas se implementa por el medio de escenas, como puedes leer en <a href="http://razonartificial.com/2010/08/gestionando-escenas-con-pygame/">este artículo</a>.</p>
<p>El programador se debe de encargar de mediante tres métodos que se suelen llamar Event(), Update() y Draw() de implementarlos según requiera la escena en cuestión.</p>
<p>Hay una problemática común en el método de dibujado. Qué se debe dibujar y que no y en que orden.</p>
<h2>Qué se debe dibujar</h2>
<p>En la programación de videojuegos hay una regla de oro:</p>
<blockquote><p>Nunca dibujar nada que no se vaya a ver en pantalla.</p></blockquote>
<p>Esto es debido a que el dibujado de gráficos en pantalla es una de las operaciones más lentas. Imaginemos el siguiente escenario como el mapa de un juego donde el rectángulo rojo es la pantalla.</p>
<p><img class="aligncenter size-full wp-image-404" alt="tutoSDL44" src="http://razonartificial.com/wp-content/uploads/2010/07/tutoSDL44.jpg" width="450" height="302" /></p>
<p>Obviamente el jugador solo está viendo los cuadros azulados ya sea en su totalidad o en parte, los cuadros grises son parte del mapa que no están a la vista y por tanto nunca hay que dibujarlos.</p>
<h2>En qué orden se debe dibujar</h2>
<p>Esto es otra cosa importante tengo mi mapa que contiene una superficie de terreno, un árbol y un héroe.</p>
<p><img class="aligncenter size-full wp-image-2207" alt="prioridad" src="http://razonartificial.com/wp-content/uploads/2013/01/prioridad.png" width="368" height="223" /></p>
<p>En la imagen de la izquierda está claro que primero se debe dibujar los tiles de terreno, luego el sprite que representa al árbol y por último a nuestro héroe. Sin embargo en la de la derecha las prioridades cambian ahora el árbol se debe &#8220;dibujar&#8221; después de nuestro héroe para que de la sensación de que está pasando por detrás.</p>
<p>Manejar todo esto manualmente es un engorro, tienes que montar todo un sistema para detectar si tal gráfico es visible o no y tener cuidado de en que orden dibujarlo. Lo ideal sería un sistema que detectara si un gráfico está o no en pantalla para saber si lo dibuja o no y también que a nuestros gráficos se les pudiera asignar un número Z que representara su &#8220;profundidad&#8221; para alterar fácilmente el orden de dibujado.</p>
<h2>El problema: la estructura de clases de SFML</h2>
<p>SFML tienes en principio 3 tipos de objetos dibujables en pantallas: Sprites, Textos y Figuras (Qué a su vez hay tres tipos Círculos, Rectángulos y figuras convexas). Estos tipos de objeto heredan de dos clases bases: Transformable y Drawable. La primera le da las propiedades de poderse transformar: escalarse, rotarse, moverse, etc. Y la segunda la capacidad de que sea un objeto dibujable en pantalla. Este es el esquema:</p>
<p><img class="aligncenter size-full wp-image-2208" alt="classsf_1_1Transformable" src="http://razonartificial.com/wp-content/uploads/2013/01/classsf_1_1Transformable.png" width="510" height="136" /> <img class="aligncenter size-full wp-image-2209" alt="classsf_1_1Drawable" src="http://razonartificial.com/wp-content/uploads/2013/01/classsf_1_1Drawable.png" width="640" height="136" /></p>
<p>Podemos ver como todas heredan de Transformable y Drawable. El problema viene al que los tres objetos comparten la misma base (heredan de Transformable y Drawable), pero si se les quisiera añadir una propiedad común a todos ellos habría que añadirla por separado ya que no existen entre ellos ninguna relación.</p>
<p>Ahora viene nuestro ejemplo de antes en el que queremos también comprobar que otras cosas dibujables como textos y figuras se deban dibujar y en que orden, pues si son objetos dibujables y transformables igual que los sprites también tenemos que tener en cuenta esto que analizamos antes.</p>
<p>El problema viene que la idea es crea un objeto común llamado ObjectScene del que heredan Sprite, Shape y Text. Esta clase abstracta  herada de Drawable y Transformable así quedaría una relación entre todos ellos a las que se les podría añadir funcionalidades como un orden y la posiblidad de tratarlos como un conjunto. Este sería el esquema resultante:</p>
<p><img class="aligncenter size-full wp-image-2214" alt="diagrama_objetos" src="http://razonartificial.com/wp-content/uploads/2013/01/diagrama_objetos1.png" width="530" height="390" /></p>
<p>Ahora cada vez que queramos añadir una propiedad común a todos los objetos que se dibujan basta con añadirla a la clase SceneObject y actomáticamente todos tendrán esa propiedad, además de tener una clase común que sirve para mediante métodos virtuales representar y dibujar como un todo a objetos de la escena.</p>

<div class="wp_rp_wrap  wp_rp_plain" id="wp_rp_first"><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2013/01/rage-razon-artificial-game-engine/" class="wp_rp_title">[RAGE] Razón Artificial Game Engine</a></li><li ><a href="http://razonartificial.com/2013/01/rage-definiendo-repositorio-y-estructura/" class="wp_rp_title">[RAGE] Definiendo repositorio y estructura</a></li><li ><a href="http://razonartificial.com/2013/01/rage-la-clase-app/" class="wp_rp_title">[RAGE] La clase App</a></li><li ><a href="http://razonartificial.com/2013/01/rage-estructura-basica-del-engine/" class="wp_rp_title">[RAGE] Estructura básica del Engine</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/MoQDxW1q-60" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/rage-sistema-de-objetos/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/rage-sistema-de-objetos/</feedburner:origLink></item>
		<item>
		<title>10 Sitios que todo desarrollador de videojuegos debería conocer</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/ad0oAKPuvfw/</link>
		<comments>http://razonartificial.com/2013/01/10-sitios-que-todo-desarrollador-de-videojuegos-deberia-conocer/#comments</comments>
		<pubDate>Thu, 24 Jan 2013 00:27:43 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Enlaces]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2185</guid>
		<description><![CDATA[Os traigo una recopilación de diez sitios que considero de obligada visita para todo el que se dedique a desarrollar videojuegos. Os traigo un poco de todo y en ningún orden particular. Este es mi top 10 de sitios que visito casi diariamente. 1. GameDev Una de las mayores comunidades de la red sobre desarrollo de videojuegos, en sus foros siempre encontrarás a alguien dispuesto a ayudarte con cualquier tipo de cuestión, hay gente muy experimentada en los foros. En su sección de artículos hay verdaderas joyas que merece la pena ver. Un lugar obligado para los favoritos de cualquier desarrollador de videojuegos. Enlace: http://www.gamedev.net 2. Gamasutra Otra de las más grandes. En Gamasutra puedes encontrar siempre las últimas novedades de la industria y ver que se cuece tanto en las grandes compañías como en el panorama indie. Entres sus artículos también hay grandes obras de arte de obligada lectuta. No se centra solo en la programación sino también en diseño, gráficos, audio, producción y marketing. Enlace: http://www.gamasutra.com 3. GPwiki La idea es simple, crear una gran wiki sobre desarrollo de videojuegos. Hay muchos tutoriales y guías sobre diversos lenguajes de programación todo bien ordenado, seguramente encontrarás cosas muy útiles entre sus [...]]]></description>
				<content:encoded><![CDATA[<p>Os traigo una recopilación de diez sitios que considero de obligada visita para todo el que se dedique a desarrollar videojuegos. Os traigo un poco de todo y en ningún orden particular. Este es mi top 10 de sitios que visito casi diariamente.</p>
<h2>1. GameDev</h2>
<p><img class="aligncenter imageborder size-full wp-image-2187" alt="Gamedev.net logo 300x67" src="http://razonartificial.com/wp-content/uploads/2013/01/Gamedev.net-logo-300x67.jpg" width="300" height="67" /></p>
<p>Una de las mayores comunidades de la red sobre desarrollo de videojuegos, en sus foros siempre encontrarás a alguien dispuesto a ayudarte con cualquier tipo de cuestión, hay gente muy experimentada en los foros. En su sección de artículos hay verdaderas joyas que merece la pena ver. Un lugar obligado para los favoritos de cualquier desarrollador de videojuegos.</p>
<ul>
<li><span style="line-height: 13px;">Enlace: <a href="http://www.gamedev.net">http://www.gamedev.net</a></span></li>
</ul>
<h2>2. Gamasutra</h2>
<p><img class="aligncenter imageborder size-full wp-image-2186" alt="gamasutralogo" src="http://razonartificial.com/wp-content/uploads/2013/01/gamasutralogo.png" width="278" height="80" /></p>
<p>Otra de las más grandes. En Gamasutra puedes encontrar siempre las últimas novedades de la industria y ver que se cuece tanto en las grandes compañías como en el panorama indie. Entres sus artículos también hay grandes obras de arte de obligada lectuta. No se centra solo en la programación sino también en diseño, gráficos, audio, producción y marketing.</p>
<ul>
<li><span style="line-height: 13px;">Enlace: <a href="http://www.gamasutra.com">http://www.gamasutra.com</a></span></li>
</ul>
<h2>3. GPwiki</h2>
<p><img class="aligncenter imageborder size-full wp-image-2189" alt="gpwiki" src="http://razonartificial.com/wp-content/uploads/2013/01/gpwiki.png" width="300" height="80" /></p>
<p>La idea es simple, crear una gran wiki sobre desarrollo de videojuegos. Hay muchos tutoriales y guías sobre diversos lenguajes de programación todo bien ordenado, seguramente encontrarás cosas muy útiles entre sus artículos. También cuenta con un foro con mucha actividad y donde podrás plantear tus dudas y porque no, colaborar tanto en los foros como ampliando la wiki.</p>
<ul>
<li>Enlace:<a href=" http://www.gpwiki.org/"> http://www.gpwiki.org/</a></li>
</ul>
<h2>4. #AltDevBlogADay</h2>
<p><img class="aligncenter imageborder size-full wp-image-2194" alt="altdevblogaday" src="http://razonartificial.com/wp-content/uploads/2013/01/altdevblogaday.jpg" width="275" height="63" /></p>
<p>Una joya de blog con artículos de primerísima calidad. En él escribe mucha gente que se dedica al desarrollo de videojuegos algunos con muchísima experiencia que trabajan en compañías de renombre. En el puede encontrar todo tipo de artículos desde reflexiones generales de la industria hasta grandes artículos de nivel técnico de alguna tecnología específica. Si no lo tienes añádelo ya a tu RSS o tus favoritos.</p>
<ul>
<li>Enlace: <a href="http://www.altdevblogaday.com/">http://www.altdevblogaday.com/</a></li>
</ul>
<h2>5. Stratos</h2>
<p><img class="aligncenter imageborder size-full wp-image-2191" alt="stratos" src="http://razonartificial.com/wp-content/uploads/2013/01/stratos.gif" width="388" height="70" /></p>
<p>El único de la lista en español, ya sabemos que la industria habla inglés. Pero Stratos está aquí porque a mi criterio se lo ha ganado a pulso, una de las mejores comunidades en español por no decir la mejor sobre desarrollo de videojuegos. Sus foros están llenos de gente experimentada dispuesta a echarte un cable (siempre y cuando no quieras hacer un mmorpg definitivo). Además podrás encontrar ofertas de trabajo de la industria.</p>
<ul>
<li>Enlace: <a href="http://stratos-ad.com/">http://stratos-ad.com/</a></li>
</ul>
<h2>6. Gamedev tuts+</h2>
<p><img class="aligncenter imageborder size-full wp-image-2188" alt="gamedevtuts" src="http://razonartificial.com/wp-content/uploads/2013/01/gamedevtuts.png" width="304" height="60" /></p>
<p>Perteneciente a la saga de blogs tut+ que se dedica a ofrecer blogs de tutoriales de varias ramas relacionadas con la informática. Gamedev tuts+ cuenta con muy buenos artículos tanto de programación, como de diseño o arte. El proyecto es relativamente nuevo, pero ya tiene bastante material interesante y se actualiza con frecuencia.</p>
<ul>
<li><span style="line-height: 13px;">Enlace:<a href="http://gamedev.tutsplus.com/"> http://gamedev.tutsplus.com/</a></span></li>
</ul>
<h2>7. DevMag</h2>
<p><img class="aligncenter imageborder size-full wp-image-2195" alt="dev_mag_header" src="http://razonartificial.com/wp-content/uploads/2013/01/dev_mag_header.png" width="438" height="70" /></p>
<p>Revista Sudafricana que cuenta con un gran blog sobre desarrollo de videojuegos. En el blog se puede encontrar todo tipo de artículos tanto de programación como de diseño. A parte los números de la revista también se pueden encontrar. Buenos artículos, buen material.</p>
<ul>
<li><span style="line-height: 13px;">Enlace: <a href="http://devmag.org.za/">http://devmag.org.za/</a></span></li>
</ul>
<h2>8. AiGameDev</h2>
<p><img class="aligncenter imageborder size-full wp-image-2200" alt="aigamedev" src="http://razonartificial.com/wp-content/uploads/2013/01/aigamedev1.png" width="372" height="66" /></p>
<p>Sitio por excelencia donde entrontar artículos sobre inteligencia artificial enfocada a videojuegos, su único inconveniente es que es un sitio de pago, pero tiene muchos artículos muy interesantes de acceso gratuito, merece la pena tenerla en tus favoritos si estás programando inteligencia artificial.</p>
<ul>
<li>Enlace: <a href="http://aigamedev.com/">http://aigamedev.com/</a></li>
</ul>
<h2>9. OpenGameArt</h2>
<p><img class="aligncenter imageborder size-full wp-image-2190" alt="open-game-art" src="http://razonartificial.com/wp-content/uploads/2013/01/open-game-art.jpg" width="392" height="70" /></p>
<p>Una gran idea, una gran comunidad. La idea era un sitio donde publicar y recopilar ordenadamente arte libre para videojuegos, para que todo desarrollador tuviera un sitio donde encontrar gráficos para sus juegos o prototipos, hay mucho contenido y de mucha calidad tando gráficos en 2D como en 3D, incluso música y efectos de sonido.</p>
<ul>
<li><span style="line-height: 13px;">Enlace: <a href="http://opengameart.org/">http://opengameart.org/</a></span></li>
</ul>
<h2>10. 2D Game Art For Programmers</h2>
<p><img class="aligncenter imageborder size-full wp-image-2192" alt="2dgameartforpro" src="http://razonartificial.com/wp-content/uploads/2013/01/2dgameartforpro.jpg" width="299" height="80" /></p>
<p>La salvación de los programadores que como yo somos unos negados para el desarrollo gráfico, en este blog aprenderás toda clase de trucos para desarrollar gráficos prototipos rápidamente aunque no tengas ni idea y tu línea más recta sea un círculo. Complementar con <a href="http://siondream.com/blog/general/2d-character-creation-and-animation-for-dummies/">este artículo</a> de Siondream.</p>
<ul>
<li><span style="line-height: 13px;">Enlace: <a href="http://2dgameartforprogrammers.blogspot.co.uk/">http://2dgameartforprogrammers.blogspot.co.uk/</a></span></li>
</ul>
<p>Seguro que echas de menos alguno y he cometido un sacrilegio al no ponerlo, ¡Adelante! Coméntanoslo en los comentarios.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/08/conceptos-de-diseno-de-videojuegos/" class="wp_rp_title">Conceptos de Diseño de Videojuegos</a></li><li ><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" class="wp_rp_title">Tileset isométrico de gran calidad</a></li><li ><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" class="wp_rp_title">Pack de gráficos para juegos</a></li><li ><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" class="wp_rp_title">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li ><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" class="wp_rp_title">Gráficos para prototipos de juegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/ad0oAKPuvfw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/10-sitios-que-todo-desarrollador-de-videojuegos-deberia-conocer/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/10-sitios-que-todo-desarrollador-de-videojuegos-deberia-conocer/</feedburner:origLink></item>
		<item>
		<title>Crear archivos .ini en C++</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/l8p8pS8cAAE/</link>
		<comments>http://razonartificial.com/2013/01/crear-archivos-ini-en-c/#comments</comments>
		<pubDate>Tue, 22 Jan 2013 15:06:32 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[ini]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2177</guid>
		<description><![CDATA[Una de las cosas necesarios para RAGE es el leer y escribir archivos ini. Parseadores de este tipo de archivos existen muchos como por ejemplo inih. Aunque en Razón Artificial usaremos uno derivado del proyecto GQE que se adapta muy bien a SFML. Generar ficheros ini La cuestión es a la hora de crear estos archivos, generar un ini no he encontrado nada, supongo que por lo trivial y la simpleza que supone ya que no es más que generar un fichero de texto. Por tanto he implementado una clase que se encarga de generar ficheros .ini Definición Implementación Cuidado al crear un fichero sobreescribe otro preexistente, si lo que se quiere es modificar un archivo ini, primero usa un parser para obtener le contenido del fichero y luego generalo de nuevo a partir de los valores obtenidos y los nuevos y/o modificados. por último su tilización no puede se más sencilla. Esto generaría el siguiente fichero llamado prueba.cfg. [window] width=640 height=480 # Activa la pantalla completa fullscreen=0 [Otra] # lalalalala djd=edjie IA en videojuegos &#8211; Persiguiendo y evadiendo ISFML &#8211; Abriendo una ventanaSFML &#8211; Instalación y configuración[BGE] La clase SceneSun Tzu 2.0 &#8211; El Arte de la guerra en [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://razonartificial.com/wp-content/uploads/2013/01/ini_file.png" alt="ini_file" width="146" height="146" class="alignright imageborder size-full wp-image-2179" /></p>
<p>Una de las cosas necesarios para RAGE es el leer y escribir <a href="http://en.wikipedia.org/wiki/INI_file">archivos ini</a>. Parseadores de este tipo de archivos existen muchos como por ejemplo <a href="http://code.google.com/p/inih/">inih</a>. Aunque en Razón Artificial usaremos uno derivado del proyecto<a href="http://code.google.com/p/gqe/"> GQE</a> que se adapta muy bien a SFML.</p>
<h2>Generar ficheros ini</h2>
<p>La cuestión es a la hora de crear estos archivos, generar un ini no he encontrado nada, supongo que por lo trivial y la simpleza que supone ya que no es más que generar un fichero de texto. Por tanto he implementado una clase que se encarga de generar ficheros .ini</p>
<h3>Definición</h3>
<pre class="brush: cpp; title: ; notranslate">
class ConfigCreate
{
public:
	ConfigCreate();

	~ConfigCreate();

	void Open(const std::string&amp; filename);

	void Close();

	void PutSection(const std::string&amp; section);

	void PutValue(const std::string&amp; key, const std::string&amp; value);

	void PutComment(const std::string&amp; comment);

	void PutBlankLine();

private:
	std::ofstream file;

}; // class ConfigCreate
</pre>
<h3>Implementación</h3>
<pre class="brush: cpp; title: ; notranslate">
ConfigCreate::ConfigCreate()
{
}

ConfigCreate::~ConfigCreate()
{
}

void ConfigCreate::Open(const std::string&amp; filename)
{
	file.open(filename);
	file.clear();
}

void ConfigCreate::Close()
{
	file.close();
}

void ConfigCreate::PutSection(const std::string&amp; section)
{
	file &lt;&lt; &quot;[&quot; &lt;&lt; section &lt;&lt; &quot;]&quot; &lt;&lt; std::endl;
}

void ConfigCreate::PutValue(const std::string&amp; key, const std::string&amp; value)
{
	file &lt;&lt; key &lt;&lt; &quot;=&quot; &lt;&lt; value &lt;&lt; std::endl;
}

void ConfigCreate::PutComment(const std::string&amp; comment)
{
	file &lt;&lt; &quot;# &quot; &lt;&lt; comment &lt;&lt; std::endl;
}

void ConfigCreate::PutBlankLine()
{
	file &lt;&lt; std::endl;
}
</pre>
<div class="alert">
<p>Cuidado al crear un fichero sobreescribe otro preexistente, si lo que se quiere es modificar un archivo ini, primero usa un parser para obtener le contenido del fichero y luego generalo de nuevo a partir de los valores obtenidos y los nuevos y/o modificados.
</p></div>
<p>por último su tilización no puede se más sencilla.</p>
<pre class="brush: cpp; title: ; notranslate">
ConfigCreate c;
c.Open(&quot;prueba.cfg&quot;);
c.PutSection(&quot;window&quot;);
c.PutValue(&quot;width&quot;, &quot;640&quot;);
c.PutValue(&quot;height&quot;, &quot;480&quot;);
c.PutComment(&quot;Activa la pantalla completa&quot;);
c.PutValue(&quot;fullscreen&quot;, &quot;0&quot;);
c.PutBlankLine();
c.PutSection(&quot;Otra&quot;);
c.PutComment(&quot;lalalalala&quot;);
c.PutValue(&quot;djd&quot;, &quot;edjie&quot;);
c.Close();
</pre>
<p>Esto generaría el siguiente fichero llamado <strong>prueba.cfg</strong>.</p>
<pre>
[window]
width=640
height=480
# Activa la pantalla completa
fullscreen=0

[Otra]
# lalalalala
djd=edjie
</pre>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li><li ><a href="http://razonartificial.com/2011/04/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/" class="wp_rp_title">Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/l8p8pS8cAAE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/crear-archivos-ini-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/crear-archivos-ini-en-c/</feedburner:origLink></item>
		<item>
		<title>[RAGE] La clase App</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/wx2SipyQ1iI/</link>
		<comments>http://razonartificial.com/2013/01/rage-la-clase-app/#comments</comments>
		<pubDate>Sun, 20 Jan 2013 19:47:01 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RAGE]]></category>
		<category><![CDATA[Planificación]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2100</guid>
		<description><![CDATA[Esta es la clase principal del engine ya que es la encargada de ponerlo en funcionamiento y de cargar los componentes necesarios. La clase App se encarga de lo siguiente: Inicializar y Cerrar la aplicación. Inicializar los componentes necesarios. Crear y gestionar la ventana de la aplicación. Crear y gestionar el log de la aplicación. Vamos a pasar a analizar cada uno de ellos por separado. Inicialización y cierre de la aplicación En algo importante en un sistema como este, se encarga de inicializar el Game Engine, establecer el punto de entrada y por último se encarga de las operaciones de cierre como liberación de memoria y cierre de ficheros. En motores más complejos contendría la reserva y gestión de memoria, pero es algo no necesario en nuestro engine. Inicializar los componentes necesarios RAGE es un software basado en componentes, es decir, varias piezas que se unen para formar un sistema. Hay algunos de estos componentes que se consideran esenciales para el funcionamiento del Engine y son los siguientes. File System Se encarga de definir un sistema de archivos confiables para la aplicación. Sirve para acceder a rutas de recursos y directorios donde guardar archivos. Debe ser independiente de la [...]]]></description>
				<content:encoded><![CDATA[<p>Esta es la clase principal del engine ya que es la encargada de ponerlo en funcionamiento y de cargar los componentes necesarios. La clase App se encarga de lo siguiente:</p>
<ul>
<li>Inicializar y Cerrar la aplicación.</li>
<li>Inicializar los componentes necesarios.</li>
<li>Crear y gestionar la ventana de la aplicación.</li>
<li>Crear y gestionar el log de la aplicación.</li>
</ul>
<p>Vamos a pasar a analizar cada uno de ellos por separado.</p>
<h2>Inicialización y cierre de la aplicación</h2>
<p>En algo importante en un sistema como este, se encarga de inicializar el Game Engine, establecer el punto de entrada y por último se encarga de las operaciones de cierre como liberación de memoria y cierre de ficheros.</p>
<p>En motores más complejos contendría la reserva y gestión de memoria, pero es algo no necesario en nuestro engine.</p>
<h2>Inicializar los componentes necesarios</h2>
<p>RAGE es un software basado en componentes, es decir, varias piezas que se unen para formar un sistema. Hay algunos de estos componentes que se consideran esenciales para el funcionamiento del Engine y son los siguientes.</p>
<h3>File System</h3>
<p>Se encarga de definir un sistema de archivos confiables para la aplicación. Sirve para acceder a rutas de recursos y directorios donde guardar archivos. Debe ser independiente de la plataforma y sencillo de usar.</p>
<p>La idea es poder usar un sistema sencillo que defina rutas relativas al ejecutable de la aplicación.</p>
<h3>Scene Manager</h3>
<p>Se trata de un sistema de escenas. Los juegos están basados en escenas diferentes como una pantalla de inicio, un video de introducción, un menú o una pantalla de puntuaciones. Todo esto es mejor gestionarlo por escenas o estados, en otro artículo hablaré más extendidamente del Scene Manager.</p>
<h3>Asset Manager</h3>
<p>Se encarga de la gestión de recursos. Carga los recursos necesarios buscando en los directorios definidos, evita la carga duplicada de recursos, debe tener varias formas de cargar un recurso.</p>
<h3>Log System</h3>
<p>El sistema de Log me he basado en el principio <a href="http://es.wikipedia.org/wiki/Principio_KISS">KISS</a> (Keep it Simple, Stupid). Así que en lugar de usar logs complicados será un simple <code>ofstream</code> de la STL redirigido a un fichero.</p>
<p>Estos serían los sistemas básicos a inicializar, pero dependen de otros componentes.</p>
<h2>Componentes auxiliares</h2>
<h3>Strings Utils</h3>
<p>Se ha de crear una colección de funciones para el manejo eficiente de cadenas, conversión rápida y eficiente, así como un método de hash para una comparación rápida.</p>
<h3>Executable dir</h3>
<p>Se debe de obtener un método para obtener la ruta del ejecutable que es con la que opera el sistema de ficheros y a través de este el gestor de recursos para la carga de archivos desde una memoria secundaria (discos duros, cds, dvds, etc).</p>
<h3>INI Parser</h3>
<p>El Engine se basará en archivos .ini para su configuración por lo que se necesita poder poder leer este tipo de ficheros así como crearlos si no existen.</p>
<p>Todo esto no es más que componentes básicos que se necesitan desde un principio y no los únicos, se ha hecho un repaso por arriba, en futuros artículos hablaremos de cada uno de ellos en profundidad.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2013/01/rage-estructura-basica-del-engine/" class="wp_rp_title">[RAGE] Estructura básica del Engine</a></li><li ><a href="http://razonartificial.com/2013/01/rage-definiendo-repositorio-y-estructura/" class="wp_rp_title">[RAGE] Definiendo repositorio y estructura</a></li><li ><a href="http://razonartificial.com/2013/01/rage-sistema-de-objetos/" class="wp_rp_title">[RAGE] Sistema de Objetos</a></li><li ><a href="http://razonartificial.com/2013/01/rage-razon-artificial-game-engine/" class="wp_rp_title">[RAGE] Razón Artificial Game Engine</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/wx2SipyQ1iI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/rage-la-clase-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/rage-la-clase-app/</feedburner:origLink></item>
		<item>
		<title>[RAGE] Estructura básica del Engine</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/KMfzt_w0WhM/</link>
		<comments>http://razonartificial.com/2013/01/rage-estructura-basica-del-engine/#comments</comments>
		<pubDate>Sun, 20 Jan 2013 16:00:28 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RAGE]]></category>
		<category><![CDATA[Planificación]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2095</guid>
		<description><![CDATA[Una de las primeras cosas a definir en el engine es la estructura. Barajé varias opciones sobre la forma que le quería dar. Una de ellas era hacer un Game Engine independiente de cualquier biblioteca de terceros, esto es, haciendo una capa de abstracción de otras bibliotecas a usar como SFML o Boost, pero ya que gran parte del proyecto está basado en la biblioteca gráfica SFML decidí que fuera un framework para éste mas que una capa de abstracción. Aún así he decidido que tenga los juegos que se creen con RAGE tengan las menos dependencias posibles y aunque RAGE depende de otras bibliotecas como SFML, Boost, PugiXML y en el futuro es posible que otras los juegos creados con RAGE solo tendrán como dependencia la propia RAGE, SFML y la STL. Lo ideal sería que los juegos solo dependieran de RAGE, pero esto supondría crear toda una capa de abstracción sobre SFML que no es necesaria pues SFML es una biblioteca muy bien diseñada y con clases muy útiles. Así que desde este momento RAGE queda ligado a SFML y no se podría cambiar el &#8220;motor multimedia&#8221; por así decirlo, puesto que si fuera una capa de abstracción [...]]]></description>
				<content:encoded><![CDATA[<p>Una de las primeras cosas a definir en el engine es la estructura. Barajé varias opciones sobre la forma que le quería dar. Una de ellas era hacer un Game Engine independiente de cualquier biblioteca de terceros, esto es, haciendo una capa de abstracción de otras bibliotecas a usar como SFML o Boost, pero ya que gran parte del proyecto está basado en la biblioteca gráfica SFML decidí que fuera un framework para éste mas que una capa de abstracción. Aún así he decidido que tenga los juegos que se creen con RAGE tengan las menos dependencias posibles y aunque RAGE depende de otras bibliotecas como SFML, Boost, PugiXML y en el futuro es posible que otras los juegos creados con RAGE solo tendrán como dependencia la propia RAGE, SFML y la STL.</p>
<p>Lo ideal sería que los juegos solo dependieran de RAGE, pero esto supondría crear toda una capa de abstracción sobre SFML que no es necesaria pues SFML es una biblioteca muy bien diseñada y con clases muy útiles. Así que desde este momento RAGE queda ligado a SFML y no se podría cambiar el &#8220;motor multimedia&#8221; por así decirlo, puesto que si fuera una capa de abstracción en un futuro podríamos definir SDL u otros sin que afectara al Engine.</p>
<h2>Estructura general del sistema</h2>
<p>Una vez decidido el tipo de relación vamos a definir lo que sería RAGE a grandes rasgos y que aporta a SFML.</p>
<p><a href="http://razonartificial.com/wp-content/uploads/2013/01/esquema.png"><img class="aligncenter size-full wp-image-2096" alt="esquema" src="http://razonartificial.com/wp-content/uploads/2013/01/esquema.png" width="615" height="493" /></a></p>
<p>&nbsp;</p>
<p>En el esquema se ve que SFML y Core System aislan al usuario de bibliotecas de terceros y al Sistema Operativo del usuario. En este contexto tenemos que los juegos están formados por escenas que hacen uso de todo lo que tiene SFML más lo añadidos del Core System que son los siguientes:</p>
<ul>
<li><span style="line-height: 13px;"><strong>App</strong> &#8211; Inicialización y cierra de la Aplicación así como la gestión de la ventana del juego.</span></li>
<li><strong>Scene Manager</strong> &#8211; Gestor de escenas.</li>
<li><strong>Strings Utils</strong> &#8211; Varia utilidades para trabajar con cadenas de textos, parseadores de cadenas y hash ID.</li>
<li><strong>Parser INI</strong> &#8211; Parseador de archivos .INI, .cfg, etc.. (Fallo en el gráfico de arriba pone Parser XML cuando es Parser INI).</li>
<li><strong>Parser TMX</strong> &#8211; Parseador para le formato de mapa de <a href="http://www.mapeditor.org/">Tiled</a>.</li>
<li><strong>FileSystem</strong> &#8211; Acceso seguro al sistema de ficheros del SO independiente de la plataforma.</li>
<li><strong>Log System</strong> &#8211; Sistema de Log de la aplicación.</li>
<li><strong>Asset Manager</strong> &#8211; Gestor de recursos.</li>
</ul>
<p>Todo esto es a rasgos generales en próximos artículos iremos explicando cada componente de forma detallada y su función.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2013/01/rage-la-clase-app/" class="wp_rp_title">[RAGE] La clase App</a></li><li ><a href="http://razonartificial.com/2013/01/rage-definiendo-repositorio-y-estructura/" class="wp_rp_title">[RAGE] Definiendo repositorio y estructura</a></li><li ><a href="http://razonartificial.com/2013/01/rage-razon-artificial-game-engine/" class="wp_rp_title">[RAGE] Razón Artificial Game Engine</a></li><li ><a href="http://razonartificial.com/2013/01/rage-sistema-de-objetos/" class="wp_rp_title">[RAGE] Sistema de Objetos</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/KMfzt_w0WhM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/rage-estructura-basica-del-engine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/rage-estructura-basica-del-engine/</feedburner:origLink></item>
		<item>
		<title>[RAGE] Definiendo repositorio y estructura</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/PoNhOx3shqE/</link>
		<comments>http://razonartificial.com/2013/01/rage-definiendo-repositorio-y-estructura/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 12:24:33 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RAGE]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2087</guid>
		<description><![CDATA[Una vez presentado el proyecto es hora de ponerse manos a la obra, lo primero ha sido coger papel y boli y planificar el Engine, los requisitos necesarios así como los componentes que necesitará, en otro post hablaremos de todo esto. Una vez hecho esto se necesitaba definir un repositorio, una licencia y una estructura. Licencia El proyecto será software libre, licenciado bajo la licencia del MIT. La razón es que es un licencia muy poco restrictiva tanto para el que quiera usarlo para software privativo como para el que desee hacer software libre, además de ser una licencia pequeña, clara y concisa. Repositorio He decidido usar como control de versiones a GIT y como repositorio público a GitHub. https://github.com/adrigm/RAGE Estructura Una de las cosas que es importante definir al comenzar un proyecto es su estructura. Lo primero que hay que tener en cuenta es de que tipo de proyecto se trata. RAGE es un Game Engine, es decir un medio para construir videojuegos con él, los videojuegos son programas por tanto la estructura que le conviene a RAGE es de biblioteca. Esta es la estructura de directorios que he decidido usar. &#124;- RAGE/ &#124; &#124;- bin/ &#124;- ejecutable &#124;- [...]]]></description>
				<content:encoded><![CDATA[<p>Una vez presentado el proyecto es hora de ponerse manos a la obra, lo primero ha sido coger papel y boli y planificar el Engine, los requisitos necesarios así como los componentes que necesitará, en otro post hablaremos de todo esto.</p>
<p>Una vez hecho esto se necesitaba definir un repositorio, una licencia y una estructura.</p>
<h2>Licencia</h2>
<p>El proyecto será software libre, licenciado bajo la <a href="http://es.wikipedia.org/wiki/MIT_License">licencia del MIT</a>. La razón es que es un licencia muy poco restrictiva tanto para el que quiera usarlo para software privativo como para el que desee hacer software libre, además de ser una licencia pequeña, clara y concisa.</p>
<h2>Repositorio</h2>
<p>He decidido usar como control de versiones a GIT y como repositorio público a GitHub.</p>
<ul>
<li><a href="https://github.com/adrigm/RAGE">https://github.com/adrigm/RAGE</a></li>
</ul>
<h2>Estructura</h2>
<p>Una de las cosas que es importante definir al comenzar un proyecto es su estructura. Lo primero que hay que tener en cuenta es de que tipo de proyecto se trata. RAGE es un Game Engine, es decir un medio para construir videojuegos con él, los videojuegos son programas por tanto la estructura que le conviene a RAGE es de biblioteca.</p>
<p>Esta es la estructura de directorios que he decidido usar.</p>
<pre>|- RAGE/
    |
    |- bin/
        |- ejecutable
        |- Data/
            |- ... 
    |- builds/
        |- codelite/
        |- vc2010/
        |- ...
    |- extlibs/
        |- headers/
        |- bin/
    |- include/
        |- RAGE/
    |- lib/
        |- Rage.lib / Rage.a
    |- src/
        |- RAGE/
        |- Test/
    |- .gitattributes
    |- .gitignore
    |- license.txt
    |- README.md</pre>
<p>Como vemos en el directorio <strong>bin</strong> van los binarios generados, en nuestro proyecto irá el ejecutable del proyecto Test que es un protecto de prueba que usa el Engine.</p>
<p>En el directorio <strong>builds</strong> van soluciones para diferentes IDE como Visual Studio y Codelite que son los IDE que usaré en principio. Más adelante espero que sean sustituidos por Cmake.</p>
<p>En <strong>include</strong> meteremos todos los archivos de cabecera de nuestra biblioteca.</p>
<p>En <strong>extlibs</strong> meteremos los headers y binarios de otras bibliotecas externas que use el proyecto como SFML, Boost, etc.</p>
<p>En <strong>lib</strong> irá las bibliotecas generadas ya sea .lib, .a, .dll ó .so.</p>
<p>En el directorio <strong>src</strong> tenemos dos carpetas <strong>RAGE</strong> y <strong>Test</strong>. Dentro de <strong>RAGE</strong> irá todo el código fuente del proyecto y en <strong>Test</strong> irá el código fuente de la aplicación de prueba. Todo ello en una estructura de directorios coherente.</p>
<p>Esta será la estructura básica de directorios del Engine, siempre sujeta a cambios.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2013/01/rage-la-clase-app/" class="wp_rp_title">[RAGE] La clase App</a></li><li ><a href="http://razonartificial.com/2013/01/rage-estructura-basica-del-engine/" class="wp_rp_title">[RAGE] Estructura básica del Engine</a></li><li ><a href="http://razonartificial.com/2013/01/rage-razon-artificial-game-engine/" class="wp_rp_title">[RAGE] Razón Artificial Game Engine</a></li><li ><a href="http://razonartificial.com/2013/01/rage-sistema-de-objetos/" class="wp_rp_title">[RAGE] Sistema de Objetos</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/PoNhOx3shqE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/rage-definiendo-repositorio-y-estructura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/rage-definiendo-repositorio-y-estructura/</feedburner:origLink></item>
		<item>
		<title>Entrevista a David Saltares programador en Crytek</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/w69o10YBzWc/</link>
		<comments>http://razonartificial.com/2013/01/entrevista-a-david-saltares-programador-en-crytek/#comments</comments>
		<pubDate>Tue, 15 Jan 2013 20:44:08 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Entrevista]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2075</guid>
		<description><![CDATA[Entrevistamos a David Saltares actualmente trabajando en la compañía Crytek como programador de inteligencia artificial del juego Homefront 2, creador de IberOgre y el blog de desarrollo de videojuegos Sion Dream. Hola David, ¿Qué tal? Buenas. Muy bien, un poco de frío por aquí. ¿Qué tal la vida por Nottingham? Genial, es una ciudad joven con dos universidades y tiene mucha actividad: conciertos, pubs, restaurantes, etc. Siempre hay algo que hacer, lo que compensa un poco el frío. No es Londres pero los precios son considerablemente más bajos, no me quejo. Te fuiste a Londres a hacer un master en desarrollo de videojuegos, ¿Qué tal la experiencia? Fantástica. Las instalaciones eran inmejorables, el laboratorio de videojuegos contaba con decenas de equipos potentes, Xbox y PSPs de desarrollo. Todo en perfecto estado disponible para el alumno fuera de horario de clases. Además, tienen muchos contactos en la Industria del Videojuego y rara era la semana que no había una conferencia: Sony, Turbulenz, Splash Damage, Crytek. Aunque el nivel de programación no es muy alto allí, aprendí muchísimo ya que todo estaba orientado a proyectos. También hice muchos contactos, algo imprescindible. De ahí a trabajar en Crytek, ¿Cómo se consigue que una [...]]]></description>
				<content:encoded><![CDATA[<p>Entrevistamos a David Saltares actualmente trabajando en la compañía <a href="http://www.crytek.com/">Crytek </a>como programador de inteligencia artificial del juego <a href="http://en.wikipedia.org/wiki/Homefront_2">Homefront 2</a>, creador de <a href="http://osl2.uca.es/iberogre/index.php/P%C3%A1gina_Principal">IberOgre</a> y el blog de desarrollo de videojuegos <a href="http://siondream.com/blog/">Sion Dream</a>.</p>
<p><img alt="david" src="http://razonartificial.com/wp-content/uploads/2013/01/david.jpg" width="940" height="514" /></p>
<p><strong>Hola David, ¿Qué tal?</strong></p>
<p>Buenas. Muy bien, un poco de frío por aquí.</p>
<p><strong>¿Qué tal la vida por Nottingham?</strong></p>
<p>Genial, es una ciudad joven con dos universidades y tiene mucha actividad: conciertos, pubs, restaurantes, etc. Siempre hay algo que hacer, lo que compensa un poco el frío. No es Londres pero los precios son considerablemente más bajos, no me quejo.</p>
<p><strong>Te fuiste a Londres a hacer un master en desarrollo de videojuegos, ¿Qué tal la experiencia?</strong></p>
<p>Fantástica. Las instalaciones eran inmejorables, el laboratorio de videojuegos contaba con decenas de equipos potentes, Xbox y PSPs de desarrollo. Todo en perfecto estado disponible para el alumno fuera de horario de clases.</p>
<p>Además, tienen muchos contactos en la Industria del Videojuego y rara era la semana que no había una conferencia: Sony, Turbulenz, Splash Damage, Crytek.</p>
<p>Aunque el nivel de programación no es muy alto allí, aprendí muchísimo ya que todo estaba orientado a proyectos. También hice muchos contactos, algo imprescindible.</p>
<p><strong>De ahí a trabajar en </strong><strong>Crytek, ¿Cómo se consigue que una de las grandes se fije en uno?</strong></p>
<p>Diría que son muchos factores. Lo primero y más importante es construirse un porfolio online y llenarlo de proyectos en los que hayas trabajado. No tienen porqué ser juegos complejos, lo imprescindible es acabarlos. Publicar el código fuente ayuda a esforzarse en mejorar, hacer comunidad y a que los demás puedan ver tu trabajo.</p>
<p>Ser realista, empezar con juegos asequibles e ir subiendo. Se valora mucho saber optimizar, así que el tener algo para móviles está bien.</p>
<p>Después conviene moverse un poco en el sentido de conocer gente tanto en persona como a través de Internet. Asistir a eventos, ser social, involucrarse en comunidades&#8230; Así se aumentan las posibilidades de estar en el sitio adecuado en el momento oportuno.</p>
<p><strong>¿Cómo es trabajar en Crytek?</strong></p>
<p>Muy emocionante. Estás trabajando junto a los mejores profesionales de la Industria en proyectos de una envergadura mastodóntica, son juegos triple A. El reto hace que aprendas constantemente.</p>
<p>El ambiente de Crytek UK es estupendo, la oficina es moderna, luminosa y tiene un plan abierto, lo que facilita la comunicación entre equipos. Se trabaja duro y con fechas ajustadas pero de forma cómoda. La atmósfera es de colaboración estrecha y los compañeros son geniales.</p>
<p>Después del trabajo nos relajamos jugando al fútbol o con un pub quiz.</p>
<p><strong>¿Alguna novatada o esas cosas no se llevan por Crytek?</strong></p>
<p>Jaja, no, en casi un año en Crytek, yo no he visto ninguna. Hay mucho respeto y desde el primer día fui uno más del equipo.</p>
<p><strong>¿Nos puedes contar en que juego estás trabajando y cuáles son tus funciones?</strong></p>
<p>Soy programador de IA en Homefront 2.</p>
<p><strong>Cuéntanos si puedes que tecnología usas a grandes rasgos, ¿Su usa casi todo propio o se utilizan bibliotecas o frameworks consolidados?</strong></p>
<p>En Crytek trabajamos con CryEngine, un motor propietario desarrollado &#8220;in-house&#8221; cuya versión con fines no comerciales es de uso gratuito. Otras compañías pueden licenciarlo si quieren.</p>
<p>CryEngine está mayoritariamente escrito en C++ así como parte del código de cada juego. El scripting se lleva a cabo con Lua, XML y Flowgraph. Éste último es un sistema de scripting visual con el que trabajan los diseñadores en el Sandbox Editor de CryEngine. Por supuesto, contamos con muchas más herramientas auxiliares.</p>
<p><strong>Tu equipo tiene permiso para añadir o modificar el CryEngine o es una herramienta que viene de otro equipo que solo podéis usar, ¿Cómo funciona este tema si se necesitan nuevas funcionalidades?</strong></p>
<p>Nosotros somos los que desarrollamos CryEngine. Cuando necesitamos una nueva funcionalidad, la añadimos, así es como evoluciona. Posteriormente, es posible que se añada de forma oficial en la siguiente actualización.</p>
<p><strong>Si algún día uso el CryEngine y me falla ya se ha quien echar la culpa.</strong></p>
<p>Bueno, antes de que se publique una versión oficial del SDK hay un fuerte proceso de testeo constante. Seguramente, lo que uses de CryEngine ya habrá sido utilizado de forma intensiva en muchos juegos de la compañía.</p>
<p>No obstante, no existe un sistema tan complejo 100% libre de bugs. Es un proceso iterativo.</p>
<p><strong>Nos has hablado de un portafolio y contactos para hacerse un hueco en la industria. Supongo que das por hecho otras cosas como un nivel de inglés, de programación, etc. Cuéntanos la clave, ¿Qué se necesita para trabajar en la industria referente a conocimientos?</strong></p>
<p>Es imprescindible contar con una base fuerte de programación. Si bien es cierto que muchas empresas (sobre todo móviles) están utilizando tecnologías como Unity, C++ sigue siendo el lenguaje por antonomasia.</p>
<p>Hay que saber manejar y diseñar estructuras de datos, tener fundamentos de algoritmia, dominar C/C++ a bajo nivel. Principalmente como se organizan los objetos en memoria y sus consecuencias, por qué es mejor utilizar un algoritmo antes que otro en un caso determinado etc. Ser eficiente y escribir código legible es muy importante.</p>
<p>En un proyecto tan grande necesitas saber leer código ajeno y comprenderlo así como ser capaz de ampliarlo o corregirlo. Saber depurar también es muy relevante.</p>
<p>En el plano matemático y físico es recomendable tener conocimientos de geometría, álgebra lineal y cinemática.</p>
<p>Inglés es el lenguaje oficial de la mayoría de estudios, incluso aquellos localizados en países no angloparlantes. Sobra decir que hay que dominarlo a nivel profesional, la comunicación con el equipo es fundamental.</p>
<p><strong>¿Especialización o un poco de todo, qué pide el sector?</strong></p>
<p>Para un puesto de programador junior no se suele pedir una especialización. Sí es necesario que demuestres tus conocimientos de programación de videojuegos a través de tus proyectos.</p>
<p>Estaría bien que entre todos cubrieras los aspectos básicos de áreas como gameplay, AI y rendering. Un poco de todo.</p>
<p><strong>¿Sigues trabajando en otros proyectos por amor al arte?</strong></p>
<p>Sí, sobre todo para fortalecer lo que ya se y aprender cosas nuevas. También porque me gusta.</p>
<p>Actualmente utilizo Java y el fantástico framework libre y multiplataforma libgdx. Trato de seguir game jams y eventos similares.</p>
<p><strong>¿Cómo ves la industria de los videojuegos?</strong></p>
<p>Es un mundo apasionante que evoluciona extremadamente rápido y conduce parte del avance tecnológico. Esto provoca que muchos estudios no sepan adaptarse y deban cerrar, lo cual es triste. Eso sí, siempre hay nuevas compañías y modelos que van surgiendo.</p>
<p><strong>¿Qué te parece el boom del desarrollo Indie que ha surgido?</strong></p>
<p>Creo que es un poco la respuesta a dos situaciones: pocas compañías pueden permitirse el disparatado coste de un triple A y un sector de los jugadores quiere experiencias nuevas.</p>
<p>Es genial porque le abre las puertas a mucha gente y crea diversidad. Tampoco creo que sea la panacea. No cualquiera puede tener éxito en el mundo indie, la cantidad de trabajo es un equipo pequeño es monstruosa si se quiere lanzar algo pulido, aunque sea simple. Quien no lo crea, ahí tiene Indie Game The Movie.</p>
<p><strong>Danos un último consejo a todos los que queremos seguir tus pasos y trabajar en la industria.</strong></p>
<p>Es posible, no es algo tan inalcanzable pero hay que trabajar muchísimo para conseguirlo. Día tras día, incluso cuando la motivación decaiga.</p>
<p>Hacer juegos y terminarlos, parece sencillo y lo he dicho antes pero es lo más importante, con diferencia.</p>
<p><strong>¿Algo más que nos quieras comentar David?</strong></p>
<p>Nada, muchas gracias por la entrevista y seguimos en contacto a través de nuestros blogs o cualquier otro medio.</p>
<p><strong>Muchas gracias a ti por tu tiempo.</strong></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/08/introduccion-a-la-programacion-grafica-2d-iii/" class="wp_rp_title">Introducción a la programación gráfica 2D (III)</a></li><li ><a href="http://razonartificial.com/2010/06/engine-vii-la-clase-mapa-i/" class="wp_rp_title">Engine VII: La clase Mapa I</a></li><li ><a href="http://razonartificial.com/2012/06/juegos-online-tecnologias-a-usar/" class="wp_rp_title">Juegos Online &#8211; Tecnologías a usar</a></li><li ><a href="http://razonartificial.com/2010/04/engine-ii-el-archivo-principal/" class="wp_rp_title">Engine II: El archivo principal</a></li><li ><a href="http://razonartificial.com/2010/04/haciendo-un-engine-para-juegos-con-python-y-pygame/" class="wp_rp_title">Haciendo un engine para juegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/w69o10YBzWc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/entrevista-a-david-saltares-programador-en-crytek/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/entrevista-a-david-saltares-programador-en-crytek/</feedburner:origLink></item>
		<item>
		<title>[RAGE] Razón Artificial Game Engine</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/GGcmF6_wC4U/</link>
		<comments>http://razonartificial.com/2013/01/rage-razon-artificial-game-engine/#comments</comments>
		<pubDate>Tue, 15 Jan 2013 17:49:15 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[RAGE]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Engine]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2064</guid>
		<description><![CDATA[Después de mucho tiempo desarrollando lo que primero se llamo Basic Game Engine (BGE) y luego Generic Game Engine (GGE), ahora pasa a llamarse Razón Artificial Game Engine (RAGE) y se reestructura por completo. Lo que venía siendo el GGE aunque no haya terminado de ver la luz una versión estable me ha ayudado a aprender mucho acerca del desarrollo de de aplicaciones en General y Desarrollo de videojuegos en particular, pero eso ha conllevado fallos de diseño y estructuras incosistentes que hacen que no sea un buen sistema con el que seguir. Así que he decidido Re-Comenzar el proyecto y contar la experiencia así que allá vamos Qué es Razón Artificial Game Engine (RAGE) es un Game Engine para el desarrollo de videojuegos 2D de propósito general y multiplataforma. Escrito en C++ sobre la biblioteca gráfica SFML y haciendo uso de otras bibliotecas consolidadas como la STL, Boost, PugiXML, etc. Características iniciales Multiplataforma (Windows, Linux, OSX) De ámbito general. Sirve para desarrollar cualquier tipo de juego 2D. Basado en SFML 2. Que a su vez se basa en OpenGL. (Aceleración por Hardware). Gestor de Escenas Gestor de Recursos. Soporte de los siguientes recursos: Formatos de imágenes comunes. (bmp, dds, [...]]]></description>
				<content:encoded><![CDATA[<p><img class="size-full wp-image-2068 alignright" alt="logo_rage" src="http://razonartificial.com/wp-content/uploads/2013/01/logo_rage.png" width="185" height="209" /></p>
<p>Después de mucho tiempo desarrollando lo que primero se llamo Basic Game Engine (BGE) y luego Generic Game Engine (GGE), ahora pasa a llamarse Razón Artificial Game Engine (RAGE) y se reestructura por completo.</p>
<p>Lo que venía siendo el GGE aunque no haya terminado de ver la luz una versión estable me ha ayudado a aprender mucho acerca del desarrollo de de aplicaciones en General y Desarrollo de videojuegos en particular, pero eso ha conllevado fallos de diseño y estructuras incosistentes que hacen que no sea un buen sistema con el que seguir. Así que he decidido Re-Comenzar el proyecto y contar la experiencia así que allá vamos</p>
<h2><span style="font-size: 1.17em;">Qué es</span></h2>
<p>Razón Artificial Game Engine (RAGE) es un Game Engine para el desarrollo de videojuegos 2D de propósito general y multiplataforma. Escrito en C++ sobre la biblioteca gráfica SFML y haciendo uso de otras bibliotecas consolidadas como la STL, Boost, PugiXML, etc.</p>
<h2>Características iniciales</h2>
<ul>
<li>Multiplataforma (Windows, Linux, OSX)</li>
<li>De ámbito general. Sirve para desarrollar cualquier tipo de juego 2D.</li>
<li>Basado en SFML 2. Que a su vez se basa en OpenGL. (Aceleración por Hardware).</li>
<li>Gestor de Escenas</li>
<li>Gestor de Recursos. Soporte de los siguientes recursos:
<ul>
<li>Formatos de <b>imágenes</b> comunes. (bmp, dds, jpg, png, tga, psd).</li>
<li>Formatos de <b>audio</b> comunes. (ogg, wav, flac, aiff, au, raw, paf, svx, nist, voc, ircam, w64, mat4, mat5 pvf, htk, sds, avr, sd2, caf, wve, mpc2k, rf64).</li>
<li>Formatos de <b>fuentes</b> comunes. (ttf, cff, pcf, fnt, bdf, pfr, sfnt, type 1, type 42).</li>
<li>Archivos de <b>configuración</b> (.ini, .cfg, etc).</li>
<li>Formato <b>TMX</b> (Tiled Map Editor).</li>
<li>Formato propio para animaciones 2D.</li>
</ul>
</li>
<li>Configuración fácil a través de archivos tipo ini.</li>
<li>Gestión eficiente de recusos.</li>
<li>Gestión eficiente de dibujado</li>
<li>Soporte para SpriteSheet y Animaciones</li>
<li>Sistema de Colisiones 2D basado en Rectángulos, Circunferencia y Pixel Perfect.</li>
<li>Sistema de creación de Interfaces Gráficas del usuario (GUI).</li>
<li>Soporte para dibujar mapas ortogonales e isométricos basados en Tiled.</li>
</ul>
<h2>Futuras ampliaciones</h2>
<ul>
<li>Soporte para física a través de Box2D.</li>
<li>Módulo con algoritmos de Inteligencia Artificial (Pathfinding, FMS, MinMax, etc).</li>
<li>Soporte de Scripts en Python.</li>
</ul>
<p>Como novedad iré comentando todas las decisiones y pasos importantes del proyecto en el blog.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2013/01/rage-sistema-de-objetos/" class="wp_rp_title">[RAGE] Sistema de Objetos</a></li><li ><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" class="wp_rp_title">[BGE] Sistema base del Engine</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li><li ><a href="http://razonartificial.com/2013/01/rage-definiendo-repositorio-y-estructura/" class="wp_rp_title">[RAGE] Definiendo repositorio y estructura</a></li><li ><a href="http://razonartificial.com/2013/01/rage-estructura-basica-del-engine/" class="wp_rp_title">[RAGE] Estructura básica del Engine</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/GGcmF6_wC4U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/rage-razon-artificial-game-engine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/rage-razon-artificial-game-engine/</feedburner:origLink></item>
		<item>
		<title>¿Nuevo desarrollando videojuegos? Simplemente haz juegos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/oLoaVlgUpq4/</link>
		<comments>http://razonartificial.com/2013/01/nuevo-desarrollando-videojuegos-solo-haz-juegos/#comments</comments>
		<pubDate>Fri, 04 Jan 2013 16:14:14 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Artículo]]></category>
		<category><![CDATA[Empezar]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2049</guid>
		<description><![CDATA[Artículo traducido del original de David Saltares: http://siondream.com/blog/games/new-to-games-just-make-games/ Aviso: Este artículo está dirigido a principiantes en la programación de videojuegos. Adentrarse en el desarrollo de videojuegos por primera vez puede ser emocionante a la vez que confuso. Un gran consejo sería: sólo haz juegos. Haz cosas y punto. A menudo me he encontrado a mí mismo investigando tecnologías que se adapten mejor a mis necesidades. Como si necesitase las cosas hechas a medida. El miedo a encontrarme en un punto muerto era tan poderoso como contraproducente. Dicho enfoque es un desperdicio de tiempo. ¿Cuál es el mejor Framework para empezar a desarrollar videojuegos? ¿Debo aprender un nuevo lenguaje para hacer juegos? ¡Alto! Ni que decir tiene, que podrás cometer errores en el camino y que eso no es un es un estigma del que nos vayamos a deshacer a corto plazo. Cuando estaba trabajando en mi proyecto final de carrera, muy a menudo tenía que reescribir un subsistema completo desde cero (cara triste), pero eso es parte del proceso de aprendizaje. Pasar semanas mirando características de Frameworks avanzados lo más probable es que no entiendas muchas cosas. Toma esto como consejo para mantenerse enfocado en lo que realmente importa, la creación de juegos. [...]]]></description>
				<content:encoded><![CDATA[<div class="alert alert-info">Artículo traducido del original de David Saltares: <a href="http://siondream.com/blog/games/new-to-games-just-make-games/">http://siondream.com/blog/games/new-to-games-just-make-games/</a></div>
<div class="alert"><strong>Aviso:</strong> Este artículo está dirigido a principiantes en la programación de videojuegos.</div>
<p>Adentrarse en el desarrollo de videojuegos por primera vez puede ser emocionante a la vez que confuso. Un gran consejo sería: sólo haz juegos. Haz cosas y punto. A menudo me he encontrado a mí mismo investigando tecnologías que se adapten mejor a mis necesidades. Como si necesitase las cosas hechas a medida. El miedo a encontrarme en un punto muerto era tan poderoso como contraproducente. Dicho enfoque es un desperdicio de tiempo.</p>
<blockquote><p>¿Cuál es el mejor Framework para empezar a desarrollar videojuegos? ¿Debo aprender un nuevo lenguaje para hacer juegos?</p></blockquote>
<p>¡Alto!</p>
<p>Ni que decir tiene, que podrás cometer errores en el camino y que eso no es un es un estigma del que nos vayamos a deshacer a corto plazo. Cuando estaba trabajando en mi <a href="http://siondream.com/blog/games/sion-tower/">proyecto final de carrera</a>, muy a menudo tenía que reescribir un subsistema completo desde cero (cara triste), pero eso es parte del proceso de aprendizaje. Pasar semanas mirando características de Frameworks avanzados lo más probable es que no entiendas muchas cosas. Toma esto como consejo para mantenerse enfocado en lo que realmente importa, la creación de juegos.</p>
<p style="text-align: center;"><a href="http://razonartificial.com/wp-content/uploads/2013/01/siontower-game11.png"><img class="aligncenter size-full wp-image-2051 imageborder" alt="siontower-game11" src="http://razonartificial.com/wp-content/uploads/2013/01/siontower-game11.png" width="550" height="309" /></a></p>
<p>&nbsp;</p>
<p><a href="http://en.wikipedia.org/wiki/KISS_principle">KISS</a> (Keep It Simple, Stupid) (N.T. Hazlo simple, estúpido), es un principio de vida.</p>
<p>La curva de aprendizaje de este campo ya es suficientemente empinada como para tratar de complicar las cosas más aún. Si ya conoces un lenguaje de forma aceptable, no trates de aprender uno nuevo con el único proposito de usar un engine específico. ¡ Cuidado! Es muy fácil caer en esto.</p>
<p>Un par de búsquedas en Google o en Stack Overflow es suficiente para descubrir un game engine adecuado para el lenguaje que uses. Casi seguro va a ofrecer todo lo que necesitas y más. Si piensas que utilizar los últimos algoritmos gráficos disponibles es importante, te equivocas. Tetris, R-Type, Snake y similares son los recomendados como primeros proyectos y no necesitan ser un lujo en todo. Una vez más, deje todo un lado y sigue a delante para completar el juego.</p>
<p style="text-align: center;"><a href="http://razonartificial.com/wp-content/uploads/2013/01/pong.jpeg"><img class="aligncenter size-full wp-image-2050 imageborder" alt="pong" src="http://razonartificial.com/wp-content/uploads/2013/01/pong.jpeg" width="400" height="310" /></a></p>
<p>Después de terminar un par de pequeños proyectos lo que debes preguntarte es lo siguiente: ¿Lo hago por diversión? En caso de que sí, puedes seguir con el entorno y lenguaje que te sientas más cómodo. Puedes hacer todos los juegos que quieras sin presión. Sin embargo, es posible que el objetivo sea vivir de ello. Cuando se aplica esto último debes aprender nuevos lenguajes y ampliar tus habilidades, teniendo en cuenta que el dominio de C++ es primordial.</p>
<p>En resumen, a menos que programes en <a href="http://en.wikipedia.org/wiki/Brainfuck">Brainfuck</a> , hay un montón de herramientas válidas que le proporcionará más poder que el que necesitas para desarrollar videojuegos.</p>
<ul>
<li>C: <a href="http://www.libsdl.org/">SDL</a></li>
<li>C + +: <a href="http://www.sfml-dev.org/">SFML</a></li>
<li>Python: <a href="http://www.pygame.org/news.html">PyGame</a></li>
<li>Java: <a href="http://libgdx.badlogicgames.com/">libgdx</a></li>
<li>Ruby: <a href="http://www.libgosu.org/">OSU</a></li>
<li>Flash: <a href="http://flashpunk.net/">Flashpunk</a></li>
<li>Lua: <a href="https://love2d.org/">Love2D</a></li>
<li>PHP: ¿me estás tomando el pelo?</li>
</ul>
<p>¿Sigues escéptico?  Examina el foro de cada uno de ellos, te sorprenderá.</p>
<p style="text-align: center;"><a href="http://razonartificial.com/wp-content/uploads/2013/01/vampire-runner.jpg"><img class="aligncenter size-full wp-image-2052 imageborder" alt="vampire-runner" src="http://razonartificial.com/wp-content/uploads/2013/01/vampire-runner.jpg" width="550" height="330" /></a></p>
<p>En realidad lo único que te debe preocupar es que el candidato elegido esté bien documentado y si cuenta con una comunidad activa o no. Cuidado con nichos y tecnologías crípticos.  Afortunadamente esos son fáciles de detectar mediante una ojeada rápida a su plataforma en línea. Excelente, ahora podrás disfrutar de las maravillas de tener un grupo de compañeros programadores que te pueden ayudar cuando te quedes atascado.</p>
<p>Terminando, ¿Sigues buscando desesperadamente la panacea final? No te preocupes demasiado, simplemente acaba de hacer juegos.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/curso-programacion-de-videojuegos/" class="wp_rp_title">Curso programación de videojuegos</a></li><li ><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" class="wp_rp_title">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li ><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" class="wp_rp_title">Gran Pack de desarrollo de videojuegos</a></li><li ><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" class="wp_rp_title">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li ><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" class="wp_rp_title">Proyecto Generic Game Engine</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/oLoaVlgUpq4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/nuevo-desarrollando-videojuegos-solo-haz-juegos/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/nuevo-desarrollando-videojuegos-solo-haz-juegos/</feedburner:origLink></item>
		<item>
		<title>Propósitos 2013</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/UAIFzEP9ciY/</link>
		<comments>http://razonartificial.com/2013/01/propositos-2013/#comments</comments>
		<pubDate>Fri, 04 Jan 2013 01:28:33 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2043</guid>
		<description><![CDATA[Comienza 2013 y Razón Artificial cumple 3 años. Fue en 2010 cuando comencé este blog y desde entonces ha cambiado un montón de veces de diseño y tipo de contenido (sí, he vuelto a cambiar el diseño). Pero siempre he procurado escribir guías y tutoriales útiles nunca limitarme a copiar y pegar de otros sitios. En 2012 calló el ritmo de publicación y son pocas las aportaciones que he podido hacer al blog, este año espero que la cosa cambie y vuelva el ritmo de años anteriores. Con el nuevo año llegan los nuevos propósitos, así que aquí van los propósitos míos con respecto al desarrollo de videojuegos y Razón Artificial. Publicar más artículos en Razón Artificial, por lo menos uno a la semana. Terminar una versión usable del Generic Game Engine. Crear algunos juegos simples multiplataforma con el Generic Game Engine. Comenzar el desarrollo de un macroproyecto. Posiblemente un juego de estrategia en tiempo real (RTS). Buscarle un mejor nombre al Generic Game Engine. Como veis la cosa gira entorno a mejorar el Framework de desarrollo de videojuegos que he venido realizando y luego crear un proyecto con él posiblemente un juego de estrategia (sobre todo por la IA). Sobre el último punto [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://razonartificial.com/wp-content/uploads/2013/01/2013.jpg"><img class="alignright imageborder size-full wp-image-2044" alt="2013" src="http://razonartificial.com/wp-content/uploads/2013/01/2013.jpg" width="425" height="282" /></a></p>
<p>Comienza 2013 y Razón Artificial cumple 3 años. Fue en 2010 cuando comencé este blog y desde entonces ha cambiado un montón de veces de diseño y tipo de contenido (sí, he vuelto a cambiar el diseño). Pero siempre he procurado escribir guías y tutoriales útiles nunca limitarme a copiar y pegar de otros sitios.</p>
<p>En 2012 calló el ritmo de publicación y son pocas las aportaciones que he podido hacer al blog, este año espero que la cosa cambie y vuelva el ritmo de años anteriores. Con el nuevo año llegan los nuevos propósitos, así que aquí van los propósitos míos con respecto al desarrollo de videojuegos y Razón Artificial.</p>
<ul>
<li>Publicar más artículos en Razón Artificial, por lo menos uno a la semana.</li>
<li>Terminar una versión usable del Generic Game Engine.</li>
<li>Crear algunos juegos simples multiplataforma con el Generic Game Engine.</li>
<li>Comenzar el desarrollo de un macroproyecto. Posiblemente un juego de estrategia en tiempo real (RTS).</li>
<li>Buscarle un mejor nombre al Generic Game Engine.</li>
</ul>
<p>Como veis la cosa gira entorno a mejorar el Framework de desarrollo de videojuegos que he venido realizando y luego crear un proyecto con él posiblemente un juego de estrategia (sobre todo por la IA). Sobre el último punto se aceptan sugerencias ya que Generic Game Engine es como el mismo nombre dice muy &#8220;Genérico&#8221; busco algo que lo identifique con Razón Artificial.</p>
<p>¡Feliz Año!</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/" class="wp_rp_title">Bienvenidos a Razón Artificial 2.0</a></li><li ><a href="http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/" class="wp_rp_title">Ayuda a financiar la web: Vótanos en Lánzanos</a></li><li ><a href="http://razonartificial.com/2012/11/nueva-version-de-razon-artificial/" class="wp_rp_title">Nueva versión de Razón Artificial</a></li><li ><a href="http://razonartificial.com/2010/07/razon-artificial-crece/" class="wp_rp_title">Razón Artificial Crece</a></li><li ><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" class="wp_rp_title">Iberogre &#8211; Documentación de Ogre en español</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/UAIFzEP9ciY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2013/01/propositos-2013/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2013/01/propositos-2013/</feedburner:origLink></item>
		<item>
		<title>Nueva versión de Razón Artificial</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/ZHO0qL76XVs/</link>
		<comments>http://razonartificial.com/2012/11/nueva-version-de-razon-artificial/#comments</comments>
		<pubDate>Sun, 11 Nov 2012 16:07:38 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=2022</guid>
		<description><![CDATA[Estrenamos diseño nuevo para la web. Con esta nueva versión oriento Razón Artificial a una web algo más personal donde además del blog doy a conocer mis proyectos e información sobre mí. La web ha sido diseñada utilizando HTML 5 y CSS 3 así como el framework de desarrollo Bootstrap de Twitter. Durante unos días puede que haya enlaces rotos o páginas que no funcionen bien, esperamos que esté todo 100% operativo en unos días. Bienvenidos a Razón Artificial 2.0Propósitos 2013Ayuda a financiar la web: Vótanos en LánzanosIberogre &#8211; Documentación de Ogre en españolRazón Artificial CreceZemanta]]></description>
				<content:encoded><![CDATA[<p><a href="http://razonartificial.com/wp-content/uploads/2012/11/logo-big.png"><img class="alignleft size-full wp-image-2023" title="logo-big" src="http://razonartificial.com/wp-content/uploads/2012/11/logo-big.png" alt="" width="128" height="128" /></a>Estrenamos diseño nuevo para la web. Con esta nueva versión oriento Razón Artificial a una web algo más personal donde además del blog doy a conocer mis proyectos e información sobre mí.</p>
<p>La web ha sido diseñada utilizando HTML 5 y CSS 3 así como el framework de desarrollo Bootstrap de Twitter.</p>
<p>Durante unos días puede que haya enlaces rotos o páginas que no funcionen bien, esperamos que esté todo 100% operativo en unos días.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/" class="wp_rp_title">Bienvenidos a Razón Artificial 2.0</a></li><li ><a href="http://razonartificial.com/2013/01/propositos-2013/" class="wp_rp_title">Propósitos 2013</a></li><li ><a href="http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/" class="wp_rp_title">Ayuda a financiar la web: Vótanos en Lánzanos</a></li><li ><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" class="wp_rp_title">Iberogre &#8211; Documentación de Ogre en español</a></li><li ><a href="http://razonartificial.com/2010/07/razon-artificial-crece/" class="wp_rp_title">Razón Artificial Crece</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/ZHO0qL76XVs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/11/nueva-version-de-razon-artificial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/11/nueva-version-de-razon-artificial/</feedburner:origLink></item>
		<item>
		<title>Curso Expertos en desarrollo de Videojuegos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/tx98wbOUCbo/</link>
		<comments>http://razonartificial.com/2012/07/curso-expertos-en-desarrollo-de-videojuegos/#comments</comments>
		<pubDate>Fri, 27 Jul 2012 12:31:47 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Curso]]></category>
		<category><![CDATA[Teoría]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1971</guid>
		<description><![CDATA[He encontrado un material bastante interesante para los interesados en la progrmación de videojuegos, se trata de el curso de expertos en desarrollo de videojuegos. Se trata de un curso de programación de videojuegos completo. Lo más interesante del curso es que dispone de todo el material para descargarlo gratuitamente, esto incluye 4 estupendos libros que abordan la programación de videojuegos desde niveles básicos hablando sobre herramientas, técnicas y consejos. Dejo los cuatro libros del curso que es el material más interesante. Arquitectura del Motor. En este primer libro se estudian los aspectos esenciales del diseño de un motor de videojuegos, así como las técnicas básicas de programación y patrones de diseño. Programación Gráfica. El segundo libro de la colección se centra en los algoritmos y técnicas de representación gráfica y optimizaciones en sistemas de despliegue interactivo. Técnicas Avanzadas. En este tercer volumen se recogen ciertos aspectos avanzados, como estructuras de datos específicas, técnicas de validación y pruebas o simulación física. Desarrollo de Componentes. El último libro está dedicado a ciertos componentes específicos del motor, como la Inteligencia Artificial, Networking, Sonido y Multimedia o técnicas avanzadas de Interacción. Podemos encontrar ejemplos y código fuente en la web oficial del curso: http://cedv.morcy.es Curso de Videojuegos en C++ &#8211; Presentación[Curso C++] &#8211; [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://razonartificial.com/wp-content/uploads/2012/07/ExpVjuegos.png"><img class="alignright size-full wp-image-1973 imageborder" title="ExpVjuegos" src="http://razonartificial.com/wp-content/uploads/2012/07/ExpVjuegos.png" alt="" width="206" height="206" /></a></p>
<p>He encontrado un material bastante interesante para los interesados en la progrmación de videojuegos, se trata de el <a href="http://cedv.morcy.es/">curso de expertos en desarrollo de videojuegos</a>. Se trata de un curso de programación de videojuegos completo.</p>
<p>Lo más interesante del curso es que dispone de todo el material para descargarlo gratuitamente, esto incluye 4 estupendos libros que abordan la programación de videojuegos desde niveles básicos hablando sobre herramientas, técnicas y consejos. Dejo los cuatro libros del curso que es el material más interesante.</p>
<ol>
<li><a href="http://razonartificial.com/wp-content/uploads/2012/07/M1.pdf">Arquitectura del Motor</a>. En este primer libro se estudian los aspectos esenciales del diseño de un motor de videojuegos, así como las técnicas básicas de programación y patrones de diseño.</li>
<li><a href="http://www.morcy.es/cedv/M2.pdf">Programación Gráfica</a>. El segundo libro de la colección se centra en los algoritmos y técnicas de representación gráfica y optimizaciones en sistemas de despliegue interactivo.</li>
<li><a href="http://razonartificial.com/wp-content/uploads/2012/07/M3.pdf">Técnicas Avanzadas</a>. En este tercer volumen se recogen ciertos aspectos avanzados, como estructuras de datos específicas, técnicas de validación y pruebas o simulación física.</li>
<li><a href="http://razonartificial.com/wp-content/uploads/2012/07/M4.pdf">Desarrollo de Componentes</a>. El último libro está dedicado a ciertos componentes específicos del motor, como la Inteligencia Artificial, Networking, Sonido y Multimedia o técnicas avanzadas de Interacción.</li>
</ol>
<p>Podemos encontrar ejemplos y código fuente en la web oficial del curso: <a href="http://cedv.morcy.es/">http://cedv.morcy.es</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" class="wp_rp_title">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li ><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" class="wp_rp_title">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li ><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" class="wp_rp_title">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li><li ><a href="http://razonartificial.com/2010/01/curso-python/" class="wp_rp_title">Curso Python</a></li><li ><a href="http://razonartificial.com/2010/01/curso-python-i-interprete-y-scripts/" class="wp_rp_title">Curso Python I – Intérprete y scripts</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/tx98wbOUCbo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/07/curso-expertos-en-desarrollo-de-videojuegos/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/07/curso-expertos-en-desarrollo-de-videojuegos/</feedburner:origLink></item>
		<item>
		<title>Juegos Online – Tecnologías a usar</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/ZlvSSiLOfBs/</link>
		<comments>http://razonartificial.com/2012/06/juegos-online-tecnologias-a-usar/#comments</comments>
		<pubDate>Fri, 08 Jun 2012 22:37:35 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Juegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1957</guid>
		<description><![CDATA[Vamos a hablar de las tecnlogías usadas para los juegos de navegador. De estos juegos hay muchos están los típicos minijuegos Flash, los juegos de estrategia online del estilo Ogame o incluso  juegos de casino o poker donde ganar algo de dinero. Las tecnologías usada para estos juegos de navegador se dividen en dos grandes grupos en los últimos tiempos: Juegos Flash La archiconocida tecnología propietaria de Adobe, tiene un lenguaje de programación propio como es ActionScript aparte de un editor visual donde realizar diferentes diseños y animaciones. Tiene a favor su extendido uso y documentación y que casi todo el mundo lo tiene instalado en sus ordenadores. En contra tiene que es tecnología propietaria y cerrada y un pésimo soporte en Linux. Juegos en HTML5 Es el nuevo estándar que cada dia gana más adeptos, basado en javascript y en CSS3 con los actuales navegadores parece que será el punto fuerte en los próximos años. Tiene la ventaja de estándares abiertos y de que está en auge el mercado por su contra solo es soportado por navegadores modernos y aún tiene que madurar. En definitiva la elección dependerá de si te interesa más utilizar estándares que funcionarán en todas [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-1958 imageborder" title="poker" src="http://razonartificial.com/wp-content/uploads/2012/06/poker-250x236.jpg" alt="" width="250" height="236" /></p>
<p>Vamos a hablar de las tecnlogías usadas para los juegos de navegador. De estos juegos hay muchos están los típicos minijuegos Flash, los juegos de estrategia online del estilo Ogame o incluso  <a href="http://www.partypoker.com/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','http://www.partypoker.com/']);">juegos de casino</a> o <a href="http://www.partypoker.com/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','http://www.partypoker.com/']);">poker</a> donde ganar algo de dinero.</p>
<p>Las tecnologías usada para estos juegos de navegador se dividen en dos grandes grupos en los últimos tiempos:</p>
<h2>Juegos Flash</h2>
<p>La archiconocida tecnología propietaria de Adobe, tiene un lenguaje de programación propio como es ActionScript aparte de un editor visual donde realizar diferentes diseños y animaciones. Tiene a favor su extendido uso y documentación y que casi todo el mundo lo tiene instalado en sus ordenadores. En contra tiene que es tecnología propietaria y cerrada y un pésimo soporte en Linux.</p>
<h2>Juegos en HTML5</h2>
<p>Es el nuevo estándar que cada dia gana más adeptos, basado en javascript y en CSS3 con los actuales navegadores parece que será el punto fuerte en los próximos años. Tiene la ventaja de estándares abiertos y de que está en auge el mercado por su contra solo es soportado por navegadores modernos y aún tiene que madurar.</p>
<p>En definitiva la elección dependerá de si te interesa más utilizar estándares que funcionarán en todas las plataformas aunque aun esté algo verde o prefieres una tecnología más madura pero propietaria y con soporte dependiendo de una empresa.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" class="wp_rp_title">[BGE] La clase App</a></li><li ><a href="http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/" class="wp_rp_title">Guía aprender programar videojuegos con C++</a></li><li ><a href="http://razonartificial.com/2010/08/orts-estrategia-en-tiempo-real-opensource/" class="wp_rp_title">ORTS. Estrategia en tiempo real OpenSource</a></li><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li ><a href="http://razonartificial.com/2010/08/la-inteligencia-artificial-de-l4d/" class="wp_rp_title">La Inteligencia Artificial de L4D</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/ZlvSSiLOfBs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/06/juegos-online-tecnologias-a-usar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/06/juegos-online-tecnologias-a-usar/</feedburner:origLink></item>
		<item>
		<title>Una introducción a la STL I – Introducción a los contenedores</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/ia3EkOOXQ38/</link>
		<comments>http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 15:23:07 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[STL]]></category>
		<category><![CDATA[Teoría]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1883</guid>
		<description><![CDATA[Vamos a dedicar una serie de artículos a hablar de la Biblioteca de plantillas estándar (STL) de C++. Esta poderosa herramienta usada por casi todo los programadores de C++ de la que hay muy poca documentación disponible en nuestro idioma. La STL es una colección de estructuras de datos y algoritmos de uso común. Esta basada en plantillas utilizando programación genérica. Está diseñada para ser eficiente, evita el uso de funciones virtuales en favor de las plantillas evitando operaciones en tiempo de ejecución. La STL se podría dividir en tres grandes partes: Contenedores (plantillas de estructuras de datos populares), iteradores y algoritmos. Introducción a los contenedores Los contenedores de la STL son estructuras de datos capaces de contener casi cualquier tipo de objeto (hay algunas restricciones). Existen 3 tipos de clases contenedoras: contenedores de primera clase, adaptadores y casi-contenedores. También podemos catalogar a los contenedores por el tipo. Existen 3 tipos de contenedores: Contenedores de secuencia, Contenedores asociativos y Adaptadores de contenedores. Vamos a ver una tabla con los tipos de contenedores que hay. Clase Contenedora Descripción Contenedores de secuencia (primera clase) vector Inserción y eliminación rápida en la parte final. Acceso directo a cualquier elemento. deque Incersiones y eliminaciones rápidas en [...]]]></description>
				<content:encoded><![CDATA[<p>Vamos a dedicar una serie de artículos a hablar de la Biblioteca de plantillas estándar (STL) de C++. Esta poderosa herramienta usada por casi todo los programadores de C++ de la que hay muy poca documentación disponible en nuestro idioma.</p>
<p>La STL es una colección de estructuras de datos y algoritmos de uso común. Esta basada en plantillas utilizando <a href="http://en.wikipedia.org/wiki/Generic_programming">programación genérica</a>. Está diseñada para ser eficiente, evita el uso de funciones virtuales en favor de las plantillas evitando operaciones en tiempo de ejecución.</p>
<p>La STL se podría dividir en tres grandes partes: <strong>Contenedores</strong> (plantillas de estructuras de datos populares), <strong>iteradores</strong> y <strong>algoritmos</strong>.</p>
<h2>Introducción a los contenedores</h2>
<p>Los contenedores de la STL son estructuras de datos capaces de contener casi cualquier tipo de objeto (hay algunas restricciones). Existen 3 tipos de clases contenedoras: contenedores de <strong>primera clase</strong>, <strong>adaptadores</strong> y <strong>casi-contenedores</strong>.</p>
<p>También podemos catalogar a los contenedores por el tipo. Existen 3 tipos de contenedores: <strong>Contenedores de secuencia</strong>, <strong>Contenedores asociativos</strong> y <strong>Adaptadores de contenedores</strong>. Vamos a ver una tabla con los tipos de contenedores que hay.</p>
<table class="table table-bordered">
<thead>
<tr>
<th>Clase Contenedora</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="2"><em>Contenedores de secuencia (primera clase)</em></td>
</tr>
<tr>
<td>vector</td>
<td>Inserción y eliminación rápida en la parte final. Acceso directo a cualquier elemento.</td>
</tr>
<tr>
<td>deque</td>
<td>Incersiones y eliminaciones rápidas en la parte inicial o final. Acceso aleatorio a cualquier elemento.</td>
</tr>
<tr>
<td>list</td>
<td>Lista con enlace doble, incersión y eliminación rápida en cualquier parte.</td>
</tr>
<tr>
<td colspan="2"><em>Contenedores asociativos (primera clase)</em></td>
</tr>
<tr>
<td>set</td>
<td>Búsqueda rápida, no se permiten duplicados.</td>
</tr>
<tr>
<td>multiset</td>
<td>Búsqueda rápida, se permiten duplicados</td>
</tr>
<tr>
<td>map</td>
<td>Asociasión de uno a uno, no se permiten duplicados, búsqueda rápida basada en claves.</td>
</tr>
<tr>
<td>multimap</td>
<td>Asociasión de uno a uno, se permiten duplicados, búsqueda rápida basada en claves.</td>
</tr>
<tr>
<td colspan="2"><em>Adaptadores de contenedores</em></td>
</tr>
<tr>
<td>stack</td>
<td>Último en entrar primero en salir (UEPS).</td>
</tr>
<tr>
<td>queue</td>
<td>Primero en entrar, primero en salir (PEPS).</td>
</tr>
<tr>
<td>priority_queue</td>
<td>El elemento de mayor prioridad siempre es el primero en salir.</td>
</tr>
</tbody>
</table>
<p>Las contenedores de secuencia representan estructuras de datos lineales tales come vectores y listas enlazadas. Los contenedores asociativos representan estructuras de datos no lineales que por lo general pueden localizar elementos almacenados en ellos rápidamente. Dichos elementos pueden almacenar conjuntos de valores, o pares clave/valor. Los contenedores de secuencia y los contenedores asociativos son los contenedores de primera clase. Las pilas (stack), las colas (queue) y las colas priorizadas (priority queue) son en realidad versiones restringidas de los contenedores de secuencia. Por esta razón la STL los implementa como adaptadores de contenedores que permiten a un programa ver un contenedor de secuencia de manera restringida.</p>
<p>Existen otro tipo de contenedores los conocidos como casi-contenedores que son los arreglos basados en punteros tipo C,  los contenedores <strong>bitset </strong>para mantener conjuntos de valores de bandera y contenedores <strong>valarray</strong> para llevar a cabo operaciones vectoriales matemáticas de alta velocidad (esta última clase esta optimizada para un buen rendimiento del compilador y no es tan flexible como los contenedores de primera clase). Se les consideran casi-contenedores porque guardan similitud con los contenedores, pero no soportan todas sus capacidades. El tipo string de la STL, por ejemplo, soporta la misma funcionalidad que un contenedor de secuencia, pero sólo almacena datos de tipo carácter.</p>
<h3>Funciones comunes de los contenedores</h3>
<p>La mayoría de contenedores de la STL proporcionan una funcionalidad similar. Hay muchas operaciones genéricas, como el método <strong>size</strong>, que se aplica a todos los contenedores. La siguiente tabla muestra los métodos comunes en todos los contenedores</p>
<div class="alert"><span class="label label-warning pull-right">Aviso</span> Los operadores sobrecargados <code>operator&lt;</code>, <code>operator&lt;=</code>, <code>operator&gt;</code>, <code>operator&gt;=</code>, <code>operator==</code> y <code>operator!=</code> no se proporcionan para contenedores <em>priority_queue</em>.</div>
<table class="table table-bordered">
<thead>
<tr>
<th>Funciones miembros comunes</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td>constructor predeterminado</td>
<td>Un constructor para crear un contenedor vacío. Por lo general, cada contenedor cuenta con varios constructores que proporcionan distintos métodos de inicialización.</td>
</tr>
<tr>
<td>constructor de copia</td>
<td>Un constructor que inicializa al contenedor para que sea una copia de un contenedor existente del mismo tipo.</td>
</tr>
<tr>
<td>destructor</td>
<td>La función destructora para encargarse de la limpieza, una vez que el contenedor ya no sea necesario.</td>
</tr>
<tr>
<td>empty</td>
<td>Devuelve <strong>true</strong> si no hay elementos en el contenedor, en caso contrario devuelve <strong>false</strong>.</td>
</tr>
<tr>
<td>insert</td>
<td>Inserta un elemento en el contenedor.</td>
</tr>
<tr>
<td>size</td>
<td>Devuelve el número de elementos que hay actualmente en el contenedor.</td>
</tr>
<tr>
<td>operator=</td>
<td>Asigna un contenedor a otro.</td>
</tr>
<tr>
<td>operator<</td>
<td>Devuelve <strong>true</strong> si el primer contenedor es menor que el segundo, en caso contrario devuelve <strong>false</strong>.</td>
</tr>
<tr>
<td>operator<=</td>
<td>Devuelve <strong>true</strong> si el primer contenedor es menor o igual que el segundo, en caso contrario devuelve <strong>false</strong>.</td>
</tr>
<tr>
<td>operator></td>
<td>Devuelve <strong>true</strong> si el primer contenedor es mayor que el segundo, en caso contrario devuelve <strong>false</strong>.</td>
</tr>
<tr>
<td>operator>=</td>
<td>Devuelve <strong>true</strong> si el primer contenedor es mayor o igual que el segundo, en caso contrario devuelve <strong>false</strong>.</td>
</tr>
<tr>
<td>operator==</td>
<td>Devuelve <strong>true</strong> si el primer contenedor es igual que el segundo, en caso contrario devuelve <strong>false</strong>.</td>
</tr>
<tr>
<td>operator!=</td>
<td>Devuelve <strong>true</strong> si el primer contenedor es distinto que el segundo, en caso contrario devuelve <strong>false</strong>.</td>
</tr>
<tr>
<td>swap</td>
<td>Intercambia los elementos de dos contenedores.</td>
</tr>
<tr>
<td colspan="2"><em>Funciones que solo se enecuentran en contenedores de primera clase</em></td>
</tr>
<tr>
<td>max_size</td>
<td>Devuelve el número máximo de elementos para un contenedor.</td>
</tr>
<tr>
<td>begin</td>
<td>Las dos versiones de esta función devuelven ya sea un <strong>iterator</strong> o un <strong>const_iterator</strong> que hace referencia al primer elemento del contenedor.</td>
</tr>
<tr>
<td>end</td>
<td>Las dos versiones de esta función devuelven ya sea un <strong>iterator</strong> o un <strong>const_iterator</strong> que hace referencia a la siguiente posición después del final del contenedor.</td>
</tr>
<tr>
<td>rbegin</td>
<td>Las dos versiones de esta función devuelven ya sea un <strong>reverse_iterator</strong> o un <strong>const_revese_iterator</strong> que hace referencia al último elemento del contenedor.</td>
</tr>
<tr>
<td>rend</td>
<td>Las dos versiones de esta función devuelven ya sea un <strong>reverse_iterator</strong> o un <strong>const_revese_iterator</strong> que hace referencia a la posición que está antes del primer elemento del contenedor.</td>
</tr>
<tr>
<td>erase</td>
<td>Elimina uno o más elementos del contenedor.</td>
</tr>
<tr>
<td>clear</td>
<td>Elimina todos los elementos del contenedor.</td>
</tr>
</tbody>
</table>
<h3>Archivos de encabezado de la STL</h3>
<p>En la siguiente tabla se muestran los archivos de encabezado necesarios para los distintos contenedores. Todo el contenido de estos archivos de encabezado está dentro del <code>namespace std</code></p>
<table class="table table-bordered">
<thead>
<tr>
<th colspan="2">Archivos de encabezado de la STL</th>
</tr>
</thead>
<tbody>
<tr>
<td>&lt;vector&gt;</td>
<td></td>
</tr>
<tr>
<td> &lt;list&gt;</td>
<td></td>
</tr>
<tr>
<td> &lt;deque&gt;</td>
<td></td>
</tr>
<tr>
<td> &lt;queue&gt;</td>
<td>Contiene tanto a queue como a priority_queue.</td>
</tr>
<tr>
<td> &lt;stack&gt;</td>
<td></td>
</tr>
<tr>
<td> &lt;map&gt;</td>
<td>Contiene tanto a map como a multimap.</td>
</tr>
<tr>
<td> &lt;set&gt;</td>
<td>Contiene tanto a set como a multiset</td>
</tr>
<tr>
<td> &lt;valarray&gt;</td>
<td></td>
</tr>
<tr>
<td> &lt;bitset&gt;</td>
<td></td>
</tr>
</tbody>
</table>
<h3>Definiciones <strong>typedef</strong> comunes de los contenedores de primera clase</h3>
<p>En la siguiente tabla se muestran los elementos <code>typedef</code> (para crear sinónimos o alias de tipos extensos) comunes que se encuentran en los contenedores de primera clase. Estos elementos <code>typedef</code> se utilizan en declaraciones genéricas de variables, parámetros a funciones y valores de retorno de las funciones. Por ejemplo, <code>value_type</code> en contenedor es siempre un <code>typedef</code> que representa el tipo de valor almacenado en el contenedor.</p>
<table class="table table-bordered">
<thead>
<tr>
<th>typedef</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td>allocator_type</td>
<td>El tipo de objeto utilizado para aasignar la memoria del contenedor.</td>
</tr>
<tr>
<td>value_type</td>
<td>El tipo de elemento almacenado en el contenedor.</td>
</tr>
<tr>
<td>reference</td>
<td>Una referencia al tipo de elemento almacenado en el contenedor.</td>
</tr>
<tr>
<td>const_reference</td>
<td>Una referencia constante al tipo de elemento almacenado en el contenedor. Dicha referencia sólo puede ser utilizada para <em>leer</em> elementos y colocarlos en el contenedor, y para realizar operaciones const.</td>
</tr>
<tr>
<td>pointer</td>
<td>Un puntero al tipo de elemento almacenado en el contenedor.</td>
</tr>
<tr>
<td>const_pointer</td>
<td>Un puntero al tipo de elemento constante almacenado en el contenedor.</td>
</tr>
<tr>
<td>iterator</td>
<td>Un iterador que apunta al tipo de elemento almacenado en el contenedor.</td>
</tr>
<tr>
<td>const_iterator</td>
<td>Un iterador constante que apunta al tipo de elemento almacenado en el contenedor y que solo puede utilizarse para <em>leer</em> elementos.</td>
</tr>
<tr>
<td>reverse_iterator</td>
<td>Un iterador inverso que apunta al tipo de elemento almacenado en el contenedor. Este tipo de iterador es para iterar a través de un contenedor en sentido inverso.</td>
</tr>
<tr>
<td>const_reverse_iterator</td>
<td>Un iterador inverso constante que apunta al tipo de elemento almacenado en el contenedor y que solo puede utilizarse para <em>leer</em> elementos. Esti tipo de iterador es para iterar a través del contenedor en sentido inverso.</td>
</tr>
<tr>
<td>difference_type</td>
<td>El tipo del resultado obtenido al restar dos iteradores que hacen referencia al mismo contenedor (<code>operator-</code> no está definido para iteradores de contenedores list ni contenedores asociativos).</td>
</tr>
<tr>
<td>size_type</td>
<td>El tipo utilizado para contar elementos en un contenedor e indizar a través de un contenedor de secuencia (no se puede indizar a través de un contenedor list).</td>
</tr>
</tbody>
</table>
<p>Al utilizar contenedores de la STL, es importante asegurar que el tipo de elemento que vaya a almacenarse en el contenedor soporte un conjunto mínimo de funcionalidad. Al insertar un elemento en un contenedor, se crea una copia de ese elemento. Por esta razón el tipo de elemento debe proporcionar su propio constructor copia y operador de asignación (esto solo se requiere si la copia y la asignación predeterminada a nivel de miembro no se realizan operaciones apropiadas de copia y asignación para el tipo de elemento). Además, los contenedores asociativos y muchos algoritmos requieren de la comparación de elementos. Por esta razón, el tipo del elemento debe proporcionar un operador de igualdad <code>==</code> y un operador menor que <code><</code>.</p>
<div class="alert alert-info">
Técnicamente, los contenedores de la STL no requieren comparar sus elementos con los operadores de igualdad y menor que, a menos que un programa utilice una método del contenedor que deba comparar elementos (por ejemplo, la función <code>sort</code> en la clase <strong>list</strong>). Por desgracia, algunos compiladores de C++ previos al estándar no son capaces de ignorar la parte de la plantilla que no se utiliza en un programa específico. En los compiladores con este problema, tal vez deba sobrecargar los operadores <code>==</code> y <code><</code> de los objetos que vayas a insertar en un contenedor de la STL.
</div>
<p>Hemos visto una introducción a los contenedores los tipos que hay las funciones miembros comunes a ellos, sus archivos de encabezado y los <code>typedef</code> comunes. En el siguiente artículo haremos una introducción a los iteradores y en los sucesivos empezaremos a ver específicamente cada contenedor y usarlos en la práctica.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li ><a href="http://razonartificial.com/2010/07/el-juego-de-la-vida-en-c/" class="wp_rp_title">El juego de la vida en C++</a></li><li ><a href="http://razonartificial.com/2012/07/curso-expertos-en-desarrollo-de-videojuegos/" class="wp_rp_title">Curso Expertos en desarrollo de Videojuegos</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2010/04/engine-iii-juegos-basados-en-tiles/" class="wp_rp_title">Engine III: Juegos basados en tiles</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/ia3EkOOXQ38" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/</feedburner:origLink></item>
		<item>
		<title>Guía aprender programar videojuegos con C++</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/JpDtiq0dCl0/</link>
		<comments>http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 01:39:35 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Juegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1190</guid>
		<description><![CDATA[Si me preguntaran sobre cual es el mejor lenguaje para programar videojuegos, diría que depende. Depende del próposito, plataforma, tipo de juego y un sin fin de detalles más. Pero si me dijeran que dijera el más general, el más usado, el más potente y en el que estén hechos la mayoría de las superproducciones de las grandes compañías diría C++ sin pensármelo dos veces. C++ es el lenguaje por excelencia en el mundo de los videojuegos debido a que combina el bajo nivel y la eficiencia que da C con la programación orientada a objetos que es casi imprescindible en la programación de videojuegos. El problema es que para los recién llegados al mundo de la programación empiezan a investigar y mucha gente les mete miedo diciendo que C++ es muy complejo y que no es un buen lenguaje para comenzar, esto es una verdad a medias, es cierto que hay lenguajes de más alto nivel que simplifican ciertas cosas a cambio de sacrificar control y eficiencia, pero por lo menos en mi caso eso es mucho peor para aprender. Me explico, cuando uno está aprendiendo tienen que entender el porqué de las cosas, cual es la finalidad de esto o lo otro, [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1191" title="cpp" src="http://razonartificial.com/wp-content/uploads/2010/12/cpp.jpg" alt="" width="340" height="255" /></p>
<p>Si me preguntaran sobre cual es el mejor lenguaje para programar videojuegos, diría que depende. Depende del próposito, plataforma, tipo de juego y un sin fin de detalles más. Pero si me dijeran que dijera el más general, el más usado, el más potente y en el que estén hechos la mayoría de las superproducciones de las grandes compañías diría <strong>C++</strong> sin pensármelo dos veces.<strong> C++</strong> es el lenguaje por excelencia en el mundo de los videojuegos debido a que combina el bajo nivel y la eficiencia que da <strong>C</strong> con la programación orientada a objetos que es casi imprescindible en la programación de videojuegos.</p>
<p>El problema es que para los recién llegados al mundo de la programación empiezan a investigar y mucha gente les mete miedo diciendo que C++ es muy complejo y que no es un buen lenguaje para comenzar, esto es una verdad a medias, es cierto que hay lenguajes de más alto nivel que simplifican ciertas cosas a cambio de sacrificar control y eficiencia, pero por lo menos en mi caso eso es mucho peor para aprender. Me explico, cuando uno está aprendiendo tienen que entender el porqué de las cosas, cual es la finalidad de esto o lo otro, porque mejor usar este tipo de dato o este otro. Eso con lenguajes de alto nivel se pierde, te abstraen tanto del hardware y el bajo nivel que no comprendes porque se usan ciertas cosas. Se aprende &#8220;porque sí&#8221; y no se está aprendiendo realmente como funcionan las cosas. Con C++ tienes que comprender que es lo que está haciendo el ordenador y porque las cosas se hacen así. Yo sinceramente aprendo mejor las cosas cuando entiendo el porqué que cuando de me dicen: &#8220;simplemente es así&#8221;. Así que animo a todos los nuevos programadores a no tener miedo y a empezar a programar con C++ y a entender las cosas. Muchas veces nos dicen que son complejas, pero no es cierto al fin y al cabo la programación es sencilla, se complica cuando se empieza a abstraer y abstraer, pero de eso ya habrá tiempo.</p>
<p>Otro de los grandes escollos una vez se decide empezar con C++ es el temido &#8220;¿Por dónde empezar&#8221; muchos potenciales programadores se desaniman al poco tiempo porque no encuentran algo que les enseñe desde cero o se desmotivan viendo que tienen simples programas de consola, ¡Ellos quería programar videojuegos, no letras blancas sobre un fondo negro! Sobre esto último no puedo ayudar mucho, es la única forma de empezar, es muy difícil aprender conceptos básicos con aplicaciones gráficas. Sobre lo primero voy a intentar ayudar sobre el cámino que yo seguiría.</p>
<p>En la red hay mucha documentación para aprender a programar videojuegos, la mayoría como sabrás, en inglés (es lo que hay) de todas maneras en esta comunidad tratamos de generar y recomendar contenido en español y voy a intentar que así sea en esta pequeña guía de como aprender a programar videojuegos con C++.</p>
<h2>1. Aprende C++</h2>
<p>Parece obvio, pero a veces no lo es tanto. Para empezar basta con usar un editor de texto con el que generar los ficheros fuentes y un complidador, yo recomiendo el compilador gnu gcc (g++ para C++) y el IDE <a href="http://codelite.org/">Codelite</a>. Pero eso es cuestión de cada uno, hay muchos IDE y compiladores C++.</p>
<p>Una ves tengas eso necesitas un manual/curso/tutorial de C++ que te enseñe desde el principio. Puedes comprar un libro (hay muchos y muy buenos) buscar alguno en ingés en google (también los hay muy buenos), pero como dijimos antes vamos a tratar de darte una opción en español. Yo te recomiendo el curso de ConClase es muy popular y de los mas visitados en la red, un curso completo de C++ en español y gratuito.</p>
<ul>
<li><a href="http://c.conclase.net/curso/">http://c.conclase.net/curso/</a></li>
</ul>
<p>A la vez que aprendes C++ te recomiendo que busques y leas mucho acerca de Algoritmos, métodos de programación y estructuras de datos. Lee y lee mucho pues es la única forma de aprender.</p>
<p>Una web que debería tener a mano todo programador de C++ es la siguiente, contiene toda la referencia de las bibliotecas estándar de C++, es bueno tenerla a mano siempre.</p>
<ul>
<li><a href="http://www.cplusplus.com/reference/">http://www.cplusplus.com/reference/</a> (inglés)</li>
</ul>
<h2>2. La STL</h2>
<p>Una vez te defiendas con C++ a un nivel básico te darás cuenta que hacer ciertas cosas es algo tedioso, existe una colección de Bibliotecas que son un Standard de C++ y que la mayoría de los compiladores actuales trae llamada <a href="http://www.sgi.com/tech/stl/">STL</a>, La STL es casi fundamental para no volverte loco cuando los programas se vuelven complejos y necesitas tipos de datos avanzados. Descubrirás que contiene plantillas que facilitan el uso de tipos de datos avanzados como cadenas, vectores, diccionarios y un largo etcétera de utilidades.</p>
<p>A continuación dejo algunos documentos muy útiles para aprender a usar la STL.</p>
<ul>
<li><a href="http://geneura.ugr.es/~gustavo/stl/stl.html">http://geneura.ugr.es/~gustavo/stl/stl.html</a></li>
<li><a href="http://decsai.ugr.es/~jfv/ed1/c++/cdrom4/paginaWeb/stl.htm">http://decsai.ugr.es/~jfv/ed1/c++/cdrom4/paginaWeb/stl.htm</a></li>
<li><a href="http://www.zator.com/Cpp/E5.htm">http://www.zator.com/Cpp/E5.htm</a></li>
<li><a href="http://gabarro.org/wiki/STL_vector">http://gabarro.org/wiki/STL_vector</a></li>
<li><a href="http://mictlan.utm.mx/arreglos.html">http://mictlan.utm.mx/arreglos.html</a></li>
</ul>
<h2>3. Vamos a por los juegos</h2>
<p>Aunque espero que durante las etapas anteriores hayas tenido imaginación y empezaras a crear tus propios juegos en modo consola tales como ahorcados, adivina el número, hundir la flota, etc. Ha llegado la parte de empezar con aplicaciones gráficas. Aquí uno debe elegir que camino tomar. Para los videojuegos el camino sería aprender a usar una biblioteca 2D. Muchos se desilusionan en este punto nueva mente porque ellos quieren hacer super juegos 3D que compitan con el último juego de moda, pero primero se debe aprender a caminar para después correr. Aprender como se trabaja en un proyecto de videojuego y con bibliotecas externas, aprender a usar imágenes y conceptos de programación gráfica.</p>
<p>Existen varias bibliotecas gráficas con las que empezar, pero mi recomendación es <a href="http://www.libsdl.org/">SDL</a>, tiene bastante reputación en el mundo de los videojuegos 2D, es simple y existe mucha documentación. En este apartado es cuando es más difícil encontrar documentación en español, pero existe un gran trabajo en español en forma de wiki perfecto para comenzar en este maravilloso mundo.</p>
<ul>
<li><a href="http://softwarelibre.uca.es/wikijuegos/">http://softwarelibre.uca.es/wikijuegos/</a></li>
</ul>
<p>Esto estupendo tutorial no se limita a mostrat y explicar las características de SDL, sino que trata de explicar el buen uso de la misma y finalmente tiene el desarrollo de un videojuego paso a paso. Totalmente recomendada para iniciarse con gráficos.</p>
<h2>4. Sigue aprendiendo</h2>
<p>A estas alturas ya habrás aprendido una base y sabrás que camino debes seguir, que cosas debes aprender y como tienes que moverte. En todo momento tienes que estar leyendo, documentándote y aprendiendo es la única forma de poder entrar en este mundo del desarrollo de videojuegos que está avanzando cada día. Para eso te recomiendo un par de webs sobre programación de videojuegos, desgraciadamente, la mayoría en inglés.</p>
<ul>
<li><a href="http://gpwiki.org/">http://gpwiki.org/</a> &#8211; Impresindible tenerla en favoritos para todo programador de videojuegos. La wiki por excelencia del desarrollo de videojuegos.</li>
<li><a href="http://www.gamedev.net/">http://www.gamedev.net/</a> &#8211; Otra muy importante, comunidad muy activa, te enterarás de las últimas novedades y en los foros siempre hay alguien dispuesto ayudar, siempre que sepas inglés.</li>
<li><a href="http://www.gamasutra.com/">http://www.gamasutra.com/</a> &#8211; A tener muy encuenta, ofertas de trabajo, grandes artículos&#8230; Añadela a tu lista de webs a  mirar cada día.</li>
<li><a href="http://www.stratos-ad.com/">http://www.stratos-ad.com/</a> &#8211; La comunidad más grande de desarrollo en español. Puedes encontrar muy buenas cosas en los foros.</li>
<li><a href="http://www.google.com/">http://www.google.com/</a> &#8211; No no es coña, está es la más importante de todas. Lo de arriba es una guía para comenzar, pero te surgirán miles de dudas a cada paso que des. Google es tu amigo, lo sabe casi todo y lo resuelve casi todo si sabes buscar bien. Aprende si no sabes a usar todos los trucos de google. Un programador y más uno de videojuegos debe ser autodidacta y aprender a buscarse la vida en este competitivo y apasionante mundo.</li>
</ul>
<p>Espero que te sirva de algo esta pequeña guía si quieres adentrarte en el mundo de la programación de videojuegos y no sabias como hacerlo.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li><li ><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" class="wp_rp_title">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/JpDtiq0dCl0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/</feedburner:origLink></item>
		<item>
		<title>Proyecto Generic Game Engine</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/n8cu6ShVTyE/</link>
		<comments>http://razonartificial.com/2012/02/proyecto-generic-game-engine/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 21:19:59 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Generic Game Engine]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Bibliotecas]]></category>
		<category><![CDATA[Engine]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[SFML]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1859</guid>
		<description><![CDATA[Muchos de los que me siguen en twitter ya lo habrán visto, pero para todo los demás comunicar que estoy desarrollando un Framework básico para juegos 2D en C++ basado en SFML y otras bibliotecas libres multiplataforma. La idea no es nueva es la continuación del Basic Game Engine que estaba desarrollando, pero ahora con un enfoque algo más amplio y con esperanza que sea un proyecto de comunidad. Paso a comentar el poryecto. Objetivo del proyecto El objetivo es crear un Framework que facilite la programación de videojuegos encargandose de las tareas más típicas y repetitivas, dejando al programador solo la lógica y mecánica del juego. ¿Otro Framework? Ya hay muchos y mejores No se trata de competir con Frameworks profesionales o con una gran comunidad detrás, véase Cocos2D, que tienen soporte para dispositivos móviles, Sistemas Operativos, etc. La idea de este proyecto es el aprendizaje, enfrentarse a los problemas reales de la programación de videojuegos y poder comentarla en el blog. ¿Qué es exactamente? Consiste en facilitar las rutinas típicas del desarrollo de videojuegos como control de escenas, gestor de recursos, dibujado de sprites, animaciones, detección de colisiones, dibujado de mapas basados en tiles, física, Scroll Parallax, algoritmos [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-1837" title="logo" src="http://razonartificial.com/wp-content/uploads/2012/02/logo-248x250.png" alt="" width="248" height="250" /></p>
<p>Muchos de los que me siguen en <a href="http://twitter.com/#!/razonartificial">twitter</a> ya lo habrán visto, pero para todo los demás comunicar que estoy desarrollando un Framework básico para juegos 2D en C++ basado en SFML y otras bibliotecas libres multiplataforma.</p>
<p>La idea no es nueva es la continuación del Basic Game Engine que estaba desarrollando, pero ahora con un enfoque algo más amplio y con esperanza que sea un proyecto de comunidad. Paso a comentar el poryecto.</p>
<h2>Objetivo del proyecto</h2>
<p>El objetivo es crear un Framework que facilite la programación de videojuegos encargandose de las tareas más típicas y repetitivas, dejando al programador solo la lógica y mecánica del juego.</p>
<h3>¿Otro Framework? Ya hay muchos y mejores</h3>
<p>No se trata de competir con Frameworks profesionales o con una gran comunidad detrás, véase Cocos2D, que tienen soporte para dispositivos móviles, Sistemas Operativos, etc. La idea de este proyecto es el aprendizaje, enfrentarse a los problemas reales de la programación de videojuegos y poder comentarla en el blog.</p>
<h2>¿Qué es exactamente?</h2>
<p>Consiste en facilitar las rutinas típicas del desarrollo de videojuegos como control de escenas, gestor de recursos, dibujado de sprites, animaciones, detección de colisiones, dibujado de mapas basados en tiles, física, Scroll Parallax, algoritmos de inteteligencia artificial como PathFinding, etc.</p>
<p>No trata de reinventar la rueda. Usamos herramientas ya hechas y consolidadas. Usamos SFML para la gestión multimedia: ventana, dispositivos de entrada, gráficos, audio y network. PugiXML para el parser de documentos XML, Box2D para tratamiento de física, Tiled Map Editor para realizar mapas basados en tiles. No tratamos de revolucionar estas herramientas sino de crear un marco de trabajo para unirlas y usarlas fácilmente.</p>
<h2>Mola, ¿Puedo ayudar?</h2>
<p>La idea es que sea un proyecto comunitario que hagan más fácil el trabajo. Que los participantes escriban acerca de lo que hacen y porqué lo hacen así para poder compartirlo con los demás y ganar experiencia. También puedes colaborar usando el Framework para realizar juegos de ejemplos, si te estás iniciando en la programación de videojuegos es la herramienta perfecta pues te ayudará a dar tus primeros pasos en este mundo sin muchas complicaciones.</p>
<p>Si quieres más información puedes entrar en la web del proyecto: <a href="http://razonartificial.com/GGE/">http://razonartificial.com/GGE/</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li><li ><a href="http://razonartificial.com/2011/03/introduccion-a-pysfml/" class="wp_rp_title">Introducción a PySFML</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" class="wp_rp_title">[BGE] Sistema base del Engine</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/n8cu6ShVTyE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/02/proyecto-generic-game-engine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/02/proyecto-generic-game-engine/</feedburner:origLink></item>
		<item>
		<title>Tileset isometrico – Grassland</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/ONvKfmpNIWc/</link>
		<comments>http://razonartificial.com/2012/02/tileset-isometrico-grassland/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 19:45:30 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Recursos Gráficos]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[Isométrico]]></category>
		<category><![CDATA[Tileset]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1852</guid>
		<description><![CDATA[Tileset isométrico de gran calidad para exteriores que combina con los publicados anteriormente, otra vez obra de los chicos del proyecto Flare, un rpg libre que está haciendo estos gráficos de calidad y poniendolos a disposición de todos. Está creado por pfunked y tiene licencia GPL 3.0. Estos tilesets están pesados para ser usado con el Tiled Map Editor, pero se puede adaptar a cualquier herramienta de cración de mapas. Descargar tileset Tileset isométrico de gran calidadOtro tileset isométrico muy bueno &#8211; CavernasCrear tiles isométricos 2D con BlenderPack de gráficos para juegosGráficos para prototipos de juegosZemanta]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://razonartificial.com/wp-content/uploads/2012/02/grassland.jpg"><img class="aligncenter size-medium wp-image-1855 imageborder" title="grassland" src="http://razonartificial.com/wp-content/uploads/2012/02/grassland.jpg" alt="" width="550" height="344" /></a></p>
<p>Tileset isométrico de gran calidad para exteriores que combina con los publicados anteriormente, otra vez obra de los chicos del proyecto <a href="http://clintbellanger.net/rpg/">Flare</a>, un rpg libre que está haciendo estos gráficos de calidad y poniendolos a disposición de todos. Está creado por <strong>pfunked </strong>y tiene licencia <strong>GPL 3.0</strong>.</p>
<p>Estos tilesets están pesados para ser usado con el <a href="http://razonartificial.com/2010/12/tiled-map-editor-el-editor-de-mapas-libre/">Tiled Map Editor</a>, pero se puede adaptar a cualquier herramienta de cración de mapas.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2012/02/grassland_tiles.png">Descargar tileset</a></li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" class="wp_rp_title">Tileset isométrico de gran calidad</a></li><li ><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" class="wp_rp_title">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li ><a href="http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/" class="wp_rp_title">Crear tiles isométricos 2D con Blender</a></li><li ><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" class="wp_rp_title">Pack de gráficos para juegos</a></li><li ><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" class="wp_rp_title">Gráficos para prototipos de juegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/ONvKfmpNIWc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/02/tileset-isometrico-grassland/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/02/tileset-isometrico-grassland/</feedburner:origLink></item>
		<item>
		<title>[Curso C++] – Primer Juego – Game Over!</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/t2Q-mtfX__0/</link>
		<comments>http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 23:25:45 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Curso]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1806</guid>
		<description><![CDATA[Bueno vamos con nuestro primer juego en C++. en mi caso utilizo el editor IDE Geany con un terminal empotrado sobre el Sistema Operativo Ubuntu que me viene de perlas para hacer pruebas sobre la marcha, dejo una captura (Click para ver en grande). Nuestro primer juego Nuestro primer juego es el típico programa que muestra por consola el mensaje &#8220;Hola Mundo&#8221; de todos los cursos de programación, pero como esto es un curso de programación de videojuegos vamos a cambiar el mensaje por &#8220;Game Over!&#8221;. Pues venga, manos a la obra, abrimos nuestro editor y creamos un archivo llamado main.cpp en realidad puede llamarse como queramos pero es algo establecido que el archivo de entrada a todo programa escrito en C++ se llame main, el .cpp es la estención de los archivos de código de C++. Dentro del archivo escribimos el siguiente código, es tan corto nuestro juego que lo vamos a copiar del tirón y luego lo explicamos. Antes de explicarlo vamos a compilar y ejecutar. Para el que sea muy nuevo en esto decir que compilar es el proceso de coger un programa escrito en un lenguaje de programación y convertirlo en lenguaje máquina para acontinuación crear [...]]]></description>
				<content:encoded><![CDATA[<p>Bueno vamos con nuestro primer juego en C++. en mi caso utilizo el editor IDE Geany con un terminal empotrado sobre el Sistema Operativo Ubuntu que me viene de perlas para hacer pruebas sobre la marcha, dejo una captura (Click para ver en grande).</p>
<p style="text-align: center;"><a href="http://razonartificial.com/wp-content/uploads/2012/01/Área-de-trabajo-1_007.png"><img class="aligncenter  wp-image-1807" title="Área de trabajo 1_007" src="http://razonartificial.com/wp-content/uploads/2012/01/Área-de-trabajo-1_007.png" alt="" width="640" height="400" /></a></p>
<h2>Nuestro primer juego</h2>
<p>Nuestro primer juego es el típico programa que muestra por consola el mensaje &#8220;Hola Mundo&#8221; de todos los cursos de programación, pero como esto es un curso de programación de videojuegos vamos a cambiar el mensaje por &#8220;Game Over!&#8221;.</p>
<p>Pues venga, manos a la obra, abrimos nuestro editor y creamos un archivo llamado <strong>main.cpp</strong> en realidad puede llamarse como queramos pero es algo establecido que el archivo de entrada a todo programa escrito en C++ se llame main, el .cpp es la estención de los archivos de código de C++.</p>
<p>Dentro del archivo escribimos el siguiente código, es tan corto nuestro juego que lo vamos a copiar del tirón y luego lo explicamos.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;iostream&gt;

/*
 * Esta es la función principal del programa.
 * Todo programa escrito en C++ debe de tener una función main.
 */

int main()
{
	// Muestra el mensaje &quot;Game Over!&quot; en la consola
	std::cout &lt;&lt; &quot;Game Over!&quot; &lt;&lt; std::endl;
	return 0;
}
</pre>
<p>Antes de explicarlo vamos a compilar y ejecutar. Para el que sea muy nuevo en esto decir que compilar es el proceso de coger un programa escrito en un lenguaje de programación y convertirlo en lenguaje máquina para acontinuación crear un ejecutable, si andas un poco perdido en todo esto te sugiero que busque por internet en cursos básicos, pues se sale del objetivo de este curso.</p>
<p>Como ya dije, yo explicaré como compilar y ejecutar en Linux, si estás en Windows o Mac (en mac es igual que en Linuz al ser un Unix) simplemente busca como se hace en tu Sistema Operativo en cualquier curso o en Google.</p>
<p>En Linux abrimos una consola (en mi caso ya habéis visto que la tengo empotrada en el editor y no necesito cambiar de ventana) y nos situamos en el directorio de nuestro juego que ya debe contener un archivo <strong>main.cpp</strong> que contiene nuestro código. A continuación pasamos a compilar con g++. Si nunca has compilado por consola no te preocupes, no tiene mucha ciencia y te explicaremos lo necesario.</p>
<pre>$ g++ main.cpp -o GameOver</pre>
<p>Como vemos simplemente es escribir el comando g++ seguido de los archivos .cpp que se quieren compilar, en este caso main.cpp, opcionalmente tenemos el argumento -o (es la vocal O en minúscula no un 0) mas un texto que será el nombre que tendrá el ejecutable, en este caso lo llamamos GameOver. Ahora simplemente hay que ejecutarlo:</p>
<pre>$ ./GameOver
Game Over!</pre>
<p>Perfecto, hace justo lo que esperabamos, imprimir por consola el mensaje &#8220;Game Over!&#8221; ahora vamos a explicar el código.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;iostream&gt;
</pre>
<p>La primera línea utiliza la directiva de preprocesador #include, se que si eres nuevo esto te habrá sonado a chino. Una directiva de preprocesador son unos comandos que están el en código que comienzan por una almoadilla # y que sirven para que el compilador haga ciertas tareas antes de compilar el programa (pasarlo a lenguaje máquina) en este caso la directiva <strong>#include</strong> sirve para incluir otro archivo dentro del actual, en este caso el archivo <strong>iostream </strong>que es una bibliteca estándar de C++, La biblioteca estándar de C++ es una coleeción de archivos útiles que contiene código ya escrito de uso muy común como entrada y salida de texto, operaciones matemáticas complejas, etc. En este caso utilizamos la biblioteca iostream que contiene la salida y entrada estándar por consola que no son otras que el monitor y el teclado.</p>
<p>En este caso nosotros la usaremos para utilizar cout que es la salida estandar en C++ y poder imprimir nuestro mensaje de Game Over!.</p>
<p>La segunda linea y la séptima son simplemente líneas en blanco, solo sirven para separar el código estéticamente ya que el compilador pasa de ellas.</p>
<p>La línea 3 a la 6 es un comentario estilo C. Los comentarios estilo C se escriben entre /* y  */  todo lo que haya entre esos dos símbolos el compilador lo ignora. Los comentarios sirven para los humanos podamos entender que hace cierto código. Cuando digo comentarios estilo C es porque como sabréis C++ es un lenguaje evolucionado de C por tanto todo programa escrito en C se podría compilar en C++ y los comentarios de este estilo son los de este lenguaje, en C++ se han incorporado otro tipo que ahora veremos.</p>
<p>La linea 8 es la función main que todo programa en C++ debe tener, cuando el programa se crea esta es la primera linea que se va a ejecutar, podemodemos verla como la puerta de entrada a C++. Las funciones en C++ tienen este aspecto:</p>
<pre class="brush: cpp; title: ; notranslate">
tipo nombre(tipo arg1, tipo arg2, ...)
{
    // Cuerpo de la función
    return tipo;
}
</pre>
<p>Una función es un trozo de código que hace una acción determinada y devuelve un resultado, muy parecido al concepto de función matemática, a las que tu les pasabas un valor y después de operar obetenias un resultado.</p>
<p>En C++ una función se escribe como arriba, primeri el tipo que se refiere al tipo de dato que devuelve, aún no hemos visto los que hay ya los veremos. A continuación el nombre de la función y entre paréntesis una lista de argumentos que ya veremos en mayor profundidad. Luego entre dos llaves va el cuerpo de la función y por último hay que devolver con la sentencia return el resultado que debe ser del tipo que especificamos arriba en la función, a menos que el tipo definido sea void, es decir, vacío que no habría que tener sentencia return.</p>
<p>Si os ha sonado todo esto un poco a chino no os preocupéis de momento, veremos las funciones más en detalle llegado el momento por ahora quedaos con que nos hace falta esas lineas para empezar un programa en C++.</p>
<pre class="brush: cpp; title: ; notranslate">
// Muestra el mensaje &quot;Game Over!&quot; en la consola
</pre>
<p>Este es el otro tipo de comentarios que encontraréis en C++, comienzan con dos barras // todo lo que este a la derecha de esas dos barras es ignorado por el compilador hasta la siguiente línea. Pueden estar junto a una linea de código:</p>
<pre class="brush: cpp; title: ; notranslate">
int x = 5; // Asignamos el valor 5 a la variable entera x
</pre>
<p>Vamos a la siguente línea de código.</p>
<pre class="brush: cpp; title: ; notranslate">
std::cout &lt;&lt; &quot;Game Over!&quot; &lt;&lt; std::endl;
</pre>
<p>Aquí vemos muchas cosas, lo primero es el uso de cout que como ya dijimos no es una palabra clave de C++ sino que se encuentra dentro de la biblioteca estándar de C++ y se utiliza para sacar mensajes por con sola, el std:: que le precede antes es el espacio de nombre al que pertenece. En este caso el de la biblioteca estándar es std, ya hablaremos de los espacios de nombre más adelante.</p>
<p>Veréis por ahi mucho esa línea así:</p>
<pre class="brush: cpp; title: ; notranslate">
cout &lt;&lt; &quot;Game Over!\n&quot;;
</pre>
<p>y esta línea añadida en la parte superior del código.</p>
<pre class="brush: cpp; title: ; notranslate">
using namespace std;
</pre>
<p>Es otra forma de hacerlo, quiere decir que vamos a usar el espacio de nombre std y no hace falta estar invocando a sus funciones y/o clases por medio de std:: yo lo desaconsejo totalmente pues al principio puede parecer una manera mucho más fácil, pero cuando te veas trabajando con varios espacios de nombres de varias bibliotecas a la vez será un caos porque llegara un momento en el que no sepas a que espacio de nombre pertenece que y lo mas complicado, puede haber dos bibliotecas con dos clases que se llamen igual. Por ahora no os preocupéis y hacedme caso.</p>
<p>seguimos explicando la línea, la potencia del control de flujos de C++ es algo que se sale de este tutorial, pero explicaremos lo básico que vayamos necesitando. En C++ la salida y entrada de datos se le llama flujo, pues los datos fluyen hacia el programa o hacia fuera, en C++ se usa &lt;&lt; para la salida de flujo y el &gt;&gt; para la entrada de flujo, en este caso cout quiere decir que fluya hacia la salida estándar lo que venga a continuación, es este caso es una cadena de carácteres: &#8220;Game Over!&#8221; las cadenas de caracteres, son eso, sucesiones de letras numero o símbolos puestos entre comillas.</p>
<p>hay una algunos caracteres especiales que se escriben con la barra invertida como son el salto de línea &#8220;\n&#8221; el tabulador &#8220;\t&#8221; o las mismas comillas &#8220;\&#8221;" ya que si quisieramos añadirlas a una cadena sin esta llamada &#8220;secuencia de escape&#8221; lo que haríamos sería terminar la cadena y daría error. Lo mismo para usar la barra invertida y que no se crea el compilador que es una secuencia de escape.</p>
<p>a continuación de la cadena, queremos añadir mas flujo por lo que volvemos a escribir &lt;&lt; y añadimos el siguiente flujo std::endl esto no es mas que el carácter de salto de fin de línea, hace la misma función que el \n, pero es mejor ponerlo así, ya veremos más adelante porque.</p>
<pre class="brush: cpp; title: ; notranslate">
return 0;
</pre>
<p>Por ultimo el return, como dijimos una función debe devolver un valor del tipo pasado, en esta ocasión escribimos int main() por lo que debe ser de tipo <strong>int</strong> el valor devuelto. Aún no hemos dado los tipos. El tipo int representa a un entero en C++ como puede ser el 1, 100, 4, -5, etc.. todos los números enteros. Por convención se suele hacer que un programa en C++ que termina correctamente debe devolver 0. Por eso hacemos que la función main devuelva 0.</p>
<p>Ya hemos termiando nuestro primer programa, se que muchas cosas se han quedado un poco en el límbo para los más novatos, pero poco a poco iréis comprendiendo mejor.</p>
<p>Ahora podemos coger nuestro juego y modificarlo para aprender a usar el cout y las secuencias de escape, haced algunas pruebas como las siguientes.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;iostream&gt;

/*
 * Esta es la función principal del programa.
 * Todo programa escrito en C++ debe de tener una función main.
 */

int main()
{
	// Muestra el mensaje &quot;Game Over!&quot; en la consola
	std::cout &lt;&lt; &quot;Game\nOver!&quot; &lt;&lt; std::endl; // Con un salto de linea
	std::cout &lt;&lt; &quot;\tGame Over!&quot; &lt;&lt; std::endl; // Tabulado
	std::cout &lt;&lt; &quot;\t\tGame Over!&quot; &lt;&lt; std::endl; // Dos tabulaciones
	std::cout &lt;&lt; &quot;Game&quot; &lt;&lt; &quot; &quot; &lt;&lt; &quot;Over!&quot; &lt;&lt; std::endl; // Imprime la misma que el original
	std::cout &lt;&lt; &quot;\&quot;Game Over!\&quot;&quot; &lt;&lt; std::endl; // Entrecomillado
	std::cout &lt;&lt; &quot;\\Game Over!\\&quot; &lt;&lt; std::endl; // Entre barras invertidas
	std::cout &lt;&lt; &quot;Hola Mundooooo!!!&quot; &lt;&lt; std::endl; // Otro mensaje

	return 0;
}
</pre>
<p>Compilarlo, ejecutad y mirar el resultado. Haced todas las pruebas que queráis para aprender a usar el cout que es la salida estándar.</p>
<p>Una última cosa que no he mencionado es que todas las sentencias en C++ deben acabar en punto y como como os habréis fijado. En este caso solo hay dos sentencias que son el cout y el retuen ya que los comentarios y las directivas de preprocesador no cuentan como sentencias. Al igual que los bloques de código que tienen cuerpo (que tienen {}) esto no es del todo cierto pues las clases si que tienen, pero ya veremos las clases a su debido tiempo.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" class="wp_rp_title">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/03/curso-programacion-de-videojuegos/" class="wp_rp_title">Curso programación de videojuegos</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/t2Q-mtfX__0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/</feedburner:origLink></item>
		<item>
		<title>Curso de Videojuegos en C++ – Presentación</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/pnM6f4RbxWA/</link>
		<comments>http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 20:32:45 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Curso]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1802</guid>
		<description><![CDATA[Bienvenidos a un nuevo colección de artículos, curso, guía o como lo queráis llamar de Razón Artificial. En esta ocasión la idea es enseñar a programar videojuegos en C++ a base de ejemplos e ir explicando las cosas paso a paso. Me di cuenta que en su día el Curso de Pygame tuvo bastante buena acogida porque en el proceso del tutorial se fue creando un juego, es decir, nos enfrentamos a un problema real y no a casos teóricos, esa es la idea que quiero seguir en estas nuevas entregas. Qué no es este curso Antes de nada quiero aclarar que esto no es un curso de iniciación a la programación, ni si quiera un curso de C++, aunque espera, no dejes de leer aún. La idea es ir explicando los conceptos de programación en C++ y de la programación de videojuegos a medida que se avanza. Se empezará elaborando juegos sencillos en modo consola y luego se pasarán a juegos gráficos en 2D, manejo de archivos, inteligencia artificial, etc. Tampoco es un curso de videojuegos 3D si alguien quiere seguir esto para hacer su propio Final Fantasy o Wordl of Warcraft, es un buen sitio para empezar pero [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1803" title="cpplogo" src="http://razonartificial.com/wp-content/uploads/2012/01/cpplogo.jpg" alt="" width="250" height="200" /></p>
<p>Bienvenidos a un nuevo colección de artículos, curso, guía o como lo queráis llamar de Razón Artificial. En esta ocasión la idea es enseñar a programar videojuegos en C++ a base de ejemplos e ir explicando las cosas paso a paso. Me di cuenta que en su día el Curso de Pygame tuvo bastante buena acogida porque en el proceso del tutorial se fue creando un juego, es decir, nos enfrentamos a un problema real y no a casos teóricos, esa es la idea que quiero seguir en estas nuevas entregas.</p>
<h3>Qué no es este curso</h3>
<p>Antes de nada quiero aclarar que esto no es un curso de iniciación a la programación, ni si quiera un curso de C++, aunque espera, no dejes de leer aún. La idea es ir explicando los conceptos de programación en C++ y de la programación de videojuegos a medida que se avanza. Se empezará elaborando juegos sencillos en modo consola y luego se pasarán a juegos gráficos en 2D, manejo de archivos, inteligencia artificial, etc.</p>
<p>Tampoco es un curso de videojuegos 3D si alguien quiere seguir esto para hacer su propio Final Fantasy o Wordl of Warcraft, es un buen sitio para empezar pero ni de lejos para terminar.</p>
<h3>Tengo una duda, ¿Te puedo mandar un correo?</h3>
<p>Poder, puedes, pero preferiría que las dudas las discutieramos en los comentarios de cada entrada así ayudaríamos a más usuarios que puedan tener la mismas dudas y ayudaríamos a enriquecer este curso con las aportaciones.</p>
<h3>Qué necesitamos</h3>
<p>Pues simplemente un compilador de C++ que esté mas o menos actualizado y un editor de texto, no voy a imponer ninguno, cada uno es libre de usar el que quiera. En cuanto al Sistema Operativo, también somos libres de usar el que queramos. Yo por mi parte usaré el Sistema Operativo Ubuntu y para los primeros juegos en modo consola solo usaré el IDE <a href="http://www.geany.org/">Geany</a> y una consola para compilar y ejecutar los juegos. Cuando pasemos a los juegos gráficos usaré la biblioteca <a href="http://www.sfml-dev.org/">SFML</a> para el control multimedia Gráficos, Audio, Entrada, etc. entonces pasaré a usar el IDE <a href="http://www.codelite.org/">Codelite</a> pues es más fácil para la gestión de proyectos y configurar las bibliotecas. Ambos IDEs son multiplataforma y explicaré como configurarlos tanto en Windows como en Linux. Aunque es muy fácil encontrar en internet muchos más y como configurarlos, eso ya queda a elección de cada uno.</p>
<h3>Organización</h3>
<p>Yo voy a trabajar de la siguiente manera, he creado una carpeta llamada curso y dentro de ella crearé una carpeta para cada juego que realicemos, así están todos en un mismo lugar y podemos consultar cosas de los juegos anteriores. Respeto a la organización del código en cada juego, lo iremos viendo con cada uno, en los primeros que serán simples no habrá que hacer divisiones, pero en futuros juegos más complejos separaremos en carpetas los archivos de cabecera y los de implementación, las bibliotecas, etc. Pero no os preocupéis llegado el momento todo eso lo explicaremos.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" class="wp_rp_title">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li ><a href="http://razonartificial.com/2011/03/curso-programacion-de-videojuegos/" class="wp_rp_title">Curso programación de videojuegos</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" class="wp_rp_title">Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/pnM6f4RbxWA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/</feedburner:origLink></item>
		<item>
		<title>[BGE] La clase App</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/uvd9GOOMylQ/</link>
		<comments>http://razonartificial.com/2011/09/bge-la-clase-app/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 21:15:25 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[BGE]]></category>
		<category><![CDATA[Engine]]></category>
		<category><![CDATA[Juegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1795</guid>
		<description><![CDATA[Por fin llegamos a la clase App, con esta clase empieza a cobrar algo de sentido todo lo anterior porque une lo visto hasta ahora, crea la ventana de la aplicación, etc. La clase App sigue, como el SceneManager, el patrón de diseño Singleton pues no tiene sentido tener más de un objeto App, cualquier intento de crear un nuevo objeto App devolverá la instancia única. Empezamos con las variables públicas. Como vemos lo primero que hacemos es declarar 3 constantes enteras con el modo de vídeo por defecto. Luego pasamos a las variables, están todas explicadas en los comentarios y se entiende su función claramente, cualquier duda podéis preguntar. como privadas también tenemos unas cuantas. Sin ninguna duda tampoco de la función que cumplen. Antes de ver los métodos vamos a ver un esquema del ciclo de ejecución y a continuación lo explicamos. Con la imagen a mano miramos el código de la clase. app.h app.cpp Como siempre lo primero que se ejecuta es el constructor que inicializa variables y constantes y creo un archivo de log. A continuación se llama a ProcessArguments que se encarga de procesar los argumentos pasados por linea de comandos, este método es opcional, [...]]]></description>
				<content:encoded><![CDATA[<p>Por fin llegamos a la clase App, con esta clase empieza a cobrar algo de sentido todo lo anterior porque une lo visto hasta ahora, crea la ventana de la aplicación, etc.</p>
<p>La clase App sigue, como el SceneManager, el patrón de diseño Singleton pues no tiene sentido tener más de un objeto App, cualquier intento de crear un nuevo objeto App devolverá la instancia única.</p>
<p>Empezamos con las variables públicas.</p>
<pre class="brush: cpp; title: ; notranslate">
// Constantes
///////////////////////////////////////////////////////////////////////////
static const unsigned int DEFAULT_VIDEO_WIDTH = 640;
static const unsigned int DEFAULT_VIDEO_HEIGHT = 480;
static const unsigned int DEFAULT_VIDEO_BPP = 32;

// Variables
///////////////////////////////////////////////////////////////////////////
/// Título de la ventana
std::string title;
/// Ventana de la aplicación
sf::RenderWindow window;
/// Modo de video (Width, Height, Bpp)
sf::VideoMode video_mode;
/// Opciones de la ventana
sf::WindowSettings window_settings;
/// Estilo de la ventana
unsigned long window_style;
/// Input manager de la ventana
const sf::Input&amp; input;
/// Log de la aplicación
std::ofstream log;
/// Puntero a Scene inicial
Scene* scene;
/// Puntero al SceneManager
SceneManager* scene_manager;
</pre>
<p>Como vemos lo primero que hacemos es declarar 3 constantes enteras con el modo de vídeo por defecto. Luego pasamos a las variables, están todas explicadas en los comentarios y se entiende su función claramente, cualquier duda podéis preguntar.</p>
<p>como privadas también tenemos unas cuantas.</p>
<pre class="brush: cpp; title: ; notranslate">
/// Código de salida de la aplicación
int exit_code;
/// Verdadero si la aplicación se está ejecutando
bool running;
/// Archivo de log de la aplicación
std::string log_file;
/// Reloj que obtiene el tiempo pasado en cada loop
sf::Clock update_clock;
/// Almacena el tiempo pasado en cada bucle
float update_time;
</pre>
<p>Sin ninguna duda tampoco de la función que cumplen.</p>
<p>Antes de ver los métodos vamos a ver un esquema del ciclo de ejecución y a continuación lo explicamos.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/09/App1.png" alt="" title="App" width="400" height="509" class="aligncenter size-full wp-image-1796" /></p>
<p>Con la imagen a mano miramos el código de la clase.</p>
<ul>
<li><a href="https://github.com/adrigm/Basic-Game-Engine/blob/master/src/BGE/app.h">app.h</a></li>
<li><a href="https://github.com/adrigm/Basic-Game-Engine/blob/master/src/BGE/app.cpp">app.cpp</a></li>
</ul>
<p>Como siempre lo primero que se ejecuta es el constructor que inicializa variables y constantes y creo un archivo de log.</p>
<p>A continuación se llama a <strong>ProcessArguments</strong> que se encarga de procesar los argumentos pasados por linea de comandos, este método es opcional, pero es útil para cuando se están creando los juegos pasarle comandos que hacen determinadas acciones de pruebas. De momento no está implementado el método simplemente imprime los comandos pasados en el log. La idea es que este método lo implemente el usuario para lo que le interese.</p>
<p>Luego  se llama a <strong>SetFirstScene</strong> que recibe una escena y la establece como la inicial, luego se verá mejor porque hacerlo aquí y así.</p>
<p>A continuación se llama al método <strong>Run</strong> que es el que ejecuta la aplicación, este método se encarga de llamar a los métodos <strong>PreInit</strong>, <strong>Init</strong>, <strong>Loop</strong> y <strong>cleanup</strong>.</p>
<p>El método PreInit aún no está implementado, se encarga de leer un archivo de configuración con las opciones de las aplicaciones y con estos datos crear la ventana.</p>
<p>Después se llama al Init, de momento se encarga de crear el SceneManager, se añade la primera escena a la cola y se pone como escena activa. En el futuro aquí se inicializarán también clases que lleven control de fps, etc.</p>
<p>Llegamos al método Loop que suele ser de los más importantes de un juego, aquí se encuentra nuestro bucle que va manejando el juego.</p>
<p>Lo primero que hace nuestro bucle es obtener los eventos del sistema, hay algunos por defecto que se encarga de manejar la aplicación de los que por ahora solo está implementado el de cierre y el resto de eventos se los mandamos a la escena activa.</p>
<p>Luego actualizamos nuestra variable de tiempo pasado en cada ciclo y reseteamos el reloj, recuerda que estas son variables privadas de la escena, pero que hay métodos para obtener este tiempo.</p>
<p>A continuación se llama al método Update de la escena activa y al método Draw, lo típico de todos los juegos.</p>
<p>Por último si recuerdas en el artículo anterior en la clase SceneManager habíamos declarado App como friend, es decir una clase amiga. Esto es que la clase App puede acceder a los miembros privados de SceneManager, la razón de esto es que si revisamos la clase SceneManager el método ChangeScene es privado, este método se encarga de cambiar el puntero de la escena activa a la indicada, si cambiáramos esto a la ligera en medio de una escena podría darnos un problema de memoria.</p>
<p>En lugar de eso tenemos como publico el método SetActiveScene que es el siguiente.</p>
<pre class="brush: cpp; title: ; notranslate">
void SceneManager::SetActiveScene(SceneID id_scene)
{
    next_scene = id_scene;
}
</pre>
<p>simplemente le da un valor a next_scene y luego desde app controlamos el cambio de escena fuera del método update y draw y sin peligro de segmentación de memoria.</p>
<pre class="brush: cpp; title: ; notranslate">
// Comprobamos cambios de escena
if (scene_manager-&gt;next_scene != &quot;&quot;)
{
	scene_manager-&gt;ChangeScene(scene_manager-&gt;next_scene);
	scene_manager-&gt;next_scene = &quot;&quot;;
}
</pre>
<p>tanto la variable next_scene como el método ChangeScene son privados, pero la clase App al ser friend si que puede acceder a ellos. Simplemente se encarga de comprobar si la variable next_scene no esta vacía en cuyo caso llama a ChangeScene y vuelve a vacías next_scene.</p>
<p>Mientras la aplicación se está ejecutando se repite este ciclo.</p>
<p>Por último cuando se sale del loop se entra en el Cleanup que se encarga de las funciones limpieza, llama al RemoveAllScene del SceneManager que a su vez llama al Cleanup de cada escena y luego las elimina. Por último elimina el SceneManager.</p>
<p>Tenemos varios métodos útiles declarados como son.</p>
<ul>
<li><strong>IsRunning</strong> &#8211; Valor booleano si la aplicación se está ejecutando o no.</li>
<li><strong>GetUpdateTime</strong> &#8211; Devuelve el tiempo pasado en cada ciclo</li>
<li><strong>Quit</strong> &#8211; Para la aplicación con un código de salida</li>
</ul>
<p>Bueno esto ha sido un repaso general a la clase App. Si algo no se entiende preguntar en los comentarios. En el próximo artículo se vera todo más claro pues crearemos una aplicación de ejemplo.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li><li ><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" class="wp_rp_title">[BGE] Sistema base del Engine</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" class="wp_rp_title">[BGE] La clase SceneManager</a></li><li ><a href="http://razonartificial.com/2011/09/bge-comenzando-el-proyecto/" class="wp_rp_title">[BGE] Comenzando el proyecto</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/uvd9GOOMylQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/09/bge-la-clase-app/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/09/bge-la-clase-app/</feedburner:origLink></item>
		<item>
		<title>[BGE] La clase SceneManager</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/59NLqr1zQLI/</link>
		<comments>http://razonartificial.com/2011/09/bge-la-clase-scenemanager/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 17:36:28 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[BGE]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Engine]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1791</guid>
		<description><![CDATA[Antes de ver la clase App vamos a  ver el SceneManager, ya que hemos visto en primer lugar la clase Scene ahora vamos a ver la clase que va a manejar los objetos Scene y decidir cual esta activo y cual no. Sobre SceneManager he visto muchas formas de implementarlo, la más común es utilizar una pila donde haciendo push y pop se puede cambiar de escena fácilmente, la desventaja de una pila es la poca flexibilidad para ir de una escena a otra, veamos un ejemplo práctico. Añadimos una escena inicial: >> scene_manager->push("SceneStart") Ahora "SceneStart" es la escena activa. >> scene_manager->push("SceneMenuPrincipal") Ahora "SceneMenuPrincipal" es la escena activa. >> scene_manager->push("SceneGame") Ahora "SceneGame" es la escena activa >> scene_manager->pop() Ahora "SceneMenuPrincipal" es la escena activa Parece un buen método, es fácil poner una escena y volver a la anterior mediante pop, pero, ¿Y si queremos volver 2 escenas atrás? Pues hacemos 2 veces pop y solucionado, ¿Y si son 15? Esto ya empieza a ser mas engorroso. ¿Y que sucede si queremos hacer push de una escena que ya está en la pila? Como vemos es un sistema muy rígido que no permite cambiar a la escena que queramos con facilidad. [...]]]></description>
				<content:encoded><![CDATA[<p>Antes de ver la clase App vamos a  ver el SceneManager, ya que hemos visto en primer lugar la clase Scene ahora vamos a ver la clase que va a manejar los objetos Scene y decidir cual esta activo y cual no.</p>
<p>Sobre SceneManager he visto muchas formas de implementarlo, la más común es utilizar una pila donde haciendo push y pop se puede cambiar de escena fácilmente, la desventaja de una pila es la poca flexibilidad para ir de una escena a otra, veamos un ejemplo práctico.</p>
<pre>
Añadimos una escena inicial:
>> scene_manager->push("SceneStart")
Ahora "SceneStart" es la escena activa.
>> scene_manager->push("SceneMenuPrincipal")
Ahora "SceneMenuPrincipal" es la escena activa.
>> scene_manager->push("SceneGame")
Ahora "SceneGame" es la escena activa
>> scene_manager->pop()
Ahora "SceneMenuPrincipal" es la escena activa
</pre>
<p>Parece un buen método, es fácil poner una escena y volver a la anterior mediante <strong>pop</strong>, pero, ¿Y si queremos volver 2 escenas atrás? Pues hacemos 2 veces <strong>pop</strong> y solucionado, ¿Y si son 15? Esto ya empieza a ser mas engorroso. ¿Y que sucede si queremos hacer <strong>push</strong> de una escena que ya está en la pila?</p>
<p>Como vemos es un sistema muy rígido que no permite cambiar a la escena que queramos con facilidad.</p>
<p>Mi idea es utilizar un simple array con una lista de escenas inactivas y una variable con un puntero a la escena activa.</p>
<pre class="brush: cpp; title: ; notranslate">
/// Escena actualmente activa
Scene* active_scene;
// Lista de escenas inacticas
std::vector&lt;Scene*&gt; inactives_scenes;
</pre>
<p>Estas dos objetos pertenecen a la clase SceneManager y con diferentes métodos los controlaremos. Puedes ver los diferentes métodos de la clase y su documentación en GitHub</p>
<ul>
<li><a href="https://github.com/adrigm/Basic-Game-Engine/blob/master/src/BGE/scene_manager.h">scene_manager.h</a></li>
<li><a href="https://github.com/adrigm/Basic-Game-Engine/blob/master/src/BGE/scene_manager.cpp">scene_manager.cpp</a></li>
</ul>
<p>Como ves tenemos métodos para añadir escenas, cambiarla, eliminarlas, eliminarlas todas, etc. Todas están perfectamente documentadas, pero si surgen dudas podéis dejar un comentario.</p>
<p>Un detalle es que los métodos <strong>ChangeScene</strong> y <strong>RemoveAllScene</strong> son privados. Esto es así por que el primero se encarga de cambiar la variable scene_active y si no se hace en el sitio correcto dentro de la clase App puede haber un error, se verá mejor cuando veamos la clase App. En cuanto a <strong>RemoveAllScene</strong> hace lo mismo que <strong>RemoveAllInactiveScene</strong>, pero también destruye la escena activa, se usa como limpieza cuando se termina la aplicación.</p>
<p>Como vemos tenemos a la clase App como amiga, esto es así porque nos interesa que pueda acceder a estos métodos privados y a la escena activa.</p>
<p>Otro detalle importante es que la clase está diseñada con el patrón <a href="http://es.wikipedia.org/wiki/Singleton">Singleton</a>, esto hace que solo pueda haber un SceneManager y no se cree más de uno por error.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li><li ><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" class="wp_rp_title">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" class="wp_rp_title">[BGE] La clase App</a></li><li ><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" class="wp_rp_title">[BGE] Sistema base del Engine</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/59NLqr1zQLI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/09/bge-la-clase-scenemanager/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/09/bge-la-clase-scenemanager/</feedburner:origLink></item>
		<item>
		<title>[BGE] La clase Scene</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/hCPolMb2kvk/</link>
		<comments>http://razonartificial.com/2011/09/bge-la-clase-scene/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 12:44:35 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[BGE]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Engine]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1788</guid>
		<description><![CDATA[En teoría lo lógico sería empezar hablando de la clase App, pues sera esta la principal del engine, pero necesitamos primero ver como va a ser un escena para luego poder hacer un buen app que las controle. ¿Que es una escena? Puede parecer obvio, pero por si acaso vamos a aclararlo. Una escena es cualquier pantalla de un juego que necesite mostrarse en pantalla, actualizar datos y/o interactuar con el usuario. Por ejemplo, una pantalla de inicio donde se muestra un vídeo de introducción al juego sería una escena, se muestra en pantalla, pero no interactúa con el usuario. Un menú de inicio donde podemos empezar un nuevo juego, cargar, salir, etc. sería otra escena de nuestro juego, etc. Cada escena debe tener unas funciones básicas comunes, estas son: Init &#8211; Se encarga de inicializar la escena. Pause &#8211; Es llamado cuando se pausa la escena. Resume &#8211; Es llamado cuando se reanuda la escena. Cleanup &#8211; Es llamado al eliminar la escena, realiza funciones de limpieza. Events &#8211; Es llamado para procesar los eventos del sistema. Update &#8211; Se encarga de actualizar la lógica de la escena, llamado una vez por ciclo. Draw &#8211; Se encarga de dibujar [...]]]></description>
				<content:encoded><![CDATA[<p>En teoría lo lógico sería empezar hablando de la clase App, pues sera esta la principal del engine, pero necesitamos primero ver como va a ser un escena para luego poder hacer un buen app que las controle.</p>
<h2>¿Que es una escena?</h2>
<p>Puede parecer obvio, pero por si acaso vamos a aclararlo. Una escena es cualquier pantalla de un juego que necesite mostrarse en pantalla, actualizar datos y/o interactuar con el usuario.</p>
<p>Por ejemplo, una pantalla de inicio donde se muestra un vídeo de introducción al juego sería una escena, se muestra en pantalla, pero no interactúa con el usuario. Un menú de inicio donde podemos empezar un nuevo juego, cargar, salir, etc. sería otra escena de nuestro juego, etc.</p>
<p>Cada escena debe tener unas funciones básicas comunes, estas son:</p>
<ul>
<li><strong>Init</strong> &#8211; Se encarga de inicializar la escena.</li>
<li><strong>Pause</strong> &#8211; Es llamado cuando se pausa la escena.<strong><br /></strong></li>
<li><strong>Resume</strong> &#8211; Es llamado cuando se reanuda la escena.</li>
<li><strong>Cleanup</strong> &#8211; Es llamado al eliminar la escena, realiza funciones de limpieza.</li>
<li><strong>Events</strong> &#8211; Es llamado para procesar los eventos del sistema.</li>
<li><strong>Update</strong> &#8211; Se encarga de actualizar la lógica de la escena, llamado una vez por ciclo.<strong><br /></strong></li>
<li><strong>Draw</strong> &#8211; Se encarga de dibujar en pantalla, llamado una vez por ciclo.</li>
</ul>
<p>Estos son algunos de los métodos que tendrá nuestra escena. Cuenta también con otros métodos constantes que devuelven información de la escena.</p>
<ul>
<li><strong>GetID</strong> &#8211; Devuelve el identificador de la escena.</li>
<li><strong>IsInitComplete</strong> &#8211; Devuelva true si se ha completado el Init.</li>
<li><strong>IsPaused</strong> &#8211; Devuelve true si la escena esta pausada.</li>
</ul>
<p>Como variables tenemos, los seguientes:</p>
<ul>
<li><strong>App* app</strong> &#8211; Puntero al objeto de la aplicación (Protegido).</li>
<li><strong>SceneID id</strong> &#8211; Almacena el id de la escena (Privado).</li>
<li><strong>bool m_cleanup</strong> &#8211; Almacena si la escena necesita limpieza.</li>
<li><strong>bool m_init</strong> &#8211; Almacena si la escene esta inicializada.</li>
<li><strong>bool m_paused</strong> &#8211; Almacena si la escena está pausada.</li>
</ul>
<p>De todos estos datos el constructor recibe los dos primeros,  <strong>Scene(SceneID m_id, App* p_app)</strong>. Aún no hemos visto la clase App ya veremos luego para qué es este puntero al objeto app. Los otros tres son valores booleanos y se inicializan como false.</p>
<p>Bueno, la explicación está muy bien, pero creo que es mejor que enseñe el código, aquí dejo los enlaces a GitHub de la clase.</p>
<ul>
<li><a href="https://github.com/adrigm/Basic-Game-Engine/blob/master/src/BGE/scene.h">https://github.com/adrigm/Basic-Game-Engine/blob/master/src/BGE/scene.h</a></li>
<li><a href="https://github.com/adrigm/Basic-Game-Engine/blob/master/src/BGE/scene.cpp">https://github.com/adrigm/Basic-Game-Engine/blob/master/src/BGE/scene.cpp</a></li>
</ul>
<p>Como vemos en la implementación (scene.cpp) no están los métodos Events, Update y Draw. De hecho, en la definición de la clase (scene.h) podemos ver que están igualados a 0. Esto es que son funciones virtuales puras, es decir, esta clase no las implementan sino que deben hacerlo las clases que hereden de ella, es decir, las escenas de nuestros juegos. Los otros métodos no constantes también son virtuales, pero tienen una implementación básica necesaria.</p>
<p>En el próximo artículo veremos la clase <strong>App</strong>. Cualquier duda, dejad un comentario,</p>
<p>&nbsp;</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" class="wp_rp_title">[BGE] La clase SceneManager</a></li><li ><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" class="wp_rp_title">[BGE] Sistema base del Engine</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" class="wp_rp_title">[BGE] La clase App</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li><li ><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" class="wp_rp_title">[BGE] Espacio de nombre, tipos y cabeceras</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/hCPolMb2kvk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/09/bge-la-clase-scene/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/09/bge-la-clase-scene/</feedburner:origLink></item>
		<item>
		<title>[BGE] Espacio de nombre, tipos y cabeceras</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/5EfYwaqJLIo/</link>
		<comments>http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 23:40:28 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[BGE]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Engine]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1780</guid>
		<description><![CDATA[Antes de entrar en materia con las clases del sistema base surgen algunas cosas que hacer y decir, recordemos nuestra distribución del directorio src. &#124;- src/ &#124;- BGE/ &#124;- BGE.h &#124;- types.h &#124;- app.h &#124;- app.cpp &#124;- scene.h &#124;- scene.cpp &#124;- ... &#124;- main.cpp &#124;- scene_start.h &#124;- scene_start.cpp &#124;- ... Es decir, metemos los ficheros del engine propiamente dichos dentro de la carpeta src/BGE y los archivos de prueba que usamos para ir probando nuestro engine quedan en la carpeta src/. Esta es la estructura que tendría un juego que use el engine, simplemente añadir la carpeta con los archivos del engine y utilizarlos. Más adelante veremos como convertirlo en bibliotecas para que el Engine no se esté compilando cada vez. Espacio de nombre BGE He decidido que toda las clases del engine se encuentren dentro del namespace BGE, la razón de esto es que vamos a trabajar con bibliotecas de desarrollo de videojuegos y estamos haciendo un engine para hacer juegos esto hace que sea muy probable tener nombres iguales en diferentes bibliotecas, por ejemplo, en SFML hay una clase llamada Clock y el engine también tendrá una clase llamada Clock y probablemente cuando se haga un juego con [...]]]></description>
				<content:encoded><![CDATA[<p>Antes de entrar en materia con las clases del sistema base surgen algunas cosas que hacer y decir, recordemos nuestra distribución del directorio <strong>src</strong>.</p>
<pre>
|- src/
   |- BGE/
      |- BGE.h
      |- types.h
      |- app.h
      |- app.cpp
      |- scene.h
      |- scene.cpp
      |- ...
   |- main.cpp
   |- scene_start.h
   |- scene_start.cpp
   |- ...
</pre>
<p>Es decir, metemos los ficheros del engine propiamente dichos dentro de la carpeta <strong>src/BGE</strong> y los archivos de prueba que usamos para ir probando nuestro engine quedan en la carpeta <strong>src/</strong>.</p>
<p>Esta es la estructura que tendría un juego que use el engine, simplemente añadir la carpeta con los archivos del engine y utilizarlos. Más adelante veremos como convertirlo en bibliotecas para que el Engine no se esté compilando cada vez.</p>
<h2>Espacio de nombre BGE</h2>
<p>He decidido que toda las clases del engine se encuentren dentro del <strong>namespace BGE</strong>, la razón de esto es que vamos a trabajar con bibliotecas de desarrollo de videojuegos y estamos haciendo un engine para hacer juegos esto hace que sea muy probable tener nombres iguales en diferentes bibliotecas, por ejemplo, en SFML hay una clase llamada Clock y el engine también tendrá una clase llamada Clock y probablemente cuando se haga un juego con el engine el programador quiera tener su propia clase Clock. Con los espacios de nombre solucionamos el problema de saber a que clase nos estamos refiriendo.</p>
<h2>El archivo de encabezado</h2>
<p>Basándome en SFML he decidido hacer un archivo de encabezado genérico por módulo, es decir un header que incluya lo necesario para hacer funcionar cada parte del engine. esto sería el ejemplo de como estaría actualmente.</p>
<pre class="brush: cpp; title: ; notranslate">
#ifndef BGE_H
#define BGE_H

#include &quot;types.h&quot;

#include &quot;app.h&quot;
#include &quot;scene.h&quot;

#include &quot;clock.h&quot;

#endif // BGE_H
</pre>
<p>Como vemos incluye las clases de las que hemos hablado y que son básicas para hacer funcionar el engine. No os preocupéis se que aún no hemos entrado en materia con ninguna, en próximos artículos lo haremos.</p>
<h2>Tipos propios del engine</h2>
<p>En el código anterior verás un archivo del que no hemos hablado el <strong>types.h</strong>. Este archivo contendrán los tipos específicos creados para el engine. He declarado algunos básicos.</p>
<pre class="brush: cpp; title: ; notranslate">
/**
 * Definición de tipos del espacio de nombre BGE
 *
 * @file types.h
 * @author Adrián Guerra Marrero
 * @date 20110422 - Initial Release
 */

#ifndef TYPES_H
#define TYPES_H

#include &lt;string&gt;

namespace BGE
{
	
// Tipo de dato que representa el ID de una Escena
typedef std::string SceneID;

/// Status Enumeration for Status Return values
enum StatusType
{
	// Values from -99 to 99 are common Error and Good status responses
	StatusAppMissingAsset = -4, ///&lt; Application failed due to missing asset file
	StatusAppStackEmpty   = -3,  ///&lt; Application States stack is empty
	StatusAppInitFailed   = -2,  ///&lt; Application initialization failed
	StatusError           = -1,  ///&lt; General error status response
	StatusAppOK           =  0,  ///&lt; Application quit without error
	StatusNoError         =  0,  ///&lt; General no error status response
	StatusFalse           =  0,  ///&lt; False status response
	StatusTrue            =  1,  ///&lt; True status response
	StatusOK              =  1   ///&lt; OK status response

	// Values from +-100 to +-199 are reserved for File status responses
};

// Forwards Declarations
class App;
class SceneManager;
class Scene;

} // Namespace BGE

#endif // TYPES_H
</pre>
<p>En primer lugar he declarado el tipo <strong>SceneID</strong> que no es más que una string que se usará para identificar las escenas, ya lo veremos mejor cuando expliquemos la clase <strong>Scene</strong>.</p>
<p>Luego tenemos un enumerado con una lista de estados del proyecto, por ahora solo hay definidos algunos básicos. Esto se usa para el <strong>return</strong> de la aplicación y evitar los <a href="http://www.pablasso.com/2008/12/30/%C2%BFque-es-un-numero-magico">números mágicos</a>.</p>
<p>por último tenemos los <strong>Fowards Declarations</strong>, si no sabes lo que son puedes mirar <a href="http://razonartificial.com/2011/07/organizacion-del-codigo-fuente-en-cpp/">este artículo</a> en concreto es el problema 2, pero recomiendo leer todo el artículo.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" class="wp_rp_title">[BGE] Sistema base del Engine</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" class="wp_rp_title">[BGE] La clase SceneManager</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li><li ><a href="http://razonartificial.com/2011/09/bge-comenzando-el-proyecto/" class="wp_rp_title">[BGE] Comenzando el proyecto</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/5EfYwaqJLIo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/</feedburner:origLink></item>
		<item>
		<title>[BGE] Sistema base del Engine</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/LIuvnekauec/</link>
		<comments>http://razonartificial.com/2011/09/bge-sistema-base-del-engine/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 21:52:39 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[BGE]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Engine]]></category>
		<category><![CDATA[Juegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1772</guid>
		<description><![CDATA[Bueno es hora de entrar en materia ya y empezar a ver la estructura del Engine. Mi idea es basarme en la estructura que usan otros engines y apis pues no es cuestión de reinventar la rueda, sino de uno entender como se hace. Estructura básica de un juego Se sale de este artículo explicar el desarrollo del bucle de un juego, pero no está mal recordarlo con un simple esquema: Es un esquema muy simplificado, sin tener en cuenta temas como la velocidad de actualización para diferentes máquinas, etc. Si alguno necesita un tutorial sobre estos conceptos básicos que deje un comentario y haré un tutorial sobre el tema. Cuando desarrollamos juegos simples este esquema está muy bien, pero cuando necesitamos manejar un proyecto a gran escala se nos empieza a quedar corto, por ejemplo, si necesitamos manejar varias pantallas como un menú, una pantalla de inicio, créditos, etc. este sistema sería bastante engorroso pues habría que estar añadiendo muchas sentencias de control para ver cuando se ejecuta qué y al final no habría forma de continuar del lío que se formaría, ahí es donde entra un gestor de escenas. Gestor de Escenas La idea es similar a lo [...]]]></description>
				<content:encoded><![CDATA[<p>Bueno es hora de entrar en materia ya y empezar a ver la estructura del Engine. Mi idea es basarme en la estructura que usan otros engines y apis pues no es cuestión de reinventar la rueda, sino de uno entender como se hace.</p>
<h2>Estructura básica de un juego</h2>
<p>Se sale de este artículo explicar el desarrollo del bucle de un juego, pero no está mal recordarlo con un simple esquema:</p>
<p><img class="aligncenter size-full wp-image-1773" title="bucle_simple" src="http://razonartificial.com/wp-content/uploads/2011/09/bucle_simple.png" alt="" width="262" height="382" /></p>
<p>Es un esquema muy simplificado, sin tener en cuenta temas como la velocidad de actualización para diferentes máquinas, etc. Si alguno necesita un tutorial sobre estos conceptos básicos que deje un comentario y haré un tutorial sobre el tema.</p>
<p>Cuando desarrollamos juegos simples este esquema está muy bien, pero cuando necesitamos manejar un proyecto a gran escala se nos empieza a quedar corto, por ejemplo, si necesitamos manejar varias pantallas como un menú, una pantalla de inicio, créditos, etc. este sistema sería bastante engorroso pues habría que estar añadiendo muchas sentencias de control para ver cuando se ejecuta qué y al final no habría forma de continuar del lío que se formaría, ahí es donde entra un gestor de escenas.</p>
<h2>Gestor de Escenas</h2>
<p>La idea es similar a lo explicado en <a href="http://razonartificial.com/2010/08/gestionando-escenas-con-pygame/">este artículo</a> con Pygame. Tener una clase abstracta llamada Scene que contenga los métodos virtuales de las diferentes escenas y gestionarlos en el bucle principal a través de un Scene Manager.</p>
<p>Para los que no estéis muy puestos en el tema lo de arriba os sonará a chino, pero con un esquema quizás se vea mejor.</p>
<p><img class="size-full wp-image-1774 aligncenter" title="App" src="http://razonartificial.com/wp-content/uploads/2011/09/App.png" alt="" width="622" height="407" /></p>
<p>Como vemos existe una clase <strong>App</strong> que se encarga de de inicializar el engine, carga ventanas, bibliotecas, archivos de configuración, etc.</p>
<p>También contiene una clase llamada <strong>SceneManager</strong> que se encarga de gestionar las escenas, esta clase cuanta con una lista de escenas inactivas y una Escena activa que con diferentes métodos podemos añadir, eliminar o cambiar, cuando veamos el SceneManager entraremos en detalles.</p>
<p>En el próximo artículo empezamos a ver el código de estas clases.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li><li ><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" class="wp_rp_title">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" class="wp_rp_title">[BGE] La clase App</a></li><li ><a href="http://razonartificial.com/2011/09/bge-comenzando-el-proyecto/" class="wp_rp_title">[BGE] Comenzando el proyecto</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/LIuvnekauec" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/09/bge-sistema-base-del-engine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/09/bge-sistema-base-del-engine/</feedburner:origLink></item>
		<item>
		<title>Creando un archivo de log en C++</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/N_V8xzZL5os/</link>
		<comments>http://razonartificial.com/2011/09/creando-un-archivo-de-log-en-cpp/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 15:58:42 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1767</guid>
		<description><![CDATA[Cuando se está haciendo un programa es normal utilizar la salida estándar para ir poniendo mensajes de resultados parciales y pruebas para ver si las cosas están sucediendo como se esperan. Cuando el software que estamos creando alcanza mayor complejidad estos mensajes no son suficientes, es aquí donde entran los archivos de log. Esto son básicamente ficheros de texto que van guardando esto mensajes para luego poder analizarlos en profundidad. Hay muchas maneras de crear un archivo de log algunas más complejas y con mas datos como hora, fehcas, colores, etc y otras mas sencillas. Aquí voy a mostrar una manera sencilla de crear uno de estos archivos utilizando las grandes herramientas de control de flujo de C++. Como no hay mucho más que explicar simplemente dejo el código. Como ves no es un log con mil pijerías pero es rápido y eficiente, podemos usar simplemente: Como lo haríamos con la salida estándar con cout. El resultado sería un archivo log.txt con el siguiente contenido: LogFile: log.txt Esta es una linea del log Las herramientas de control de flujo de C++ que están en la biblioteca estándar son muy poderosas, en próximos artículos hablaremos más de ellas. SFML &#8211; Juego [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://razonartificial.com/wp-content/uploads/2011/09/logs.png" alt="" title="logs" width="128" height="128" class="alignright size-full wp-image-1768" /></p>
<p>Cuando se está haciendo un programa es normal utilizar la salida estándar para ir poniendo mensajes de resultados parciales y pruebas para ver si las cosas están sucediendo como se esperan. Cuando el software que estamos creando alcanza mayor complejidad estos mensajes no son suficientes, es aquí donde entran los archivos de log. Esto son básicamente ficheros de texto que van guardando esto mensajes para luego poder analizarlos en profundidad.</p>
<p>Hay muchas maneras de crear un archivo de log algunas más complejas y con mas datos como hora, fehcas, colores, etc y otras mas sencillas. Aquí voy a mostrar una manera sencilla de crear uno de estos archivos utilizando las grandes herramientas de control de flujo de C++. Como no hay mucho más que explicar simplemente dejo el código.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;string&gt;
#include &lt;fstream&gt;

int main()
{
	// Declaramos las variables
	std::ofstream log;
	std::string log_file;
	
	// Creamos el archivo de log
	log_file.assign(&quot;log.txt&quot;);
	log.open(log_file.c_str());
	
	// Escribimos una línea con el nombre del archivo
	log &lt;&lt; &quot;LogFile: &quot; &lt;&lt; log_file &lt;&lt; std::endl;

	// Escribimos en el log
	log &lt;&lt; &quot;Esta es una linea del log&quot; &lt;&lt; std::endl;
	
	// Cerramos el archivo
	log.close();
}
</pre>
<p>Como ves no es un log con mil pijerías pero es rápido y eficiente, podemos usar simplemente:</p>
<pre class="brush: cpp; title: ; notranslate">
log &lt;&lt; &quot;Lo que quiera poner en el fichero&quot;;
</pre>
<p>Como lo haríamos con la salida estándar con <strong>cout</strong>.</p>
<p>El resultado sería un archivo <strong>log.txt</strong> con el siguiente contenido:</p>
<pre>
LogFile: log.txt
Esta es una linea del log
</pre>
<p>Las herramientas de control de flujo de C++ que están en la biblioteca estándar son muy poderosas, en próximos artículos hablaremos más de ellas.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" class="wp_rp_title">SFML &#8211; Juego de ejemplo</a></li><li ><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" class="wp_rp_title">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/N_V8xzZL5os" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/09/creando-un-archivo-de-log-en-cpp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/09/creando-un-archivo-de-log-en-cpp/</feedburner:origLink></item>
		<item>
		<title>[BGE] Comenzando el proyecto</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/D5haE3TNsFk/</link>
		<comments>http://razonartificial.com/2011/09/bge-comenzando-el-proyecto/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 13:29:26 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[BGE]]></category>
		<category><![CDATA[Engine]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1761</guid>
		<description><![CDATA[Vamos a comenzar esta especie de diario acerca de la creación de un Game Engine, los post del blog que traten sobre el Engine incluirán la etiqueta [BGE] (Basic Game Engine) para que sean fácilmente reconocibles. Creando un repositorio Lo primero que necesitaba era crear un repositorio para el proyecto donde tener un control de versiones y avances, me he decidido por GitHub pues ya he trabajado con Git antes y GitHub es un buen host basado en Git. Este será el repositorio del proyecto: https://github.com/adrigm/Basic-Game-Engine Estructura del proyecto Una de las primeras cosas que uno tiene que decidir es como organizar el proyecto, como distribuir los archivos etc. La idea es que los diferentes módulos del proyecto sean al final Bibliotecas que se puedan añadir sencillamente para crear un juego sobre ellas, pero mientras está en fase de desarrollo no se pueden aislar como bibliotecas. Otra cosa a tener en cuenta es separar el código fuente de cualquier IDE, compilador o plataforma, Así que la distribución elegida es la siguiente: &#124;- Basic-Game-Engine/ &#124; &#124;- src/ &#124;- BGE/ &#124;- ficheros.hpp &#124;- ficheros.cpp &#124; &#124;- builds/ &#124;- cmake/ &#124;- codelite/ &#124;- VS2010/ &#124;- ... &#124; &#124;- doxygen/ &#124;- Doxyfile &#124;- ... [...]]]></description>
				<content:encoded><![CDATA[<p>Vamos a comenzar esta especie de diario acerca de la creación de un Game Engine, los post del blog que traten sobre el Engine incluirán la etiqueta [BGE] (Basic Game Engine) para que sean fácilmente reconocibles.</p>
<h2>Creando un repositorio</h2>
<p>Lo primero que necesitaba era crear un repositorio para el proyecto donde tener un control de versiones y avances, me he decidido por GitHub pues ya he trabajado con Git antes y GitHub es un buen host basado en Git.</p>
<p>Este será el repositorio del proyecto: <a href="https://github.com/adrigm/Basic-Game-Engine">https://github.com/adrigm/Basic-Game-Engine</a></p>
<h2>Estructura del proyecto</h2>
<p>Una de las primeras cosas que uno tiene que decidir es como organizar el proyecto, como distribuir los archivos etc. La idea es que los diferentes módulos del proyecto sean al final Bibliotecas que se puedan añadir sencillamente para crear un juego sobre ellas, pero mientras está en fase de desarrollo no se pueden aislar como bibliotecas.</p>
<p>Otra cosa a tener en cuenta es separar el código fuente de cualquier IDE, compilador o plataforma,</p>
<p>Así que la distribución elegida es la siguiente:</p>
<pre>|- Basic-Game-Engine/
    |
    |- src/
        |- BGE/
        |- ficheros.hpp
        |- ficheros.cpp
    |
    |- builds/
        |- cmake/
        |- codelite/
        |- VS2010/
        |- ...
    |
    |- doxygen/
        |- Doxyfile
        |- ...
    |
    |- README
    |- log.txt
    |- Executable</pre>
<p>Como puedes ver en principio habrá 3 directorios:</p>
<ul>
<li><strong>src </strong>- Donde irá el codigo fuente, separados en carpetas según módulos.</li>
<li><strong>builds </strong>- Aquí irán las diferentes carpetas con los ficheros de proyecto de las diferentes ide, yo trabajo con codelite y por ahora solo está configurado para esta IDE, también lo configuraré para Cmake, pero cualquiera puede añadir una carpeta para cualquier otro IDE. En la carpeta del proyecto se deben crear todos los ficheros que necesite la IDE, los .o, etc y generar el ejecutable en el directorio base del proyecto.</li>
<li><strong>doxygen</strong> &#8211; Aquí se encuentran los ficheros necesarios para generar la documentación del proyecto.</li>
</ul>
<p>Por ahora eso son los directorios pensado, conforme crezca el proyecto es posible que se necesiten otros extras.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" class="wp_rp_title">Haciendo un Game Engine 2D básico</a></li><li ><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" class="wp_rp_title">[BGE] Sistema base del Engine</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" class="wp_rp_title">[BGE] La clase App</a></li><li ><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" class="wp_rp_title">[BGE] Espacio de nombre, tipos y cabeceras</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/D5haE3TNsFk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/09/bge-comenzando-el-proyecto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/09/bge-comenzando-el-proyecto/</feedburner:origLink></item>
		<item>
		<title>Haciendo un Game Engine 2D básico</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/9ih6ghKL8bI/</link>
		<comments>http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 22:43:54 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[BGE]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Engine]]></category>
		<category><![CDATA[Juegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1755</guid>
		<description><![CDATA[Hace tiempo vengo planeando hacer un Game Engine básico para juegos 2D, Se que existen muchos en la red y que uno más no va a aportar nada. La idea de hacer uno propio es aprender y ver como se hacen las cosas, de paso iré publicando los avances por si puedo ayudar a alguien. Yo no tengo experiencia en este tema y probablemente haga burradas y no haga las cosas de la manera más eficiente posible o las diseñe mal, estaría encantado de recibir sugerencias y/o críticas en los comentarios así todos aprendemos más y buscamos los mejores métodos para hacer las cosas. El Engine La idea es que sea modular, que cuente con diferentes módulos: Física, IA, Gestión de recursos, etc. Que sea una capa de abstracción para las bibliotecas que use. En principio solo he decidido una biblioteca y es SFML para le manejo multimedia: Ventana, recursos, E/S. En el futuro pienso usar otras bibliotecas como Box2D para temas de física y es posible que alguna dedicada a la Inteligencia Artificial. Características Esta lista no es definitiva pues aún está en una fase temprana de desarrollo, pero estás son algunas de las características que se están pensando [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1756" title="kservices" src="http://razonartificial.com/wp-content/uploads/2011/09/kservices.png" alt="" width="128" height="128" /></p>
<p>Hace tiempo vengo planeando hacer un Game Engine básico para juegos 2D, Se que existen muchos en la red y que uno más no va a aportar nada. La idea de hacer uno propio es aprender y ver como se hacen las cosas, de paso iré publicando los avances por si puedo ayudar a alguien.</p>
<p>Yo no tengo experiencia en este tema y probablemente haga burradas y no haga las cosas de la manera más eficiente posible o las diseñe mal, estaría encantado de recibir sugerencias y/o críticas en los comentarios así todos aprendemos más y buscamos los mejores métodos para hacer las cosas.</p>
<h2>El Engine</h2>
<p>La idea es que sea modular, que cuente con diferentes módulos: Física, IA, Gestión de recursos, etc. Que sea una capa de abstracción para las bibliotecas que use. En principio solo he decidido una biblioteca y es <a href="http://www.sfml-dev.org/" rel="nofollow">SFML</a> para le manejo multimedia: Ventana, recursos, E/S. En el futuro pienso usar otras bibliotecas como <a href="http://www.box2d.org/" rel="nofollow">Box2D</a> para temas de física y es posible que alguna dedicada a la Inteligencia Artificial.</p>
<h3>Características</h3>
<p>Esta lista no es definitiva pues aún está en una fase temprana de desarrollo, pero estás son algunas de las características que se están pensando implementar.</p>
<ul>
<li>Escrito en <strong>C++</strong> sobre bibliotecas consolidadas para el bajo nivel (SFML, <a href="http://code.google.com/p/pugixml/" rel="nofollow">PugiXML</a>, Box2D, etc)</li>
<li><strong>Gestor de escenas</strong>. Cambio fácil y sencillo de diferentes pantallas en un juego.</li>
<li><strong>Gestión de recursos</strong>. Carga fácil de diferentes tipos de recursos y plantillas para que el usuario puede crear sus propios recursos, estos son algunos de los recursos que cargará por defecto el engine:
<ul>
<li>Imágenes. Formatos conocidos: png, jpg, bmp, gif, psd, etc.</li>
<li>Audio. Formatos conocidos: mp3, ogg, midi, etc.</li>
<li>Fuentes tipográficas.</li>
<li>Ficheros de configuración: cfg, ini.</li>
<li>Ficheros XML.</li>
<li>Mapas en formato TMX (<a href="http://www.mapeditor.org/" rel="nofollow">Tiled Map Editor</a>).</li>
<li>Scripts en <a href="http://www.python.org/" rel="nofollow">Python</a> (posibles futuras ampliaciones a otros lenguajes de scripts como <a href="http://www.ruby-lang.org/es/" rel="nofollow">Ruby</a> o <a href="http://www.lua.org/" rel="nofollow">LUA</a>).</li>
</ul>
</li>
<li><strong>Modular</strong>. Se diseñará con la idea de que el engine sea modular, según el juego que se cree puede que sea necesario unas características u otras por lo que no tiene sentido cargar los módulos de física o IA si se está creando un clon del tetris. Estos son algunos de los modulos pensados.
<ul>
<li><strong>App</strong>: Módulo principal del engine: Bucle del juego, Gestión de escenas, E/S, Control de la ventana.</li>
<li><strong>AssetManager</strong>: El manejador de recursos, lo que permite cargar todo lo del punto anterior y definir nuevos tipos de recursos.</li>
<li><strong>Física</strong>: basado en Box2D.</li>
<li><strong>Inteligencia Artificial</strong>: Con algoritmos típicos: FSM, Pathfinding, MinMax, etc.</li>
<li><strong>GUI</strong>. Creación fácil de interfaces del usuarios.</li>
<li>Otros. Será posible añadir nuevos módulos fácilmente a modo de plugins.</li>
</ul>
</li>
<li><strong>Abstracción</strong> total de las bibliotecas de bajo nivel: Nada de lidiar con SFML, Box2D u otras bibliotecas, el engine será una capa de abstracción de todas estas bibliotecas.</li>
<li>Manejo fácil de <strong>Animaciones</strong> y SpritesSheet.</li>
<li>Totalmente <strong>documentado en español</strong>. El código está documentado con Doxygen en español por tanto toda la referencia de clases está en español. Se elaborarán también tutoriales para el manejo del engine.</li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" class="wp_rp_title">[BGE] Sistema base del Engine</a></li><li ><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" class="wp_rp_title">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" class="wp_rp_title">[BGE] La clase Scene</a></li><li ><a href="http://razonartificial.com/2011/09/bge-comenzando-el-proyecto/" class="wp_rp_title">[BGE] Comenzando el proyecto</a></li><li ><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" class="wp_rp_title">[BGE] La clase App</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/9ih6ghKL8bI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/</feedburner:origLink></item>
		<item>
		<title>Unity3D – Un motor de videojuegos para el desarrollo multiplataforma</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/YmI772rgPBg/</link>
		<comments>http://razonartificial.com/2011/04/unity3d/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 23:34:56 +0000</pubDate>
		<dc:creator>Fabian</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Game Engine]]></category>
		<category><![CDATA[Unity3D]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1589</guid>
		<description><![CDATA[Unity3D es un game engine gratuito, el cual podemos descargar, usar y gratuitamente exportar (ya sea para su comercialización o liberación gratuita) juegos para ordenador o para la web escribiendo código una vez y obteniendo resultados para varias plataformas. Lo bueno es que podemos adquirir diversas licencias que nos permiten exportar a Android, iPhone, MacOS, Playstation 3 y Xbox 360. El motor implementa un completo editor de escenarios que nos permite arrastrar y colocar objetos en 3D para animarlos de forma fácil, y para esta tarea podemos utilizar algunos programas de diseño 3D como Blender, Maya, Cinema 4D, 3ds Max, entre otros. Por otro lado, el editor nos permite trabajar fácilmente con algunos componentes como partículas, colisiones, audio y física y lo más importante es que el editor de escenarios nos proporciona una gran cantidad de opciones para ahorrar tiempo creando los terrenos, por ejemplo, nos permite añadir fácilmente agua o crear elevaciones de terreno en unos segundos. En cuánto a la programación, Unity3D nos permite trabajar con 3 lenguajes: Javascript, C# y una implementación de Python. Por otro lado los precios varían mucho dependiendo de la plataforma, por ejemplo podemos comprar la licencia pro que nos permite exportar el [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://razonartificial.com/wp-content/uploads/2011/04/unity3d.jpg" alt="" title="unity3d" width="539" height="400" class="aligncenter size-full wp-image-1601" /></p>
<p><strong>Unity3D</strong> es un <strong>game engine</strong> gratuito, el cual podemos descargar, usar y gratuitamente exportar (ya sea para su comercialización o liberación gratuita) juegos para ordenador o para la web escribiendo código una vez y obteniendo resultados para varias plataformas. Lo bueno es que podemos adquirir diversas licencias que nos permiten <strong>exportar a Android</strong>, iPhone, MacOS, Playstation 3 y <strong>Xbox 360</strong>.</p>
<p>El motor implementa un completo <strong>editor de escenarios</strong> que nos permite arrastrar y colocar objetos en 3D para animarlos de forma fácil, y para esta tarea podemos utilizar algunos programas de diseño 3D como <strong>Blender</strong>, Maya, Cinema 4D, 3ds Max, entre otros.</p>
<p>Por otro lado, el editor nos permite trabajar fácilmente con algunos componentes como partículas, <strong>colisiones</strong>, audio y física y lo más importante es que el <strong>editor de escenarios</strong> nos proporciona una gran cantidad de opciones para ahorrar tiempo creando los terrenos, por ejemplo, nos permite añadir fácilmente agua o crear elevaciones de terreno en unos segundos.</p>
<p>En cuánto a la programación, <strong>Unity3D</strong> nos permite trabajar con 3 lenguajes: Javascript, C# y una implementación de <strong>Python</strong>. Por otro lado los precios varían mucho dependiendo de la plataforma, por ejemplo podemos comprar la licencia pro que nos permite exportar el juego a varias plataformas a $1.500 dólares, o la versión para exportar a iPhone o Android a $400.</p>
<p>En sí este motor resulta ser una gran alternativa al <strong>Unreal Engine</strong> sobre todo porque la calidad de los juegos que se pueden realizar con el mismo es realmente alta y dichos resultados se pueden lograr en muy poco tiempo.</p>
<h2>Algunos enlaces interesantes sobre Unity3D</h2>
<ul>
<li><a href="http://unityspain.com/">UnitySpain</a> &#8211; Comunidad y foros de Unity3D en español.</li>
<li>Información, guías y <a href="http://nivelcritico.com/tag/unity3d/">tutoriales de Unity3D en español</a>.</li>
<li><a href="http://unity3d.com/gallery/live-demos/index.html#bedroom">Demos de juegos en Unity3D</a>.</li>
<li><a href="http://www.unity3dstudent.com/">Videotutoriales de Unity3D</a> en inglés.</li>
<li><a href="http://unity3d.com/">Sitio oficial de Unity3D</a>.</li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/04/phonegap-juegos-moviles-javascript/" class="wp_rp_title">PhoneGap &#8211; Framewok para portar juegos de javascript a dispositivos móviles</a></li><li ><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" class="wp_rp_title">Iberogre &#8211; Documentación de Ogre en español</a></li><li ><a href="http://razonartificial.com/2012/06/juegos-online-tecnologias-a-usar/" class="wp_rp_title">Juegos Online &#8211; Tecnologías a usar</a></li><li ><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" class="wp_rp_title">Gran Pack de desarrollo de videojuegos</a></li><li ><a href="http://razonartificial.com/2010/08/gamedevlesson-crear-videojuegos/" class="wp_rp_title">GameDevLesson – Crear videojuegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/YmI772rgPBg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/04/unity3d/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/04/unity3d/</feedburner:origLink></item>
		<item>
		<title>Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/Hq5rWPnxbfM/</link>
		<comments>http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 21:52:47 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[RTS]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1568</guid>
		<description><![CDATA[Una de las tareas principales de un juego RTS es la de recolectar los recursos que necesitamos para desarrollar nuestra estrategia de crecimiento a todos los niveles: tecnologías, efectivos, edificios y cualquier otro elemento que pueda intervenir en el juego. El Daimyo era la figura en el entorno feudal japonés que poseia un terreno y se encargaba de administrarlo. Cuando no estaban en guerras con el resto de Daimyos era porque uno de ellos habia asumido el rol de Shogun o repartidor de palos máximo, en cuyo caso el resto tenian que dar buena cuenta de lo que se cocía en su territorio. De cualquier modo, la visión del daimyo que reparte la pana en su tierra y que debe cumplir con una serie de peticiones del Shogun en materia de tributos es la que nos interesa a nosotros. Nos vamos a dedicar a construir un Daimyo para nuestro sistema de entretenimiento de estrategia en tiempo real. Veamos que tenemos que tener en cuenta para crear el azote de los recolectores. Respecto a los que habeis seguido la distribución de comportamiento mediante comandantes que ya hemos visto en otros artículos vereis que aqui vamos a tratar acerca del Comandante de Recursos. [...]]]></description>
				<content:encoded><![CDATA[<p>Una de las tareas principales de un juego RTS es la de recolectar los recursos que necesitamos para desarrollar nuestra estrategia de crecimiento a todos los niveles: tecnologías, efectivos, edificios y cualquier otro elemento que pueda intervenir en el juego.</p>
<p style="text-align: center;">[There is a video that cannot be displayed in this feed. <a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/">Visit the blog entry to see the video.]</a></p>
<p>El Daimyo era la figura en el entorno feudal japonés que poseia un terreno y se encargaba de administrarlo. Cuando no estaban en guerras con el resto de Daimyos era porque uno de ellos habia asumido el rol de Shogun o repartidor de palos máximo, en cuyo caso el resto tenian que dar buena cuenta de lo que se cocía en su territorio. De cualquier modo, la visión del daimyo que reparte la pana en su tierra y que debe cumplir con una serie de peticiones del Shogun en materia de tributos es la que nos interesa a nosotros. Nos vamos a dedicar a construir un Daimyo para nuestro sistema de entretenimiento de estrategia en tiempo real. Veamos que tenemos que tener en cuenta para crear el azote de los recolectores.</p>
<p><img class="size-full wp-image-1573 alignright imageborder" title="taisho" src="http://razonartificial.com/wp-content/uploads/2011/04/taisho.jpg" alt="" width="303" height="303" /></p>
<p>Respecto a los que habeis seguido la distribución de comportamiento mediante comandantes que ya hemos visto en otros artículos vereis que aqui vamos a tratar acerca del Comandante de Recursos. El que va a encargarse de distribuir las responsabilidades entre las unidades de recolección y de proveer al resto. Temas como la creación de unidades o la distribución de las mismas serán problemas a tener en cuenta.</p>
<p>Antes de nada hay que diferenciar entre el análisis desde el punto de vista de una inteligencia artificial que sigue las reglas establecidas y una que no. La primera se refiere a aquella que tiene la misma información que el usuario de modo que juega ‘limpio’ teniendo en cuenta que la IA no tiene la capacidad de un cerebro humano por lo que ya jugar limpio implica que los oponentes tienen capacidades muy diferentes, es decir, juegarían en diferentes categorias. Aqui lo que queremos es dar una visión del enfoque científico donde las pirulas no se deben tener en cuenta. Sin embargo, para estar a la orden del dia en lo referente al ámbito comercial, le vamos a dar un repaso al tema del trampeo en lo que se refiere al tema de minado de recursos.</p>
<h2>Introducción a la extracción de recursos</h2>
<p>Como en la vida real, de la correcta disponibilidad de los materiales dependerá la velocidad de desarrollo del juego y el desempeño de nuestra estrategia. Extraer recursos es una tarea que implica un nivel de organización amplio y que requiere de una serie de estructuras que soporten la posibilidad de que la lógica del sistema vaya creciendo sin que el acoplamiento y las dependencias entre los diferentes elementos crezcan de una forma inapropiada.</p>
<p style="text-align: center;">[There is a video that cannot be displayed in this feed. <a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/">Visit the blog entry to see the video.]</a></p>
<p>Para llevar a cabo las tareas, se tienen en cuenta varias necesidades. Por un lado la necesidad de calcular con exactitud el número y la proporción de recursos necesarios para llevar a cabo la estrategia. Por otro, la necesidad de determinar los elementos necesarios para llevar a cabo la extracción con un ratio tiempo/unidades válido. Y finalmente la distribución y comando de las unidades asignadas a recursos o energías no renovables.</p>
<h2>Número óptimo de unidades</h2>
<p>Para calcular el número óptimo de unidades necesitamos tener una medida de lo que estas deben llevar a cabo. En términos generales se pretende que a partir de una medida de los requisitos de cada uno de los elementos que controlan la lógica del sistema (comandantes de construcción, de exploración, de guerra o cualquier otro que definamos), generemos una solución que permite obtener los recursos necesarios en un tiempo determinado.</p>
<p>El administrador de recursos será la pieza clave en todo el desarrollo y cumplirá con las tres tareas principales que hemos visto: calcular recursos, crear unidades de recolección y distribuirlas. La forma en la que trabaja este elemento lógico es adquiriendo peticiones, ejecutando acciones para llevar a cabo la adquisición y traspasando estos recursos obtenidos.</p>
<p>Vale la pena comentar que el administrador o comandante de recursos está apoyado por el comandante de exploración que se ha definido anteriormente y que marca un mapa interno con las posiciones de los recursos a minar. Pequeños ajustes en este comandante harán que este administrador disponga de más o menos opciones a la hora de distribuir las unidades.</p>
<h2>La proporción exacta de cada elementos. La petición del material</h2>
<p>En nuestro sistema, será posible disponer los diferentes elementos en muchas configuraciones y estructuras diferentes. Para este tipo de sistemas, la distribución jerárquica es muy apropiada por lo que distribuiremos el comportamiento bajo este paradigma. Como se ha visto anteriormente en el artículo de “Comandantes y Subcomandantes para el control de comportamiento”, para cada comandante hay un superior que monitoriza las acciones y determina la estrategia de la partida, este es el Comandante General o General a secas.</p>
<p>De el General cuelgan de forma jerárquica los diferentes comandantes. Para simplificar vamos a considerar 3 de ellos. El subcomandante de exploración, el de extracción de recursos y el de batalla. Ya podemos identificar que los 3 tienen necesidad de recursos.  El lugar idoneo para colocar un gestor de los mismos es en el General. De este modo cada subcomandante comunica a su superior los recursos que necesita para llevar a cabo su estrategia. El modelo jerárquico permitirá que varias capas de jerarquía vayan aglutinando los recursos necesarios conforme se sube en el escalafón hasta llegar al nivel superior que determina la estrategia general, el Shogun que comentabamos antes.</p>
<p>Cada clase subcomandante, por lo tanto,  tendrá una función que vincula al General y se resume en:</p>
<pre>peticionDeRecursos(proporción tipo0, proporción tipo1 … proporción tipoN)</pre>
<p>por ejemplo:</p>
<pre>// 100 unidades de oro, 200 de madera y 100 de piedra.<br />
peticionDeRecursos(100, 200, 100);</pre>
<p>Una pequeña variación de comandante será esta:</p>
<p>La clase General tendrá una estructura que permite anotar estos requisitos y facilitarlos cuando sea necesario. Vemos como.</p>
<h2>Como repartir los recursos entre los diferentes elementos lógicos</h2>
<p>Cuando tenemos registradas las peticiones de cada subcomandante podemos abordar el problema desde dos puntos de vista diferentes.</p>
<p>El primero de ellos es seguir una estrategia general y suministrar los recursos en base al estado de la partida (fase inicial, desarrollo, defensiva o ataque… o cualquier otra distribución). De este modo se asigna un porcentaje concreto de distribución de recursos que varía constantemente conforme varía el estado de la partida.</p>
<p><img class="alignright size-medium wp-image-1574 imageborder" title="IMG_2998T" src="http://razonartificial.com/wp-content/uploads/2011/04/IMG_2998T-250x212.jpg" alt="" width="250" height="212" /></p>
<p>El segundo punto de vista es el de las ‘Proporciones dinámicas’. En este caso, el cálculo se hace en base a la suma de todas las peticiones realizadas por los diferentes comandantes de modo que si la suma de de los recursos de un material se dobla, los esfuerzos a realizar por las diferentes unidades también se doblarán.</p>
<p>Una estrategia diferente es la de llevar una lista de las peticiones de cada subcomandante y servirlas de forma ordenada conforme se van adquiriendo los recursos. Esta opción es más costosa de modificar en caso de cambio de estrategia por lo que se utilizará en aquellos<br />casos que no representen una complejidad importante o en el que los estados de juego no varien de forma importante.</p>
<h2>Parámetros para la creación de unidades de recolección óptimas</h2>
<p>Uno de los elementos clave es la creación de unidades y su distribución. Podemos hacer cálculos sencillos definiendo un porcentaje fijo de los recursos que extraemos y creando un número concreto de cada unidad de juego o podemos estimarlas en base a un cálculo más ‘inteligente’.</p>
<p>Para un cálculo más elaborado tendremos que tener en cuenta una serie de medidas que pueden estar o no disponibles y que ajustaremos acorde a nuestro sistema.</p>
<ul>
<li>Total de las demandas de cada subcomandante. Ct</li>
<li>Recursos disponibles actuales cedidos por el General. Rd</li>
<li>Coste de las unidades de recolección, simplificamos con una. Ur</li>
<li>Velocidad de desplazamiento de las unidades. Vu</li>
<li>Tiempo de recolección de las unidades. Trec</li>
<li>Tiempo de construcción de cada recolector. Tc</li>
<li>Distancia Euclidea media a cada tipo de recurso (simplificamos a un solo tipo). De1</li>
<li>Tiempo estimado de consecución de los objetivos actuales. Te</li>
</ul>
<p>El número de trabajadores será, escalado a cada proporción de recursos respecto el total Cd (suponemos solo un tipo):</p>
<p>Suponemos que el Te = (Tiempo de construcción TiC) + (Tiempo de minado total TiM). Este es el peor de los casos ya que podemos construir en paralelo mientras vamos minando, sin embargo es una buena aproximación.</p>
<p>Sea el tiempo de recolección que requiere un trabajador para minar todos los recursos (tiempo en llegar, recolectar y volver medio).</p>
<pre>T1t = Ct/(Trec+Tdesp);</pre>
<p>Tiempo de desplazamiento medio:</p>
<pre>Tdesp = De1 / Vu; (x = vt &lt;– ¿suena esta?)</pre>
<p>Se calcula el TiM (Tiempo que tenemos disponible para minar) como:</p>
<pre>TiM = Te – TiC; </pre>
<p>En un primer paso no conocemos el tiempo de construcción ya que no sabemos cuantos construiremos por lo que marcamos un determinado porcentaje del tiempo esperado de recolección que inicialmente representa un estimador de la velocidad que queremos darle a la extracción y por lo tanto al juego. de este modo:</p>
<pre>//Iniciamos con un factor alto y vamos disminuyendo, por ejemplo 0.8.
//Quiere decir que tenemos la espectativa de dedicar el 20% del tiempo a construir en un primer plano.<br />
TiM = factor*Te; </pre>
<p>Y marcamos el número de trabajadores inicial como Nt:</p>
<pre>Nt =  TiM / T1t;</pre>
<p>Desde este punto monitorizaremos la entrada de recursos y ampliaremos o disminuiremos en función de la carga de los recursos y la disponibilidad de los mismos. Seguiremos una política prudente para no disponer de un número excesivo de efectivos.</p>
<p>Una vez conocemos el Nt podemos calcular el tiempo de recolección esperado como:</p>
<pre>TeCalculado = Tc*Nu + TiM;</pre>
<p>Si este supera en un determinado porcentaje a nuestras espectativas de Te ajustamos el parámetro y volvemos a calcular. El proceso es único para cada paso de la partida y será rápido. De cualquier modo no deja de ser un estimador y debe de ser calculado constantemente para ajustarse a las variaciones del juego.</p>
<h2>Control de los trabajadores y cálculo del recurso idoneo</h2>
<p>El parámetro principal es la distancia a la base desde el recurso. Cuando la mínima distancia al recurso es superior a un determinado parámetro, se debe crear nueva base de recolección más cercana. Esta responsabilidad será del comandante constructor.</p>
<p>Nosotros mandaremos a nuestras unidades al recurso más cercano y al tipo concreto y tantas como el recurso sea capaz de asimilar sin que las unidades interfieran entre ellas. El algoritmo de selección del recurso idóneo para cada unidad será:</p>
<pre>para cada unidad
min = +infinito;
para cada base
para cada recurso libre
distanciaParcial = calculoDistanciaEuclidea (baseActual, recurso);
si distanciaParcial &lt; min
marcaRecursoActual();
finsi
fin
fin
recursoMarcado.numeroDeMineros++;
Si recursoMarcado.numeroDeMineros &gt; máximoDeMinerosPorRecurso
recursoMarcadoExtraidoDelCálculo;
finsi
MonitorPathFinding(unidad, recurso, base);<br />fin</pre>
<p>En términos generales el algoritmo busca el recurso más cercano y lo asigna. Si hay muchas unidades asignadas lo saca del cálculo. Este está simplificado pero para el cálculo algo más complejo tendremos en cuenta la posición de la unidad actual para reasignarla primero a los más cercanos a su posición. Por otro lado podemos tener en cuenta el tipo de recurso filtrando en el caso de que haya más de uno.</p>
<p>Cuando la unidad notifica el fin de recursos a su comandante se reasigna. Si recibe ataque o cualquier otro evento también notifica y se le reasigna.</p>
<h2>Recursos renovables VS No renovables. El comercio de comodín</h2>
<p>El tipo de recursos en muchos de los juegos RTS puede caracterizarse en tres tipos por norma general: renovables, no renovables y auto-generables.</p>
<p>En el último caso no es necesario preocuparse por la distribución ni la estrategia a largo plazo, sin embargo, los otros dos representan un problema, la disponibilidad. Este aspecto lo tendremos en cuenta en la definición de la estrategia general en el ‘General’ haciendo una estimación en base al mapa en el que nos encontremos y a la densidad de recursos. Esto produce una solución dependiente del problema.</p>
<p>Otra solución que no permitirá aprovechar la distribución de los recursos desde el inicio será la de una estrategia adaptativa. Mediante esta orientación, vamos solventando de forma progresiva las peticiones de los subcomandantes conforme vamos adquiriendo material. El ‘comandante General’ puede tener acceso a la lógica de sus subcomandantes de forma conceptual asignando determinados porcentajes de recursos de modo que ell subcomandante ‘conozca’ la situación del minado de los recursos de forma indirecta. De este modo, el subcomandante puede decidir ajustarse al tipo de unidad que más se adapta a la producción en curso y a su cuota asignada. Los elementos que intervendrían en resumen: producción de cada tipo, porcentaje de la producción asignada a cada subcomandante y en sistemas avanzados, estimadores en base a las previsiones de generación de recursos.</p>
<p>El comercio toma una baza significativa en muchos sistemas actuales, siendo el único modo de adquirir determinadas materia primas o recursos y en muchas ocasiones la más efectiva. En nuestro subcomandante de recolección podemos definir una cuota asociada al desarrollo a largo plazo del elemento de comercio. Si bien puede permanecer inactiva en las fases iniciales del juego, conforme se desarrolla puede tomar mayor importancia. Las adquisiciones se harán en base a valores absolutos que recibe el jefe, es decir, el General.</p>
<h2>Defensa de los recursos</h2>
<p>Los recursos son casi tan importantes como las bases por lo que nuestra estrategia a largo plazo implicará defenderlos y afianzar las posiciones de las minas u otros recursos. En este caso interviene el ‘Posicionamiento de las unidades de defensa’ y es una tarea que debe llevar a cabo el Subcomandante de Defensa. La ventaja de haber distribuido la lógica por funcionalidad y tipo de tareas es que en lugar de tener que preocuparnos de buscar recursos o de defenderlos, tenemos que ir a la materia, recogerlos.</p>
<p>Los scouts o exploradores estarán gestionados por el subcomandante de exploración que en la fase correspondiente se encargará de posicionarlos de forma correcta para prevenir ataques sobre las minas. Cuando se detecta una intrusión o un ataque inminente, el Subcomandante de Exploración se encarga de avisar al General con su posición y el General de comunicar a los diferentes Subcomandantes que actuan en un radio de seguridad determinado de una alerta. Si el sistema de control o subcomandante de Recursos recibe una orden de peligro del General, deberá aplicar las maniobras necesarias. En este caso podemos mover las unidades a un punto seguro (la base o los puntos de seguridad concretos) o podemos plantear una mabiobra evasiva. De cualquier modo esperaremos la señal de fin de alerta del General para volver al trabajo.</p>
<h2>Trampeando para mejorar la competitividad</h2>
<p>Una vez hemos visto como lo hacemos bien y de forma organizada, nos bajamos al mundo real en el que tenemos que disponer de un sistema competitivo y que plantee retos a los niveles más avanzados de usuarios. En este caso, podemos trabajar la IA y ajustarla de forma que mediante muchos estados de juego y muchas optimizaciones quizá lleguemos a obtener un buen desempeño, o bien podemos tomarnos la licencia de hacerle un pequeño feo al jugador, claro está este no debe percibirlo, por eso es una trampa.</p>
<p><img class="alignright size-full wp-image-1575 imageborder" title="Cheating_in_Exam" src="http://razonartificial.com/wp-content/uploads/2011/04/Cheating_in_Exam.jpg" alt="" width="300" height="403" /></p>
<p>Lo que se hace en general es inyectar soluciones que influyan directamente en la economía del sistema sin que los enemigos lo perciban. ¿Donde metemos mano? Pues muy facil, en todo lo que se menea y en lo que no. Costes de unidades y edificios, capacidad de extracción de recursos de las unidades, tecnologías adicionales y en definitiva todo aquello que no pueda ser percibido directamente.</p>
<p>Un conocido ejemplo entre los insiders es el del Starcraft, donde en la modalidad Insane, la máquina se ‘atribuye’ 2000 de mineral y de gas, haciendo que la partida sea dura (Por supuesto esto no se extrae a través de un comunicado oficial): <a href="http://www.shamusyoung.com/twentysidedtale/?p=1597">http://www.shamusyoung.com/twentysidedtale/?p=1597</a></p>
<h2>En resumen</h2>
<p>Hemos visto en detalle los elementos que se deben tener en cuenta a la hora de extraer recursos<br />con un punto de vista estratégico, desde la cantidad hasta el control de las unidades. Hemos comprobado como en ocasiones, es necesario añadir ‘ventajas’ competitivas sobre los jugadores y hemos distribuido la lógica del sistema de recolección y su comunicación con el resto de elementos del juego. Se ha visto que en función del estado en el que nos encontremos, aplicaremos una estrategia diferente y que en lo referente a la defensa y a la exploración, daremos por hecho que cada elemento cumple con su objetivo. En caso de detectar cualquier problema, sabremos donde ir a solucionarlo.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/04/artesania-control-exploradores-juegos-estrategia/" class="wp_rp_title">Artesania del control de exploradores en juegos de estrategia</a></li><li ><a href="http://razonartificial.com/2011/04/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/" class="wp_rp_title">Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia</a></li><li ><a href="http://razonartificial.com/2010/08/orts-estrategia-en-tiempo-real-opensource/" class="wp_rp_title">ORTS. Estrategia en tiempo real OpenSource</a></li><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li ><a href="http://razonartificial.com/2010/01/optimizacion-basada-en-colonias-de-hormigas-en-la-naturaleza/" class="wp_rp_title">Optimización basada en colonias de hormigas</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/Hq5rWPnxbfM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/</feedburner:origLink></item>
		<item>
		<title>Artesania del control de exploradores en juegos de estrategia</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/YT-fN6A-Ulw/</link>
		<comments>http://razonartificial.com/2011/04/artesania-control-exploradores-juegos-estrategia/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 01:24:06 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Estrategias]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Programación Artículos]]></category>
		<category><![CDATA[RTS]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1549</guid>
		<description><![CDATA[Una de las tareas principales que un jugador o un sistema de estrategia en tiempo real debe llevar a cabo es la de conocer su entorno para poder plantear un desarrollo adecuado. En este artículo vamos a ver en detalle algunos de los conceptos que tienen que ver con el descubrimiento y la observación del terreno incluyendo las tácticas de exploración más comunes. Dado que trataremos la mayor parte de las técnicas necesarias, empezamos a nivel conceptual por aquellas que tienen lugar primero: las de scouting. En primer lugar tendremos que decidir si queremos que nuestro sistema de inteligencia artificial sea piratilla y trabaje basado en trampas o si por el contrario queremos desarrollar un sistema realista. De antemano ya os digo que muchos de los juegos que se comercializan actualmente hacen trampas y saben exactamente a donde dirigirse, tanto en materia de recursos como en posiciones de enemigos. Muchos hacen la trampa de la sorpresa, hasta que no los atacas parece que desconocen tu posición, sin embargo podeis hacer la prueba y ver en cuantos juegos de RTS (real time strategy) podeis permanecer ‘ocultos’ despues de un ataque por sorpresa. Generalmente recibireis un generoso contraataque si la máquina está [...]]]></description>
				<content:encoded><![CDATA[<p>Una de las tareas principales que un jugador o un sistema de estrategia en tiempo real debe llevar a cabo es la de conocer su entorno para poder plantear un desarrollo adecuado.</p>
<p>En este artículo vamos a ver en detalle algunos de los conceptos que tienen que ver con el descubrimiento y la observación del terreno incluyendo las tácticas de exploración más comunes. Dado que trataremos la mayor parte de las técnicas necesarias, empezamos a nivel conceptual por aquellas que tienen lugar primero: las de scouting.</p>
<p><img class="alignright size-medium wp-image-1553 imageborder" title="aoe3wc_R" src="http://razonartificial.com/wp-content/uploads/2011/04/aoe3wc_R-250x187.jpg" alt="" width="250" height="187" /></p>
<p>En primer lugar tendremos que decidir si queremos que nuestro sistema de inteligencia artificial sea piratilla y trabaje basado en trampas o si por el contrario queremos desarrollar un sistema realista. De antemano ya os digo que muchos de los juegos que se comercializan actualmente hacen trampas y saben exactamente a donde dirigirse, tanto en materia de recursos como en posiciones de enemigos. Muchos hacen la trampa de la sorpresa, hasta que no los atacas parece que desconocen tu posición, sin embargo podeis hacer la prueba y ver en cuantos juegos de RTS (real time strategy) podeis permanecer ‘ocultos’ despues de un ataque por sorpresa. Generalmente recibireis un generoso contraataque si la máquina está en condiciones.</p>
<p>De cualquier lugar aqui apostamos por crear sistemas realistas, entendiendo por realistas los que disponen de la información que les proporcionan sus unidades y no de otros parámetros externos al juego. Las dos opciones son válidas puesto que como es lógico, en ocasiones la rigurosidad de los sistemas viene determinada de forma inversamente proporcional al grado de presión que ejerza el game designer. Nosotros nos centraremos ahora en la solución en la que vale la pena discutir el tema, sin trucos.</p>
<h2>Scouting basics</h2>
<p>Sin entrar en detalle de los algoritmos que vayamos a emplear a nivel interno (pathfinding, comandantes, autómatas … etc), trataremos el tema desde un punto de vista mayormente teórico. La única preocupación que debemos tener es la de generar puntos del mapa bajo determinadas trayectorias.</p>
<p>El primer elemento a identificar es la unidad de scout. De entre todas las unidades disponibles en el ejercito, lo más probable es que una de ellas sea la más adecuada por su ligereza, su bajo coste, su resistencia moderada y rango de visión. Esta o estas serán las unidades de exploración.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1554 imageborder" title="agescout" src="http://razonartificial.com/wp-content/uploads/2011/04/agescout.png" alt="" width="577" height="433" /></p>
<h2>Objetivos</h2>
<p>Lo que buscamos con el explorador no es solo descubrir el terreno sino mantenerlo libre de enemigos y disponer de información precisa de lo que pasa. Se identifican algunas de las metas a alcanzar.</p>
<ul>
<li>Encontrar recursos</li>
<li>Identificar unidades enemigas en el territorio propio y en el enemigo</li>
<li>Encontrar la posición de la base del enemigo</li>
<li>Marcar puntos de interés (pasos elevados, cuellos de botella, etc.)</li>
<li>Táctica del oponente. Preveer movimientos y ataques en camino.</li>
<li>Llevar a cabo ataques estratégicos.</li>
</ul>
<p>Algunos de estos objetivos son únicos en el tiempo puesto que el mapa no variará respecto al tiempo. Otros requerirán de un monitorizado constante y de ajustes continuos.</p>
<p>De cualquier modo no se presenta como una solución absoluta sino como un primer enfoque más profundo de lo que es necesario en materia de exploración y sobre el que añadir nuevas tácticas y varias objetivos.</p>
<h2>Fase I. La puesta en marcha</h2>
<p>Nos ponemos en la piel de un jugador de RTS y vamos a poner de ejemplo una partida de Age of Empires. En ella nuestro explorador es un jinete a caballo rápido y con puntos de defensa y ataque limitados.</p>
<p>Nuestros objetivos principales son, identificar fuentes cercanas de abastecimiento y descubrimiento radial del entorno. Fijaremos con punto inicial de referencia el de la base propia y generaremos trayectorias radiales de diámetro creciente hasta un cierto punto que fijaremos en función del mapa.</p>
<p style="text-align: center;"><img class="aligncenter size-medium wp-image-1555 imageborder" title="aoe1" src="http://razonartificial.com/wp-content/uploads/2011/04/aoe1-250x187.jpg" alt="" width="250" height="187" /></p>
<p>Una vez identificadas las fuentes de suministros mínimas fijadas desde el planificador o el comandante de exploración segun el control de comportamiento que llevemos, pasaremos a seguir con las tácticas de medio juego.</p>
<h2>Fase II. El desarrollo de la partida.</h2>
<p>Una vez hemos identificado las fuentes de recursos y descubierto el entorno más próximo. El siguiente nivel es ampliar el rango de exploración para detectar el resto de elementos relevantes: recursos, enemigos y puntos de interés.</p>
<p>Seguiremos una estrategia radial del mismo modo. Iremos marcando posiciones al explorador siguiendo un radio creciente y marcaremos cada fuente de recursos encontrada y la posición de los enemigos así como la de su base en caso de encontrarla.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1556 imageborder" title="age-of-empires-deathmatch-destroy-enemy-base" src="http://razonartificial.com/wp-content/uploads/2011/04/age-of-empires-deathmatch-destroy-enemy-base.jpg" alt="" width="320" height="240" /></p>
<p>Los puntos de interés son zonas elevadas y pasos estrechos. Estos los conoceremos por nuestro grafo de claridad que se ha visto en detalle anteriormente. Como resumen, llevamos un estado de los espacios de cada posición del mapa al obstáculo más cercano, lo que nos permite saber si determinadas unidades pasarán o guiar los algoritmos de pathfinding. Nos interesa por tanto los puntos en los que pasan pocas y los marcaremos como cuellos de botella. En estrategia de combate que veremos más adelante veremos como nos pueden ser de ayuda.</p>
<p>En lo referente a las bases enemigas, una vez localizadas intentaremos dirigir la búsqueda o exploración hacia áreas alejadas con la finalidad de reducir la probabilidad de que el scout reciba un ataque.</p>
<p>Una vez localizado el enemigo y algunos grupos de recursos adicionales, la exploración toma otro matiz.</p>
<h2>Fase III. La fase de convergencia</h2>
<p>Esta fase se alcanza una vez conocemos suficiente sobre el entorno estático (para simplificar recursos, enemigo y puntos de interés) Una vez disponemos de esa información los exploradores pasan a tener otro cometido, el de estudiar el avance del enemigo y el de garantizar la integridad del territoriio. Eventualmente pueden colaborar en la estrategia de combate pero eso lo veremos más adelante. No tengas prisa pequeño saltamontes, todo lo bueno llega.</p>
<h3>El patrullado</h3>
<p>es una de las tareas principales de los exploradores en esta fase de desarrollo del juego. No podemos simplemente asignar y distribuir los exploradores por el territorio sin más y substituirlos cada vez que son eliminados ya que esto representaria un comportamiento predecible y el usuario podría detectar un comportamiento repetitivo y por lo tant aburrido en muy poco tiempo.</p>
<p>La estrategia en este caso varía. A priori se deben tener en cuenta dos temas básicos dentro del patrullado. El primero de ellos es  el posicionamiento de los exploradores. En este caso la distribución óptima vuelve a ser radial, sin embargo el ángulo de colocación de los exploradores no tiene porqué ser el de máxima difusión, de otro modo, el usuario puede detectarlo y acabar regularmente con todos ellos. Es más apropiado generalmente distribuirlos de forma semialeatoria en un rango que varie de la máxima difusión en pequeños porcentajes. Por ejemplo, si desde la estrategia general se asignan recursos como para disponer de 6 exploradores, la máxima difusión suponiendo que estamos emplazados en el centro inferior y tomando como ángulo 0 la linea inferior que delimita la pantalla, colocariamos de forma de máxima difusión los 6 exploradores para abarcar un sector de 180 grados por lo que estarán en los ángulos 0, 30, 60, 90, 120, 150 y 180 respectivamente con un radio de patrullado determinado (pongamos 20 grados). Una posible colocación y comportamiento sería inicialmente definir un radio de patrullado aleatorio y una colocación +- un 20%, de este modo la distribución es menos predecible. La distancia del radio a la base será definida de forma dinámica calculando la distancia al edificio más lejano como medida de simplificación y añadiendo un determinado factor. Soluciones más complejas darán lugar a una mejor distribución y adaptación al terreo, utilizando mapas de influencia por ejemplo describiremos con mayor precisión el area en la que debemos situar los exploradores. De cualquier modo se trata de tener en cuenta estos conceptos cuando abordemos un trabajo del estilo.</p>
<h3>La evasión</h3>
<p>Otro de los temas a tener en cuenta es el de la evasión. Una vez localizado al enemigo debemos iniciar la táctica de evasión y comunicar al comandante el avistamiento. Si utilizamos cualquier otra forma de control de comportamiento deberemos igualmente incluir una función que comunique el evento. POdemos o bien iniciar la evasión simple, vuelta a la base y espera de un tiempo concreto o bien iniciar el seguimiento desde la distancia del enemigo localizando el enemigo más cercano y manteniendo una distancia prudencial. Esta última estrategia generalmente dará como lugar la eliminación del explorador pero aportará más información sobre las intenciones del enemigo. En cualquuier caso el explorador<br />debe estar monitorizado.</p>
<h3>Tácticas de comando</h3>
<p>La inclusión de tácticas de comando en el area enemiga. Estas maniobras irán destinadas a descubrir los avances y las posiciones del enemigo por lo que iniciaremos tareas de acercamiento progresivo al area del enemigo alternando maniobras de exploración con maniobras de evasión. Esta será una táctica arriesgada que dará lugar en muchas ocasiones a la eliminación del scout. En este aspecto se asumen los costes en favor de un bien mayor ya que con la información obtenida podemos informar a los comandantes de combate, constructor y científico acerca de los progresos y que ellos actuen en consecuencia. Cualquier otro enfoque dará lugar a corregir de algun modo las construcciones, la creación de unidades y el desarrollo científico para el correcto uso de la información que hemos obtenido con el scout.</p>
<h3>maniobra Tora Tora Tora</h3>
<p>La maniobra Tora Tora Tora! Es la que pretende acercarse al corazón del enemigo en una maniobra kamikace que da lugar a la eliminación prácticamente segura del scout pero aporta mucha información acerca del grado de desarrollo del enemigo. Muchos de los jugones aqui presentes habrán hecho sacrificios similares para ver como va el tema en casa del malo. El caso es que aqui no podemos guardar antes de liarla y volver a cargar una vez sabemos donde estan las defensas y los edificios más importantes.</p>
<p>Hay más elementos tácticos que son importantes en lo referente a esta fase del juego pero para empezar y tener un buen conocimiento de los elementos que se tienen en cuenta en el juego ya está muy pero que muy bien. Desarrollar a nivel técnico lo que aqui se escribe a nivel conceptual representa un buen reto para cualquier desarrollador de sistemas de IA por lo que tenemos trabajo que hacer.</p>
<h2>Conceptos matemáticos involucrados</h2>
<p>Hemos hablado aqui bastante de generar trayectorias radiales sobre las que ir explorando o  colocando a los exploradores pero que demonios es una trayectoria radial y cómo la calculo? De eso nos vamos a encargar ahora. Porque aqui y no arriba cuando las necesitabamos? POrque una vez sabemos para que las vamos a utilizar nos podemos poner manos a la obra mucho más agusto.</p>
<p>En primer lugar, una <strong>trayectoria radial</strong> se refiere al hecho de que un determinado elemento sigue un camino definido en base a un punto que representa el centro de un circulo y un radio concreto de distancia a ese círculo. Pongamos que si quisieramos mover una unidad de forma radial por una rueda de bicicleta, dariamos puntos muestreados que coincidirian en la cubierta. Más sencillo, dibuja un círculo y las unidades se moverán por un sector determinado de ese círculo.</p>
<p>El centro de la trayectoria es generalmente un punto de una malla, no bajamos a nivel de pixel para no complicar nuestros algoritmos de pathfinding (si esto lo llevas verde dale un vistazo a los artículos de pathfinding, tenemos para todos los públicos). Por lo tanto tendremos un punto X y otro Y que definen la posición en X y en Y respectivamente. Los llamaremos Xc e Yc a partir de ahora.</p>
<p>Otro elemento será el radio R que definirá la distancia a la que deberán moverse o posicionarse las unidades. Por supuesto que cuando le pasemos las posiciones finales al algoritmo de pathfinding, el mismo buscará las trayectorias más adecuadas. Si queremos un movimiento claramente radial deberemos obtener muchas muestras y pasarselas a nuestro pathfinder. De cualquier modo no te preocupes de esto porque lo definiremos como Nm (número de muestras).</p>
<p>Otro de los elementos a tener en cuenta son los grados de posicionamiento (Gp). Con este elemento posicionamos en la circunferencia el elemento. Una unidad situada a 10 pasos de radio y a 90 grados se posicionará enfrente. A 0 grados se moverá en linea recta hasta la derecha y a 180 se moverá a la izquierda.</p>
<p>Teniendo todos los elementos ahora, como calculamos la posición X e Y definitiva. Mucho más sencillo de lo que puede parecer a priori, utilizando senos para la componente vertical y cosenos para la horizontal. Dado que nuestra posición en el mapa será arbitraria, simplificaremos suponiendo que al empezar es lógico explorar toda la circumferencia de la base, sin embargo, algoritmos sencillos pueden estimar y determinar que rango de grados deben ser explorados en casos como por ejemplo si aparecemos en una esquina del mapa. Vamos por partes.</p>
<p><img class="aligncenter size-full wp-image-1551" title="trayradial" src="http://razonartificial.com/wp-content/uploads/2011/04/trayradial.png" alt="" width="220" height="145" />En la imagen vemos desde un pun to C los puntos abarcables con un determinado radio.</p>
<p><strong>1.</strong> calculamos la posición X e Y donde debe ir la unidad para un grado concreto y un radio determinado. El valor en X será el coseno del ángulo por el radio y el de Y el seno del mismo ángulo por el radio.</p>
<p><img class="aligncenter size-full wp-image-1552" title="trigonometriaplana060" src="http://razonartificial.com/wp-content/uploads/2011/04/trigonometriaplana060.jpg" alt="" width="711" height="468" /></p>
<p><strong>2.</strong> calculamos la correspondencia a nuestra malla de los valores obtenidos. Sabiendo el tamaño en X y en Y de nuestra malla (no siempre igual), el cálculo del elemento al que tenemos que ir se obtendrá dividiendo el valor obtenido por el propio tamaño correspondiente. De este modo si habiamos obtenido en el primer paso X = 2.2 e Y = 4.6 y tenemos tamaños de malla igual a 1 en X e Y, la posición pasará a ser (x,y) = 2, 4. Y ya se la podemos pasar al algoritmo de pathfinding que para ser eficiente trabajará con la malla.</p>
<p><strong>3.</strong> Vistas las posiciones absolutas planteamos un muestreo desde un grado inicial de la circumferencia a un grado final de la misma.</p>
<p>Teniendo el parámetro número de muestras (Nm) calcularemos los incrementos de grado que le vamos a pasar a nuestra función de cálculo de posiciones construida a partir de los pasos 1 y 2 asi:</p>
<p><strong>incGrados = (GradoFinal – GradoInicial) / Nm;</strong></p>
<p>Una vez tenemos el incremento de grados para cada paso del algoritmo iteramos.</p>
<pre>iteracion = 1;
Desde 1 Para cada Nm
(x, y) =CalcularPosición(GradoInicial + (incGrados*iteracion);
pathfinding(x, y);
iteración ++;
Final</pre>
<p>Es decir, calculamos, movemos y repetimos el proceso.</p>
<h2>El enfoque hacia objetivos</h2>
<p>Se ha tratado un enfoque basado en fases de juego en los que pasar de una fase a otra dependía de la consecución de diferentes metas como encontrar al enemigo o descubrir una parte del terreno. El enfoque hacia objetivos varía respecto a la propuesta anterior por el hecho de que las unidades scout se generan y se comportan exclusivamente para cumplir determinados objetivos.</p>
<p>La diferencia respecto a la anterior propuesta es sutil pero a nivel interno el cambio es más importante. Vemos un ejemplo que lo dejará más claro. Nuestro procedimiento será ahora crear tantos exploradores como sean posibles, encontrar N fuentes de recursos. Una vez encontrados revelar un porcentaje concreto del mapa. Una vez hecho esto buscar al enemigo. Cuando esté localizado determinar 3 puntos de interés, sino pasa un tiempo determinado damos por supuesto que no hay más y seguimos con el revelado del mapa. Hecho esto protegemos y patrullamos la base. La diferencia radica en el enfoque, mientras que en el modelo anterior se va trabajando segun la fase, aqui se motiva este cambio de forma progresiva y secuencial en función del objetivo. En el modelo anterior se cambiará de fase cuando se completen unos determinados puntos, en este último seremos nosotros los que busquemos la consecución inmediata de estos aunque esto no sea la estrategia más adecuada a largo y corto plazo.</p>
<h2>Respuesta a inconvenientes</h2>
<h3>Es atacado</h3>
<p>El scout es detectado y está siendo atacado. En este caso se puede dirigir a la base o considerar el movimiento alejandonos de ella. En una primera valoración puede parecer lógico llevarlo al abrigo de nuestras unidades, sin embargo puede que no nos sea beneficioso guiar al enemigo a nuestra posición.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1559 imageborder" title="aug1gal05-run-for-your-life" src="http://razonartificial.com/wp-content/uploads/2011/04/aug1gal05-run-for-your-life.jpg" alt="" width="500" height="317" /></p>
<p>Conceptos más laboriosos son los que involucran bases de apoyo secundarias que pueden proteger de forma eventual problemas de este tipo.</p>
<h3>Encuentra un grupo de aldeanos</h3>
<p>En este caso existe la posibilidad de iniciar maniobras de hostigamiento. Mientras el enemigo no ponga vigilancia, será posible golpear y huir a los aldeanos provocando molestias y pérdidas al jugador. Generalmente será contrarrestado con un destacamento de protección. Hecho que también puede ser aprovechado para atacar la base en extremos opuestos, a sabiendas de que hay unidades alejadas que antes defendian y ahora no.</p>
<h2>Pincelada de estrategia de combate usando exploradores</h2>
<p>Como veremos en artículos de estrategia de combate. Una de las tácticas más efectivas es la de la distracción. Desde que los humanos peleábamos con garrote las tácticas de distracción han sido extremadamente útiles. En este caso se trata de mandar al scout a una zona de minado de recursos del enemigo lo más alejada posible y de forma casi simultanea enviar tropas de ataque por el lateral contrario de la base enemiga. Las inteligencias artificiales en su práctica totalidad enviarán unidades y desplazarán algunas de las producidas. Puede ser efectiva o no, en cualquier caso si los aldeanos no se protegen serán menguados y su ritmo de producción caerá, lo que ya es positivo. Si defienden correctamente la protección en la zona se verá disminuida por lo que podremos aprovechar el ataque con más garantías.</p>
<p>Esto es estrategia de combate y de la complejidad y riqueza de las mismas haremos disfrutar y sufrir al jugador dándole un buen nivel al juego.</p>
<h2>En resumen</h2>
<p>Hemos visto los elementos más importantes a tener en cuenta en materia de exploración para tener una inteligencia artificial competitiva. Se han tenido en cuenta los conceptos matemáticos para generar una trayectoria radial respecto a un punto concreto y definir el grado de precisión a pasarle al pathfinder. Finalmente se han tratado algunos modelos más sencillos y se ha adelantado un pequeño concepto de combate. Ahora toca ponerlos en práctica.</p>
<p>Algunos de los juegos actuales incluyen unidades espia. La función de éstos es básicamente la del explorador con funcionalidad añadida como el sabotaje o la contaminación de edificios. Muchas de los conceptos aqui detallados son aplicables a la unidad espia.</p>
<p><strong>Original:</strong> <a href="http://www.starcostudios.com/blog/2010/02/artesania-del-control-de-exploradores-en-juegos-de-estrategia/">http://www.starcostudios.com/blog/2010/02/artesania-del-control-de-exploradores-en-juegos-de-estrategia/</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" class="wp_rp_title">Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</a></li><li ><a href="http://razonartificial.com/2011/04/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/" class="wp_rp_title">Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia</a></li><li ><a href="http://razonartificial.com/2010/08/orts-estrategia-en-tiempo-real-opensource/" class="wp_rp_title">ORTS. Estrategia en tiempo real OpenSource</a></li><li ><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" class="wp_rp_title">Gran Pack de desarrollo de videojuegos</a></li><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/YT-fN6A-Ulw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/04/artesania-control-exploradores-juegos-estrategia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/04/artesania-control-exploradores-juegos-estrategia/</feedburner:origLink></item>
		<item>
		<title>Sun Tzu 2.0 – El Arte de la guerra en los juegos de Estrategia</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/tBsZbWyzaRI/</link>
		<comments>http://razonartificial.com/2011/04/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 15:53:25 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Estrategia]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[RTS]]></category>
		<category><![CDATA[Táctica]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1538</guid>
		<description><![CDATA[Como creadores de inteligencia artificial orientada a los juegos de estrategia, debereis ser conocedores de las más antiguas técnicas estratégicas. Para ello vamos a echar mano de uno de los mejores generales y estrategas del pasado, Sun Tzu. El aspirante a Samurai Informático deberá conocer las enseñanzas del maestro a través de su célebre libro ‘El arte de la Guerra’. El Maestro Sun Tzu dijo: “Un ejército victorioso gana primero y entabla la batalla después; un ejército derrotado lucha primero e intenta obtener la victoria después.” Aqui veremos como crearlo. En la mayoría de juegos de estrategia estaremos condicionados a conseguir determinados objetivos que se verán por regla general amenazados por uno o varios enemigos de diferente índole. En este artículo vamos a ver en detalle que conceptos intervienen en el enfoque estratégico y táctico de una partida genérica de un juego de estrategia en tiempo real. Muchos de estos conceptos son extrapolables a otro tipo de juegos como los basados en turnos o los queestán orientados al crecimiento del jugador sin oponentes. Sin embargo, serán muy útiles especialmente en los RTS. Nuestro objetivo como creadores de inteligencia artificial es claro, crear una máquina mortífera capaz de destruir al jugador oponente, [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1540 imageborder" title="PocketSunTzu-300x240" src="http://razonartificial.com/wp-content/uploads/2011/04/PocketSunTzu-300x240.gif" alt="" width="300" height="240" /></p>
<p>Como creadores de inteligencia artificial orientada a los juegos de estrategia, debereis ser conocedores de las más antiguas técnicas estratégicas. Para ello vamos a echar mano de uno de los mejores generales y estrategas del pasado, Sun Tzu. El aspirante a Samurai Informático deberá conocer las enseñanzas del maestro a través de su célebre libro <a href="http://es.wikipedia.org/wiki/El_arte_de_la_guerra">‘El arte de la Guerra’</a>.</p>
<blockquote><p>El Maestro Sun Tzu dijo: “Un ejército victorioso gana primero y entabla la batalla después; un ejército derrotado lucha primero e intenta obtener la victoria después.”</p>
</blockquote>
<p>Aqui veremos como crearlo.</p>
<p>En la mayoría de juegos de estrategia estaremos condicionados a conseguir determinados objetivos que se verán por regla general amenazados por uno o varios enemigos de diferente índole. En este artículo vamos a ver en detalle que conceptos intervienen en el enfoque estratégico y táctico de una partida genérica de un juego de estrategia en tiempo real. Muchos de estos conceptos son extrapolables a otro tipo de juegos como los basados en turnos o los queestán orientados al crecimiento del jugador sin oponentes. Sin embargo, serán muy útiles especialmente en los RTS.</p>
<p>Nuestro objetivo como creadores de inteligencia artificial es claro, crear una máquina mortífera capaz de destruir al jugador oponente, ya sea humano u otra máquina. Por otro lado tenemos que garantizar la posibilidad de dominar a la bestia, haciendo que sea todo lo efectiva que queramos, es decir, permitir que diferentes niveles de jugador puedan enfrentarse.</p>
<p>Detallaremos los conceptos que son necesarios para modelar nuestro propio Gengis Kan, tu Napoleon o tu Jerjes, cada uno con sus gustos. Una vez hayamos terminado aqui sereis especialistas estrategas en lo que al mundo virtual se refiere.</p>
<h2>Empezamos</h2>
<p>Un buen sistema de estrategia se focalizará en todos los elementos que toman parte en el desarrollo del juego. Tendremos en cuenta de este modo, tanto recursos como unidades, tecnología o terreno.</p>
<p>En primer lugar hay que marcar el camino que queremos seguir en materia algoritmica. Poemos elegir principalmentedos opciones cada una de ellas apropiada para cada caso. La primera de ellas es usar estrategias preconcebidas.</p>
<p>Esta modalidad implica que tenemos que dotar de un conocimiento previo a nuestro sistema para que responda de forma correcta y se oriente a llevar a cabo una serie de soluciones. Un ejemplo de este modelo será el desarrollo clásico de una partida de estrategia: recoletar, fortificarse, contruir ejército y atacar/defenderse. A un nivel más detallado podemos incluir reglas concretas como favorecer la ocupación de lugares altos o crear una determinada proporción de unidades de diferentes tipos. Estas etrategias vendrán por lo tanto muy ajustadas al entorno en el que estamos creando la inteligencia artificial y serán difícilmente rehusables en otros.</p>
<p>La segunda de nuestras opciones será más compleja e implicará técnicas de Ninja Informático como algoritmos de modelado del jugador mediante machine Learning. Estas soluciones suelen requerir algunas partidas para ajustar los parámetros principales y se adaptan al nivel del jugador. Sin embargo, son más complejas de diseñar y adaptar por lo que en la mayoría de las ocasiones se opta por definir un comportamiento concreto como el fijado en el primer puntoy se crea un autómata de estados finito jerárquico para controlarlo. De cualquier modo, una vez dominados los algoritmos de aprendizaje, pueden utilizarse con mayor sencillez para tipos de juego similares.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1541 imageborder" title="Anibal-Alpes" src="http://razonartificial.com/wp-content/uploads/2011/04/Anibal-Alpes.jpg" alt="" width="400" height="293" /></p>
<p>Una vez escogido el modo en el que vamos a llevar a cabo nuestro desarrollo, deberemos profundizar en el uso de estratagemas más propias de táctica y estrategia general que de cuestiones tecnológicas. Vamos a ver ahora en qué áreas y qué tiposd de estrategias vamos a llevar a cabo en cada una.</p>
<h2>Áreas a tener en cuenta</h2>
<p>Cada área de las que tendremos en cuenta a continuación suele presentarse casi de forma obligatoria en los juegos de estrategia en tiempo real. Añadir complejidad en el comportamiento de nuestra sistema en las mismas hará que el usuario tenga una mejor experiencia de juego y se le presente una inteligencia artificial no encorsetada en la misma reacción. Esto es lo que realmente añade riqueza a la inteligencia artificial ya que conforme las estratgemas y mecanismos aumentan, más dificil es para el jugador preveer el comportamiento. No se trata de hacer que el sistema sea invencible sino de que sorprenda al usuario. Una regla de oro en el desarrollo de sistemas de inteligencia artificial para juegos es que la IA nunca debe ser más ‘lista’ que el jugador pero si tanto o más pícara por caracterizarla con una palabra políticamente correcta. Se me ocurren otras palabras para describir el comportamiento que debe tener la IA con más exactitud pero no las diré aqui. Queda a la imaginación de cada uno. Piensa mal y acertarás.</p>
<p>Vamos a ir viendo en detalle las áreas que siguen a continuación. De la correcta creación y desempeño de cada una de estas áreas dependerá la calidad de nuestro ‘Warlord’ Artificial.</p>
<ul>
<li>Inteligencia artificial para la recolección.</li>
<li>Inteligencia artificial para la construcción.</li>
<li>Inteligencia artificial para la tecnología.</li>
<li>Inteligencia artificial para la exploración.</li>
<li>Inteligencia artificial para el ataque.</li>
<li>Inteligencia artificial para la defensa.</li>
</ul>
<p>
<p style="text-align: center;">[There is a video that cannot be displayed in this feed. <a href="http://razonartificial.com/2011/04/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/">Visit the blog entry to see the video.]</a></p>
</p>
<ul style="text-align: center;"> </ul>
<p>Cada una de ellas es una pieza clave en el correcto desarrollo del juego, Mejorarlas y añadiendo complejidad respetando la regla de oro anterior es hacer que nuestro sistema sea cada vez más rico e interesante. Las veremos en detalle una a una.</p>
<blockquote><p>Ahora, el general que gana una batalla hace muchos cálculos en su cuartel, considera muchos factores antes de que ésta se libre. El general que pierde una batalla hace pocos cálculos en su cuartel, considera pocos factores antes de que ésta se libre. Muchos cálculos llevan a la victoria, pocos cálculos llevan a la derrota.</p>
</blockquote>
<h2>Dificultad exacta</h2>
<p>Un factor importante que se ha comentado anteriormente es el de limitar las capacidades de nuestro sistema de IA. Es necesario que de un modo u otro, el usuario pueda desarrollar los objetivos sin desesperarse en exceso. Si bien es bueno que nuestro sistema plantee un reto considerable, no es preferible que el usuario acabe lanzando la consola o el pc por la ventana.</p>
<p>Para definir y acotar el nivel de dificultad tenemos infinidad de mecanismos, sin embargo, unos de los más empleados son los que se comentan a continuación. En primer lugar, al no disponer de un nivel de proceso concreto como el aplicado en algoritmos de teoría de juegos como el minimax, no es sencillo definir de forma numérica el desempeño del algoritmo. Lo que haremos en este caso es relajar los objetivos. Con relajar se entiende ralentizar la obtención de elementos (recursos, tecnologías, unidades), disminuir el grado de desempeño de las unidades y bajar el nivel de coherencia de las acciones (gastos en tecnologías que no ofrecen sinergias, producción de determinados tipos de unidades en exceso o insuficientes…etc). Esto será muy sencillo si definimos los objetivos de forma que en cada estado del juego pueda medirse el grado de consecución de los mismos.</p>
<p>Este es solo un enfoque del estudio del ajuste de la dificultad a los diferentes niveles de juego previstos. Otro enfoque se basa en dificultar el desempeño en las diferentes áreas que hemos visto anteriormente haciendolas más ineficientes. En esta variante intentaremos definir nuestros algoritmos internos (pathfinding, distribución, scouting…etc) de forma que podamos parametrizar lo máximo posible su grado de eficiencia. De este modo creariamos algoritmos flexibles en desempeño, en el caso de los algoritmos de pathfinding la eficiencia máxima corresponde al mínimo camino entre la fuente y el destino. En el caso de un algoritmo de scouting la eficiencia máxima puede darse cuando se busca magnificar el área descubierta con la máxima velocidad.</p>
<p>Visto el ajuste de dificultad por relajación de los objetivos y el ajuste por areas, vamos a ver un concepto diferente, el modelado del jugador.</p>
<h2>Modelar al jugador</h2>
<p>Una vez que planteamos el ajuste de la dificultad de forma interna en el juego, podemos hacer dos cosas. O bien permitir que el usuario ajuste la dificultad y a partir de niveles concretos (fácil, medio, dificil…) traduciendo internamente a las diferentes áreas u objetivos.</p>
<p>O bien podemos modelar nosotros mismos a partir del desempeño del jugador y hacer un autoajuste. Existe mucha documentación referente al modelado del jugador, por lo que este tema puede verse con mucho detalle.</p>
<p>Un ejemplo de modelado sería el siguiente. En primer lugar estableceremos una correspondencia entre los elementos que intervienen en el juego y la dificultad que esto plantea al usuario a nivel medio. Una vez disponemos de esta información el monitorizado será una constante durante el desarrollo de la partia. Cada cierto tiempo austaremos nuestros valores internos mediante los mecanismos de ajuste de dificultad vistos anteriormente y en función de los parámetros observados en el usuario. Esto, sin embargo plantea un problema desde el punto de vista en el que necesitamos valores del usuario a los que teóricamente no tenemos acceso como jugadores y por esto desde el punto de vista de la inteligencia artifical estamos haciendo trampas. Esto es más que usual en el desarrollo de juegos comerciales, sin embargo, aqui estamos buscando soluciones que impliquen una inteligencia artificial ‘real’.</p>
<p>una solución al problema anterior es echar mano de algoritmos de aprendizaje. En este caso, los algoritmos irán tomando decisiones y observando la recompensa o la pérdida que estas decisiones le reportan ajustando los diferentes parámetros. Para ello, será necesario interactuar con el usuario inicialmente sin conocer sus capacidades y las primeras partidas pueden ser un tanto desastrosas. Solo los Grandes Maestros Ninjas Informáticos se atreven a ofrecer soluciones comerciales de este tipo. Uno de los pocos ejemplos es el Black And White de LionHead Studios que apostó por algoritmos de este tipo y salió más que bien parado.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1544 imageborder" title="bw252ly" src="http://razonartificial.com/wp-content/uploads/2011/04/bw252ly.jpg" alt="" width="500" height="399" /></p>
<p>Para los más interesados podeis profundizar en temas de redes neuronales, algoritmos de computación evolutiva y machine learning en general. De cualquier modo el tema es tan extenso como interesante por lo que no perdais ni un minuto. Yo diría que entre todos los conceptos de computación, los que están en estas áreas son los que me han resultado más interesantes.</p>
<h2>Trampas de los creadores de juegos</h2>
<p>Para terminar el tema de la estrategia es necesario y más que recomendable echar un vistazo a los pequeños trucos de Ninja Informático que utilizan los creadores de inteligencia artificial orientada a los juegos de estrategia. Puede parecer que esto es un insulto a la integridad de vuestro sistema de IA y a vuestras capacidades, sin embargo, cuando los tiempos de entrega aprietan y se hace necesario disponer de un sistema competitivo, os acordareis de esta sección.</p>
<p>La primera de las trampas es jugar con los recursos. La cantidad de recursos y el tipo de los mismos que tu minas por unidad de tiempo con una unidad determinada no siempre tiene que ser igual a la que tiene vuestro oponente artificial. Esto se llama generalmente ‘dopar’ a las unidades.</p>
<p>Otra de las trampas más utilizadas es el monitorizado de la creación de unidades de los oponentes. El sistema observa los tipos de Unidades que se están creando y construye las más apropiadas para combatir el ejército enemigo. La velocidad de construcción y de minado cuando es posible tambien se modifica, haciendo que el desarrollo sea más rápido. El resto de unidades estar tambien dopadas.</p>
<p>Otro truco es modificar los costes de las unidades y del resto de elementos del juego. Con lo que tu obtienes X, el sistema de inteligencia artificial puede obtener 2X, ¿fácil no?.</p>
<p>Uno de los más recurridos es el de la omnipresencia (Disabled fog of war), mediante el que el oponente máquina puede ‘ver’ unidades, edificios y demás elementos en cada momento. Con esto puede percibir y prepararse para ataques o incluso fortificarse para evitar asaltos.</p>
<p>Independientemente de la estrategia de desarrollo tecnológico que se haya establecido, algunos sistemas de inteligencia artificial actualizan la tecnología para que esté acorde con la del jugador, teniendo mayor ventaja y estando mejor preparado frente a los ataques del mismo.</p>
<p>Parecido al anterior sería el conocimiento de los detalles del jugador. Se sabe en todo momento los recursos, las unidades, los edificios y las tecnologías de modo que se trabaja en consecuencia para neutralizar los avances y se inyectan los recursos (y en ocasiones unidades) necesarios.</p>
<blockquote><p>Si conoces a los demás y te conoces a ti mismo, ni en cien batallas correrás peligro; si no conoces a los demás, pero te conoces a ti mismo, perderás una batalla y ganarás otra; si no conoces a los demás ni te conoces a ti mismo, correrás peligro en cada batalla.</p>
</blockquote>
<p>Como veis, los chicos encargados de las inteligencias de cada juego se han aplicado el cuento de 3000 años de antiguedad.</p>
<h2>En resumen</h2>
<p>Hemos visto la profundidad con la que podemos llegar a tratar un tema que aparentemente centra su complejidad en el apartado técnico y que resulta ser más conceptual que otra cosa. Se han visto las diferentes áreas que intervienen en el desarrollo sentando las bases de un estudio más profundo sobre cada área.</p>
<p>Se a establecido la importancia de modelar al usuario y permitir diferentes grados de dificultad. La regla más importante será en este aspecto que la IA nunca puede ser más ‘lista’ que el usuario. Aplicar técnicas de modelado del usuario puede ser muy útil aunque plantea una complejidad importante.</p>
<p>Finalmente hemos comprobado que cuando los tiempos de desarrollo aprietan, independientemente de lo riguroso y comprometido que sea uno con el entorno de la inteligencia artificial en el ámbito científico, las cosas tienen que salir bien y rápido. Por<br /> esto muchos sistemas de entretenimiento recurren al uso de ciertas trampas hacia el usuario, lo que implica que no se puede considerar una inteligencia artificial ‘real’ u honesta. En un conflicto similar con parámetros realistas no tendriamos acceso a estos mecanismos.</p>
<p>Comparte tu conocimiento táctico tanto en este artículo general como en cada una de las áreas que vamos a tocar.</p>
<p><strong>Original: <a href="http://www.starcostudios.com/blog/2010/02/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/">http://www.starcostudios.com/blog/2010/02/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/</a></strong></p>
<p><strong><br /> </strong></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" class="wp_rp_title">Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</a></li><li ><a href="http://razonartificial.com/2010/08/orts-estrategia-en-tiempo-real-opensource/" class="wp_rp_title">ORTS. Estrategia en tiempo real OpenSource</a></li><li ><a href="http://razonartificial.com/2011/04/artesania-control-exploradores-juegos-estrategia/" class="wp_rp_title">Artesania del control de exploradores en juegos de estrategia</a></li><li ><a href="http://razonartificial.com/2010/08/la-inteligencia-artificial-de-l4d/" class="wp_rp_title">La Inteligencia Artificial de L4D</a></li><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/tBsZbWyzaRI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/04/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/04/sun-tzu-2-0-el-arte-de-la-guerra-en-los-juegos-de-estrategia/</feedburner:origLink></item>
		<item>
		<title>PhoneGap – Framewok para portar juegos de javascript a dispositivos móviles</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/vxEMWQ3gy_w/</link>
		<comments>http://razonartificial.com/2011/04/phonegap-juegos-moviles-javascript/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 15:21:20 +0000</pubDate>
		<dc:creator>Fabian</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[PhoneGap]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1526</guid>
		<description><![CDATA[Aunque los game engines hechos en javascript son poco populares, si podemos resaltar el trabajo de algunos como ImpactJs (comercial) o GameJs (open source) que permiten realizar casi todo lo que un motor común. Sin embargo la limitación de estos motores está dedicada exclusivamente a la web, por lo que el proyecto PhoneGap pretende acabar con esa limitación y ofrecer una serie de funcionalidades que permitirán al desarrollador portar sus juegos a dispositivos móviles. Algunas características de PhoneGap son las siguientes: Permite portar juegos hechos con HTML5, Javascript y CSS. Brinda la posibilidad de exportar los juegos a iPhone, Android, BlackBerry, WebOS, Symbian y según el sitio oficial ya están trabajando para hacerlo compatible con Windows Mobile. Para cada dispositivo existen tutoriales muy bien explicados en el sitio oficial y según la documentación hay clases disponibles para hacer compatible el juego con el acelerómetro, la cámara del dispositivo, redes, notificaciones y varios tipos de eventos. Enlace: PhoneGap Unity3D &#8211; Un motor de videojuegos para el desarrollo multiplataformaIberogre &#8211; Documentación de Ogre en españolJuegos Online &#8211; Tecnologías a usarEngine X: La clase mapa IIIGran Pack de desarrollo de videojuegosZemanta]]></description>
				<content:encoded><![CDATA[<p><img src="http://razonartificial.com/wp-content/uploads/2011/04/PhoneGapLogo-250x250.png" alt="Juegos ara dispositivos móviles" title="PhoneGap" width="250" height="250" class="alignright size-medium wp-image-1533" /></p>
<p>Aunque los <strong>game engines</strong> hechos en javascript son poco populares, si podemos resaltar el trabajo de algunos como <strong>ImpactJs</strong> (comercial) o <strong>GameJs</strong> (open source) que permiten realizar casi todo lo que un motor común. Sin embargo la limitación de estos motores está dedicada exclusivamente a la web, por lo que el proyecto <strong>PhoneGap</strong> pretende acabar con esa limitación y ofrecer una serie de funcionalidades que permitirán al desarrollador portar sus juegos a dispositivos móviles.</p>
<p>Algunas características de <strong>PhoneGap</strong> son las siguientes:</p>
<ul>
<li>Permite portar juegos hechos con HTML5, Javascript y CSS.</li>
<li>Brinda la posibilidad de exportar los juegos a iPhone, <strong>Android</strong>, BlackBerry, WebOS, Symbian y según el sitio oficial ya están trabajando para hacerlo compatible con Windows Mobile.</li>
</ul>
<p>Para cada dispositivo existen tutoriales muy bien explicados en el sitio oficial y según la documentación hay clases disponibles para hacer compatible el juego con el acelerómetro, la cámara del dispositivo, redes, notificaciones y varios tipos de eventos.</p>
<p>Enlace: <a href="http://www.phonegap.com/">PhoneGap</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/04/unity3d/" class="wp_rp_title">Unity3D &#8211; Un motor de videojuegos para el desarrollo multiplataforma</a></li><li ><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" class="wp_rp_title">Iberogre &#8211; Documentación de Ogre en español</a></li><li ><a href="http://razonartificial.com/2012/06/juegos-online-tecnologias-a-usar/" class="wp_rp_title">Juegos Online &#8211; Tecnologías a usar</a></li><li ><a href="http://razonartificial.com/2010/06/engine-x-la-clase-mapa-iii/" class="wp_rp_title">Engine X: La clase mapa III</a></li><li ><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" class="wp_rp_title">Gran Pack de desarrollo de videojuegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/vxEMWQ3gy_w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/04/phonegap-juegos-moviles-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/04/phonegap-juegos-moviles-javascript/</feedburner:origLink></item>
		<item>
		<title>SFML – Manejando eventos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/K2lF2eJCZc0/</link>
		<comments>http://razonartificial.com/2011/03/sfml-manejando-eventos/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 19:52:52 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[SFML]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1512</guid>
		<description><![CDATA[En el anterior tutorial vimos como crear una ventana, pero esta no se podía cerrar. Es esta tutorial aprenderemos a capturar eventos y manejarlos de manera adecuada. Obtener eventos Básicamente, hay dos formas de recibir los eventos en un sistema de ventanas: Pedir a la ventana los eventos que han sucedido en cada iteración del bucle lo que se conoce como &#8220;sondeo&#8221;. Darle a la ventana un puntero a una función que es llamada cuando recibe un evento. SFML utiliza el sistema de sondeo para recibir eventos. Es decir, se debe pedir a la ventana los eventos en cada ciclo. La función a utilizar es GetEvent() que rellena una instancia de sf::Event y devuelve true si hay algún evento o falso si la pila está vacía. Pero puedo haber más de un evento en cada interacción del bucle y lo de arriba solo nos procesará el primero de la pila. La forma correcta sería: Debes colocar esto en la parte superior del bucle ya que es bueno obtener los eventos de la ventana en cada ciclo antes de hacer otra cosa para actuar en consecuencia. Procesar eventos Lo primero que hay que comprobar cuando llegamos a un evento es su [...]]]></description>
				<content:encoded><![CDATA[<p>En el <a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/">anterior tutorial</a> vimos como crear una ventana, pero esta no se podía cerrar. Es esta tutorial aprenderemos a capturar eventos y manejarlos de manera adecuada.</p>
<h2>Obtener eventos</h2>
<p>Básicamente, hay dos formas de recibir los eventos en un sistema de ventanas:</p>
<ul>
<li>Pedir a la ventana los eventos que han sucedido en cada iteración del bucle lo que se conoce como &#8220;sondeo&#8221;.</li>
<li>Darle a la ventana un puntero a una función que es llamada cuando recibe un evento.</li>
</ul>
<p>SFML utiliza el sistema de sondeo para recibir eventos. Es decir, se debe pedir a la ventana los eventos en cada ciclo. La función a utilizar es <strong>GetEvent()</strong> que rellena una instancia de <a href="http://www.sfml-dev.org/documentation/1.6/classsf_1_1Event.htm">sf::Event</a> y devuelve true si hay algún evento o falso si la pila está vacía.</p>
<pre class="brush: cpp; title: ; notranslate">
// Esto va en el Game Loop del tutorial anterior

sf::Event Event;
if (App.GetEvent(Event))
{
    // Procesar evento
}
</pre>
<p>Pero puedo haber más de un evento en cada interacción del bucle y lo de arriba solo nos procesará el primero de la pila. La forma correcta sería:</p>
<pre class="brush: cpp; title: ; notranslate">
sf::Event Event;
while (App.GetEvent(Event))
{
    // Procesar eventos
}
</pre>
<p>Debes colocar esto en la parte superior del bucle ya que es bueno obtener los eventos de la ventana en cada ciclo antes de hacer otra cosa para actuar en consecuencia.</p>
<pre class="brush: cpp; title: ; notranslate">
while (Running)
{
    sf::Event Event;
    while (App.GetEvent(Event))
    {
        // Procesar eventos
    }

    App.Display();
}
</pre>
<h2>Procesar eventos</h2>
<p>Lo primero que hay que comprobar cuando llegamos a un evento es su tipo, SFML define los siguientes tipos de eventos, todos dentro de <strong>sf::Event</strong>:</p>
<ul>
<li>Closed</li>
<li>Resized</li>
<li>LostFocus</li>
<li>GainedFocus</li>
<li>TextEntered</li>
<li>KeyPressed</li>
<li>KeyReleased</li>
<li>MouseWheelMoved</li>
<li>MouseButtonPressed</li>
<li>MouseButtonReleased</li>
<li>MouseMoved</li>
<li>MouseEntered</li>
<li>MouseLeft</li>
<li>JoyButtonPressed</li>
<li>JoyButtonReleased</li>
<li>JoyMoved</li>
</ul>
<p>Dependiendo del evento la instancia del objeto tendrá diferentes parámetros:</p>
<ul>
<li>Size events (<strong>Resized</strong>)
<ul>
<li><strong>Event.Size.Width</strong> Nuevo ancho de la ventana, en píxeles</li>
<li><strong>Event.Size.Height</strong> Nuevo alto de la ventana, en píxeles</li>
</ul>
</li>
<li>Text events (<strong>TextEntered</strong>)
<ul>
<li><strong>Event.Text.Unicode</strong> contiene la codificación UTF-32 del código del carácter que se ha introducido</li>
</ul>
</li>
<li>Key events (<strong>KeyPressed, KeyReleased</strong>)
<ul>
<li><strong>Event.Key.strong</strong> contiene el código de la tecla que se presiona / suelta</li>
<li><strong>Event.Key.Alt</strong> Si la tecla Alt está o no presionada</li>
<li><strong>Event.Key.Control</strong> Si la tecla Control está o no presionada</li>
<li><strong>Event.Key.Shift</strong> Si la tecla Shift está o no presionada</li>
</ul>
</li>
<li>Mouse buttons events (<strong>MouseButtonPressed, MouseButtonReleased</strong>)
<ul>
<li><strong>Event.MouseButton.Button</strong> Botones del ratón que se presionan / sueltan</li>
</ul>
</li>
<li>Mouse move events (<strong>MouseMoved</strong>)
<ul>
<li><strong>Event.MouseMove.X</strong> Coordenadas X de la posición del ratón, coordenadas locales</li>
<li><strong>Event.MouseMove.Y</strong> Coordenadas Y de la posición del ratón, coordenadas locales</li>
</ul>
</li>
<li>Mouse wheel events (<strong>MouseWheelMoved</strong>)
<ul>
<li><strong>Event.MouseWheel.Delta</strong> Movimiento de la rueda del ratón. Positivo si es hacia adelante y negativo hacia atrás.</li>
</ul>
</li>
<li>Joystick buttons events (<strong>JoyButtonPressed, JoyButtonReleased</strong>)
<ul>
<li><strong>Event.JoyButton.JoystickId</strong> Indice del Joystick (puede ser 1 ó 0)</li>
<li><strong>Event.JoyButton.Button</strong> Índice de los botones del ratón pulsados / soltados , rango [0, 15]</li>
</ul>
</li>
<li>Joystick move events (<strong>JoyMoved</strong>)
<ul>
<li><strong>Event.JoyMove.JoystickId</strong> Indice del Joystick (puede ser 1 ó 0)</li>
<li><strong>Event.JoyMove.Axis</strong> Movimiento del eje</li>
<li><strong>Event.JoyMove.Position</strong> contiene la posición actual en el eje, en el rango [-100, 100] (excepto Punto de vista que está en [0, 360])</li>
</ul>
</li>
</ul>
<p>Las teclas del teclado son constantes de SFML definidas en <strong>Events.hpp</strong>, por ejemplo para la tecla <strong>F5</strong> sería <strong>sf::Key::F5</strong></p>
<p>Lo mismo para el ratón, tiene definidas cinco constantes: <strong>sf::Mouse::Left</strong>, <strong>sf::Mouse::Right</strong>, <strong>sf::Mouse::Middle</strong> (botón de la rueda), <strong>sf::Mouse::XButton1</strong> y <strong>sf::Mouse::XButton2</strong></p>
<p>Para el Joystick las constantes son:  <strong>sf::Joy::AxisX</strong>, <strong>sf::Joy::AxisY</strong>, <strong>sf::Joy::AxisZ</strong>, <strong>sf::Joy::AxisR</strong>, <strong>sf::Joy::AxisU</strong>, <strong>sf::Joy::AxisV</strong>, y <strong>sf::Joy::AxisPOV</strong>.</p>
<p>Así que &#8230; volvamos a nuestra aplicación, y añadir algo de código para controlar eventos. Vamos a añadir algo para detener la aplicación cuando el usuario cierra la ventana, o cuando se presiona la tecla de escape:</p>
<pre class="brush: cpp; title: ; notranslate">
sf::Event Event;
while (App.GetEvent(Event))
{
    // Si se cierra la ventana
    if (Event.Type == sf::Event::Closed)
        Running = false;

    // Si se presiona Escape
    if ((Event.Type == sf::Event::KeyPressed) &amp;amp;&amp;amp; (Event.Key.Code == sf::Key::Escape))
        Running = false;
}
</pre>
<h2>Cerrando la ventana</h2>
<p>Si has jugado un poco con las ventanas de SFML te habrás dado cuenta que al pulsar cerrar (la cruz superior) se genera un evento de cierre, pero no se cierra la ventana, esto es así para dar la posibilidad al programador de implementar su cierra, por ejemplo que pregunte al jugador si desea guardar la partida o si está seguro.</p>
<p>Podemos usar el método <strong>Close()</strong> para cerrar la ventana. Hay otro método llamado <strong>IsOpened()</strong> que devuelve verdadero si la ventana está abierta y falso si está cerrada, con estos dos métodos podemos controlar el bucle de nuestro juego sin variables auxiliares.</p>
<pre class="brush: cpp; title: ; notranslate">
while (App.IsOpened())
{
    sf::Event Event;
    while (App.GetEvent(Event))
    {
        // Window closed
        if (Event.Type == sf::Event::Closed)
            App.Close();

        // Escape key pressed
        if ((Event.Type == sf::Event::KeyPressed) &amp;amp;&amp;amp; (Event.Key.Code == sf::Key::Escape))
            App.Close();
    }
}
</pre>
<h2>Entrada en tiempo real</h2>
<p>Este sistema de eventos es lo suficientemente bueno para reaccionar ante eventos como el cierre de la ventana, o pulsar una tecla. Pero si deseas controlar, por ejemplo, el movimiento continuo de un personaje cuando se presiona una tecla de dirección, a continuación, pronto verás que hay un problema: habrá una demora entre cada movimiento, el retraso se define por el sistema operativo cuando se siguen presionando una tecla.</p>
<p>Para solucionar esto empleamos la clase <strong>sf::Input</strong>. Esta instancia no puede vivir por si misma, está ligada a una ventana y se debe de definir a que ventana es cuando se crea.</p>
<pre class="brush: cpp; title: ; notranslate">
const sf::Input&amp;amp; Input = App.GetInput();
</pre>
<p>Como vemos es una referencia al método <strong>GetInput() </strong>de nuestra ventana. Con esto podemos comprobar los valores en tiempo real de la siguiente forma:</p>
<pre class="brush: cpp; title: ; notranslate">
bool         LeftKeyDown     = Input.IsKeyDown(sf::Key::Left);
bool         RightButtonDown = Input.IsMouseButtonDown(sf::Mouse::Right);
bool         Joy0Button1Down = Input.IsJoystickButtonDown(0, 1);
unsigned int MouseX          = Input.GetMouseX();
unsigned int MouseY          = Input.GetMouseY();
float        Joystick1X      = Input.GetJoystickAxis(1, sf::Joy::AxisX);
float        Joystick1Y      = Input.GetJoystickAxis(1, sf::Joy::AxisY);
float        Joystick1POV    = Input.GetJoystickAxis(1, sf::Joy::AxisPOV);
</pre>
<p>Como vemos, un método mucho mejor para controlar la entrada de un videojuego.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" class="wp_rp_title">SFML &#8211; Juego de ejemplo</a></li><li ><a href="http://razonartificial.com/2011/03/introduccion-a-pysfml/" class="wp_rp_title">Introducción a PySFML</a></li><li ><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" class="wp_rp_title">Proyecto Generic Game Engine</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/K2lF2eJCZc0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/sfml-manejando-eventos/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/sfml-manejando-eventos/</feedburner:origLink></item>
		<item>
		<title>SFML – Juego de ejemplo</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/v4nVQ1mkW6k/</link>
		<comments>http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 02:45:05 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[SFML]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1516</guid>
		<description><![CDATA[Como complemento a los tutoriales de SFML he elaborado un pequeño juego de ejemplo. Se trata del clásico Pong. He intentado comentar el código bastante para que se vea que hace cada parte. Esta todo metido en un único .cpp con fines didácticos para que se vea donde está cada cosa lo ideal es tener clases en archivos separados y con sus respectivos headers. El juego es sencillo y no está terminado, nada de menús ni puntuaciones. Solo lo básico de la mecánica del juego crear una estructura mayor se salía de los fines del ejemplo. Para compilarlo en linux solo debes descomprimirlo, entrar en la carpeta desde la línea de comandos y ejecutar: g++ -o Pong ./pruebas.cpp -lsfml-graphics Claro está primero tenéis que tener instalado SFML. Descargar ejemplo SFML &#8211; Instalación y configuraciónSFML &#8211; Manejando eventosIntroducción a PySFMLProyecto Generic Game EngineSFML &#8211; Abriendo una ventanaZemanta]]></description>
				<content:encoded><![CDATA[<p>Como complemento a los tutoriales de SFML he elaborado un pequeño juego de ejemplo. Se trata del clásico Pong. He intentado comentar el código bastante para que se vea que hace cada parte. Esta todo metido en un único .cpp con fines didácticos para que se vea donde está cada cosa lo ideal es tener clases en archivos separados y con sus respectivos headers.</p>
<p>El juego es sencillo y no está terminado, nada de menús ni puntuaciones. Solo lo básico de la mecánica del juego crear una estructura mayor se salía de los fines del ejemplo.</p>
<p>Para compilarlo en linux solo debes descomprimirlo, entrar en la carpeta desde la línea de comandos y ejecutar:</p>
<pre>
g++ -o Pong ./pruebas.cpp -lsfml-graphics
</pre>
<p>Claro está primero tenéis que tener <a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/">instalado SFML</a>.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2011/03/Pong.zip">Descargar ejemplo</a></li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/03/introduccion-a-pysfml/" class="wp_rp_title">Introducción a PySFML</a></li><li ><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" class="wp_rp_title">Proyecto Generic Game Engine</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/v4nVQ1mkW6k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/</feedburner:origLink></item>
		<item>
		<title>SFML – Abriendo una ventana</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/ENKff33KHsw/</link>
		<comments>http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 19:41:52 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[SFML]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1489</guid>
		<description><![CDATA[En el anterior artículo vimos como instalar SFML, es hora de empezar a trabajar con él. En este tutorial veremos como abrir una ventana y establecer un modo de video. Preparando el código En primer lugar tenemos que incluir el header necesario para manejar ventanas. Este es el único archivo necesario ya que contiene el resto de includes de las partes de SFML que maneja la ventana. Recuerda enlazar cuando compiles en esta caso a sfml-Window. A continuación definimos la función main típica de todo programa en C++. O si queremos pasarle argumentos por la línea de comandos: Abriendo una ventana El siguiente paso es abrir una ventana, esto se hace con la clase sf::Window. Especial atención al espacio de nombre &#8220;sf&#8221; todos los objetos y tipos de datos de SFML están en el namespace &#8220;sf&#8221;. Aquí creamos un nuevo objeto llamado App que representa a nuestra ventana. Vamos a explicar los parámetros. El primer parámetro es sf::VideoMode representa el modo de vídeo elegido en este caso una ventana de 640 píxeles de ancho, 480 píxeles de alto y 32 bits de profundidad de color. Estas medidas solo es la ventana interior se excluyen los bordes y la barra te [...]]]></description>
				<content:encoded><![CDATA[<p>En el anterior artículo vimos como instalar SFML, es hora de empezar a trabajar con él. En este tutorial veremos como abrir una ventana y establecer un modo de video.</p>
<h2>Preparando el código</h2>
<p>En primer lugar tenemos que incluir el header necesario para manejar ventanas.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;SFML/Window.hpp&gt;
</pre>
<p>Este es el único archivo necesario ya que contiene el resto de includes de las partes de SFML que maneja la ventana. Recuerda enlazar cuando compiles en esta caso a sfml-Window.</p>
<p>A continuación definimos la función main típica de todo programa en C++.</p>
<pre class="brush: cpp; title: ; notranslate">
int main()
{
    // Cuerpo
}
</pre>
<p>O si queremos pasarle argumentos por la línea de comandos:</p>
<pre class="brush: cpp; title: ; notranslate">
int main(int argc, char** argv)
{
    // Cuerpo
}
</pre>
<h2>Abriendo una ventana</h2>
<p>El siguiente paso es abrir una ventana, esto se hace con la clase <a href="http://www.sfml-dev.org/documentation/1.6/classsf_1_1Window.htm">sf::Window</a>. Especial atención al espacio de nombre &#8220;sf&#8221; todos los objetos y tipos de datos de SFML están en el namespace &#8220;sf&#8221;.</p>
<pre class="brush: cpp; title: ; notranslate">
sf::Window App(sf::VideoMode(640, 480, 32), &quot;SFML Window&quot;);
</pre>
<p>Aquí creamos un nuevo objeto llamado App que representa a nuestra ventana. Vamos a explicar los parámetros.</p>
<p>El primer parámetro es <a href="http://www.sfml-dev.org/documentation/1.6/classsf_1_1VideoMode.htm">sf::VideoMode</a> representa el modo de vídeo elegido en este caso una ventana de 640 píxeles de ancho, 480 píxeles de alto y 32 bits de profundidad de color. Estas medidas solo es la ventana interior se excluyen los bordes y la barra te títulos. </p>
<p>El segundo parámetro representa el título de la ventana y el tipo de dato es un <strong>std::string</strong>.</p>
<p>Si desea crear la ventana posterior, o volver a crearla con diferentes parámetros, puede utilizar la función <strong>Create</strong>:</p>
<pre class="brush: cpp; title: ; notranslate">
App.Create(sf::VideoMode(800, 600, 32), &quot;SFML Window&quot;);
</pre>
<p>El constructor y el método crear aceptan otros parámetros opcionales: El primero para controlar el estilo gráfico de la ventana y el segundo para opciones avanzadas gráficas que no veremos de momento.</p>
<p>El parámetro estilo es una combinación de banderas de <strong>sf::Style</strong> separadas con el operador &#8220;|&#8221;. Las banderas son None, Titlebar, Resize, Close and Fullscreen. Por defecto toma los valores: Resize | Close.</p>
<pre class="brush: cpp; title: ; notranslate">
// Esto crea una ventana a pantalla completa
App.Create(sf::VideoMode(800, 600, 32), &quot;SFML Window&quot;, sf::Style::Fullscreen);
</pre>
<h2>Modos de vídeo</h2>
<p>En el ejemplo anterior, no me importa el modo de video ya que se ejecutan en modo de ventana, de cualquier tamaño va a estar bien. Pero si quisiéramos ejecutar en modo de pantalla completa, sólo unos cuantos modos se permitirían. sf::VideoMode proporciona una interfaz para obtener todos los modos de vídeo compatibles con las dos funciones estáticas <strong>GetModesCount</strong> y <strong>GetMode</strong>:</p>
<pre class="brush: cpp; title: ; notranslate">
unsigned int VideoModesCount = sf::VideoMode::GetModesCount();
for (unsigned int i = 0; i &lt; VideoModesCount; ++i)
{
    sf::VideoMode Mode = sf::VideoMode::GetMode(i);

    // Mode es un modo de vídeo valido
}
</pre>
<p>Tenga en cuenta que los modos de vídeo están ordenados de mayor a menor, por lo que <strong>sf::VideoMode::GetMode(0)</strong> devolverá siempre el mejor modo de vídeo compatible.</p>
<pre class="brush: cpp; title: ; notranslate">
// Crear una ventana a panalla completa con el mejor modo de vídeo
App.Create(sf::VideoMode::GetMode(0), &quot;SFML Window&quot;, sf::Style::Fullscreen);
</pre>
<p>Si quieres obtener el modo de vídeo de otro lado, por ejemplo, un fichero de configuración puedes usar el método <strong>IsValid()</strong> para comprobar que es válido. </p>
<pre class="brush: cpp; title: ; notranslate">
sf::VideoMode Mode = ReadModeFromConfigFile();
if (!Mode.IsValid())
{
    // Error...
}
</pre>
<p>Por último con <strong>GetDesktopMode()</strong> puedes obtener el modo de vídeo del escritorio.</p>
<pre class="brush: cpp; title: ; notranslate">
sf::VideoMode DesktopMode = sf::VideoMode::GetDesktopMode();
</pre>
<h2>El bucle principal</h2>
<p>Una vez creada la ventana debemos hacer el bucle principal del juego.</p>
<pre class="brush: cpp; title: ; notranslate">
bool Running = true;
while (Running)
{
    App.Display();
}

return EXIT_SUCCESS;
</pre>
<p>Para cerrar el bucle del juego basta con cambiar la variables Running a False. Esto podríamos hacerlo al cerrar la ventana o al presionar la tecla Escape. Veremos la forma de detectar estos eventos en el próximo tutorial.</p>
<p>La única sentencia en nuestro bucle principal es <strong>App.Display();</strong>. Esta es la única sentencia necesaria para mostrar el contenido de nuestra ventana en la pantalla. Debe estar en el bucle principal y siempre ser la última en llamarse, después de dibujar todo lo necesario y actualizar todas las variables.</p>
<p>Como puedes ver no hay nada más que hacer después del bucle, al Destructor de la ventana se encarga de cerrar todo. <strong>EXIT_SUCCESS</strong> es una constante que vale 0, lo que debe devolver un programa si todo ha ido bien.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2011/03/OpenWindow.zip">Descargar ejemplo</a></li>
</ul>
<p>Nota: Artículo basado en el <a href="http://www.sfml-dev.org/tutorials/1.6/window-window.php">tutorial oficial</a>.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li><li ><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" class="wp_rp_title">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" class="wp_rp_title">SFML &#8211; Juego de ejemplo</a></li><li ><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" class="wp_rp_title">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/ENKff33KHsw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/</feedburner:origLink></item>
		<item>
		<title>SFML – Instalación y configuración</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/2HNVyTjTVsY/</link>
		<comments>http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 15:14:43 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Bibliotecas]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[SFML]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1496</guid>
		<description><![CDATA[En linux Instalar SFML en Linux es bastante fácil, al menos para distribuciones basadas en Debian (Ubuntu entre ellas) ya que los paquetes se encuentran en los repositorios, para otras distros seguro que los paquetes también están. Para instalar en consola: $ sudo apt-get build-essential install libsfml-dev libsfml-doc Con esto ya tenemos la biblioteca instalada en nuestro sistema. Compilar por consola Vamos ahora a compilar un programa de prueba, creamos un archivo .cpp con el siguiente código: Guardamos el archivo y pasamos a compilarlo. $ g++ -o pruebas ./pruebas.cpp -lsfml-system Con esto compilamos el programa, como ves enlazamos sfml-system que es el archivo que usamos, pero en nuestros programas podemos tener otras partes de SFML, como sfml-graphics o sfml-window. Para enlazar varios archivos es del mismo modo: g++ -o ... -lsfml-graphics -lsfml-window -lsfml-system Compilar con CodeLite Hay un IDE que me gusta mucho llamado CodeLite vamos a aprender como usarlo con SFML. Lo primero es bajar de aquí la versión de vuestro sistema. Una vez instalada abrimos. Vamos a crear un espacio de trabajo, un proyecto y configurarlo. En el menú superior: Workspace &#8211;> New Workspace&#8230; A continuación volvemos al menú de espacio de trabajo para crear un proyecto Workspace [...]]]></description>
				<content:encoded><![CDATA[<h2>En linux</h2>
<p>Instalar SFML en Linux es bastante fácil, al menos para distribuciones basadas en Debian (Ubuntu entre ellas) ya que los paquetes se encuentran en los repositorios, para otras distros seguro que los paquetes también están. Para instalar en consola:</p>
<pre>
$ sudo  apt-get build-essential install libsfml-dev libsfml-doc
</pre>
<p>Con esto ya tenemos la biblioteca instalada en nuestro sistema.</p>
<h3>Compilar por consola</h3>
<p>Vamos ahora a compilar un programa de prueba, creamos un archivo .cpp con el siguiente código:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;SFML/System.hpp&gt;
#include &lt;iostream&gt;

int main()
{
    sf::Clock Clock;
    while (Clock.GetElapsedTime() &lt; 5.f)
    {
        std::cout &lt;&lt; Clock.GetElapsedTime() &lt;&lt; std::endl;
        sf::Sleep(0.5f);
    }

    return 0;
}
</pre>
<p>Guardamos el archivo y pasamos a compilarlo.</p>
<pre>
$ g++ -o pruebas ./pruebas.cpp -lsfml-system
</pre>
<p>Con esto compilamos el programa, como ves enlazamos sfml-system que es el archivo que usamos, pero en nuestros programas podemos tener otras partes de SFML, como sfml-graphics o sfml-window. Para enlazar varios archivos es del mismo modo:</p>
<pre>
g++ -o ... -lsfml-graphics -lsfml-window -lsfml-system
</pre>
<h3>Compilar con CodeLite</h3>
<p>Hay un IDE que me gusta mucho llamado <a href="http://codelite.org/">CodeLite</a> vamos a aprender como usarlo con SFML. Lo primero es <a href="http://sourceforge.net/projects/codelite/files/Releases/codelite-2.9/">bajar de aquí</a> la versión de vuestro sistema. Una vez instalada abrimos.</p>
<p>Vamos a crear un espacio de trabajo, un proyecto y configurarlo. En el menú superior:</p>
<p><strong>Workspace &#8211;> New Workspace&#8230;</strong></p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/New-Workspace_003.png" alt="" title="New Workspace_003" width="625" height="375" class="aligncenter size-full wp-image-1493" /></p>
<p>A continuación volvemos al menú de espacio de trabajo para crear un proyecto</p>
<p><strong>Workspace &#8211;> New Project</strong></p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/New-project_009.png" alt="" title="New project_009" width="662" height="407" class="aligncenter size-full wp-image-1494" /></p>
<p>Lo dejamos como se muestra en la imagen. A la izquierda tenemos el árbol del espacio de trabajo con nuestro proyecto recién creado.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/Selección_011.png" alt="" title="Selección_011" width="240" height="223" class="aligncenter size-full wp-image-1497" /></p>
<p>Abrimos el archivo main.cpp borramos su contenido y ponemos el ejemplo anterior.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;SFML/System.hpp&gt;
#include &lt;iostream&gt;

int main()
{
    sf::Clock Clock;
    while (Clock.GetElapsedTime() &lt; 5.f)
    {
        std::cout &lt;&lt; Clock.GetElapsedTime() &lt;&lt; std::endl;
        sf::Sleep(0.5f);
    }

    return 0;
}
</pre>
<p>Ahora abrimos las propiedades del proyecto: <strong>Workspace &#8211;> Open Active Project Settings&#8230;</strong> y ahi en el menú desplegable de la izquieda vamos a <strong>Common Settings &#8211;> Linker</strong> ahi en options enlazamos las librería, en este caso usamos -lsfml-system. Puedes poner varias simplemente dejando un espacio o seprandolas con &#8220;;&#8221;</p>
<p><a href="http://razonartificial.com/wp-content/uploads/2011/03/HolaMundo-Project-Settings_013.png"><img src="http://razonartificial.com/wp-content/uploads/2011/03/HolaMundo-Project-Settings_013-250x144.png" alt="" title="HolaMundo Project Settings_013" width="650" height="375" class="aligncenter size-medium wp-image-1498" /></a></p>
<p>Pues ya está todo listo, Pulsamos F7 para compilar y luego <strong>Ctrl+F5</strong> para ejecutar.</p>
<h2>En Windows</h2>
<p>Para Windows os dejo un excelente video de como intalar en Visual C++ 2010.</p>
<p><a href="http://www.youtube.com/watch?v=-uHGZGgMETg">http://www.youtube.com/watch?v=-uHGZGgMETg</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/introduccion-a-pysfml/" class="wp_rp_title">Introducción a PySFML</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" class="wp_rp_title">Proyecto Generic Game Engine</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" class="wp_rp_title">SFML &#8211; Juego de ejemplo</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/2HNVyTjTVsY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/</feedburner:origLink></item>
		<item>
		<title>Iberogre – Documentación de Ogre en español</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/2n1kemWh324/</link>
		<comments>http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 20:36:53 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Ogre]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1484</guid>
		<description><![CDATA[IberOgre ofrece documentación sobre programación de videojuegos en 3D utilizando el motor open source Ogre3D. Partiendo de conocimientos de programación de videojuegos básicos en 2D, cubre un amplio rango de materias. Desde conceptos matemáticos y física elemental del espacio hasta el uso del motor Ogre. Está concebida para cubrir el hueco de la escasez de documentación es castellano referente a Ogre así como proporcionar una guía para desarrollar juegos 3D multiplataforma (GNU/Linux y Windows) con herramientas libres. El principal autor de IberOgre es David Saltares y junto son IberOgre está desarrollando un juego de ejemplo llamado Sion Tower. En su blog podéis ver cosas interesantes acerca del proyecto que no se ciñen solo a Ogre. Web: IberOgre Gran Pack de desarrollo de videojuegosBienvenidos a Razón Artificial 2.0Ayuda a financiar la web: Vótanos en LánzanosSFML &#8211; Juego de ejemploTutorial XNA 1 – Preparándonos para trabajarZemanta]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1485" title="300px-Logo_ogre" src="http://razonartificial.com/wp-content/uploads/2011/03/300px-Logo_ogre.png" alt="" width="300" height="167" /></p>
<p><a href="http://osl2.uca.es/iberogre/index.php/P%C3%A1gina_Principal">IberOgre</a> ofrece documentación sobre programación de videojuegos en 3D utilizando el motor open source Ogre3D. Partiendo de conocimientos de programación de videojuegos básicos en 2D, cubre un amplio rango de materias. Desde conceptos matemáticos y física elemental del espacio hasta el uso del motor Ogre.</p>
<p>Está concebida para cubrir el hueco de la escasez de documentación es castellano referente a Ogre así como proporcionar una guía para desarrollar juegos 3D multiplataforma (GNU/Linux y Windows) con herramientas libres.</p>
<p>El principal autor de IberOgre es <a rel="external nofollow" href="http://siondream.com/">David Saltares</a> y junto son IberOgre está desarrollando un juego de ejemplo llamado Sion Tower. En su <a href="http://siondream.com/blog/">blog</a> podéis ver cosas interesantes acerca del proyecto que no se ciñen solo a Ogre.</p>
<p>Web: <a href="http://osl2.uca.es/iberogre/index.php/P%C3%A1gina_Principal">IberOgre</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" class="wp_rp_title">Gran Pack de desarrollo de videojuegos</a></li><li ><a href="http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/" class="wp_rp_title">Bienvenidos a Razón Artificial 2.0</a></li><li ><a href="http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/" class="wp_rp_title">Ayuda a financiar la web: Vótanos en Lánzanos</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" class="wp_rp_title">SFML &#8211; Juego de ejemplo</a></li><li ><a href="http://razonartificial.com/2010/11/tutorial-xna-1-preparandonos-para-trabajar/" class="wp_rp_title">Tutorial XNA 1 – Preparándonos para trabajar</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/2n1kemWh324" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/</feedburner:origLink></item>
		<item>
		<title>Ayuda a financiar la web: Vótanos en Lánzanos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/Jx_pSyu2KOs/</link>
		<comments>http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 15:55:03 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1481</guid>
		<description><![CDATA[Me gustaría pedir algo a los lectores. Como sabéis esta web ofrece todo el contenido gratis y sin publicidad. Ahora mismo mantener la web solo nos cuesta dedicación ya que el servidor nos lo ceden, pero en un futuro puede que no sea así. Hemos puesto el proyecto en Lánzanos para ver si cubrimos algo del tiempo empleado y damos algo a cambio del servidor prestádo. De momento solo necesitamos tu voto para que el proyecto pueda recibir financiación. Vota: http://www.lanzanos.com/caja/proyecto/489/ Bienvenidos a Razón Artificial 2.0Iberogre &#8211; Documentación de Ogre en españolPropósitos 2013Nueva versión de Razón ArtificialRazón Artificial estrena diseñoZemanta]]></description>
				<content:encoded><![CDATA[<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/lanzanos-250x185.jpg" alt="" title="lanzanos" width="250" height="185" class="alignright size-medium wp-image-1482 imageborder" /></p>
<p>Me gustaría pedir algo a los lectores. Como sabéis esta web ofrece todo el contenido gratis y sin publicidad. Ahora mismo mantener la web solo nos cuesta dedicación ya que el servidor nos lo ceden, pero en un futuro puede que no sea así.</p>
<p>Hemos puesto el proyecto en Lánzanos para ver si cubrimos algo del tiempo empleado y damos algo a cambio del servidor prestádo. De momento solo necesitamos tu voto para que el proyecto pueda recibir financiación.</p>
<p>Vota: <a href="http://www.lanzanos.com/caja/proyecto/489/">http://www.lanzanos.com/caja/proyecto/489/</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/" class="wp_rp_title">Bienvenidos a Razón Artificial 2.0</a></li><li ><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" class="wp_rp_title">Iberogre &#8211; Documentación de Ogre en español</a></li><li ><a href="http://razonartificial.com/2013/01/propositos-2013/" class="wp_rp_title">Propósitos 2013</a></li><li ><a href="http://razonartificial.com/2012/11/nueva-version-de-razon-artificial/" class="wp_rp_title">Nueva versión de Razón Artificial</a></li><li ><a href="http://razonartificial.com/2010/03/razon-artificial-estrena-diseno/" class="wp_rp_title">Razón Artificial estrena diseño</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/Jx_pSyu2KOs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/</feedburner:origLink></item>
		<item>
		<title>Crear tiles isométricos 2D con Blender</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/RGcqSpS5XNU/</link>
		<comments>http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 04:32:44 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Blender]]></category>
		<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[Isométrico]]></category>
		<category><![CDATA[Tiles]]></category>
		<category><![CDATA[Tilesets]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1451</guid>
		<description><![CDATA[Nota: este tutorial usa Blender 2.49 Los mismos principios se aplican a 2.5 Actualizaré este tutorial a la versión 2.5 cuando sea estable. La escena por defecto en Blender se parece a esto, un cubo normal en perspectiva. Cámara Ortográfica Lo primero que queremos hacer es cambiar la cámara a ortográfica. Hacemos click derecho en la camara para seleccionarla, cambiar al panel de edición (F9) y haga clic en el botón &#8220;ortográfica&#8221;. Nuestro cubo ahora se verá en la perspectiva correcta. En los juegos isomñetricos las líneas perpendiculares al plano de tierra deben ser paralelas entre sí. Dicho de otra manera, los objetos más lejanos en vista ortográfica no parecen más pequeños. Ángulo de cámara isométrica El siguiente paso es establecer el ángulo de cámara en el modo isométrico perfecto. En los videojuegos cuando decimos &#8220;isométrico&#8221; por lo general significa que el tamaño de los tiles es dos veces el ancho del alto (por ejemplo, 64&#215;32). Con la cámara seleccionada &#8220;N&#8221; para abrir el menú de &#8220;Transform Properties&#8221; (Propiedades de transformación). Las opciones las dejamos de la siguiente manera: RotX = 60, RotY = 0, RotZ = 48. Y ya que estamos aquí vamos a poner la cámara en un lugar predecible: LocX = 5, LocY = -5, LocZ = [...]]]></description>
				<content:encoded><![CDATA[<p><strong>Nota:</strong> este tutorial usa Blender 2.49 Los mismos principios se aplican a 2.5 Actualizaré este tutorial a la versión 2.5 cuando sea estable.</p>
<p>La escena por defecto en Blender se parece a esto, un cubo normal en perspectiva.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/01_default.jpg" alt="" title="01_default" width="800" height="600" class="aligncenter size-full wp-image-1452" /></p>
<h2>Cámara Ortográfica</h2>
<p>Lo primero que queremos hacer es cambiar la cámara a ortográfica. Hacemos click derecho en la camara para seleccionarla, cambiar al panel de edición (F9) y haga clic en el botón &#8220;ortográfica&#8221;.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/02_orthographic_camera.png" alt="" title="02_orthographic_camera" width="283" height="113" class="aligncenter size-full wp-image-1453" /></p>
<p>Nuestro cubo ahora se verá en la perspectiva correcta. En los juegos isomñetricos las líneas perpendiculares al plano de tierra deben ser paralelas entre sí. Dicho de otra manera, los objetos más lejanos en vista ortográfica no parecen más pequeños.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/03_orthographic_render.jpg" alt="" title="03_orthographic_render" width="800" height="600" class="aligncenter size-full wp-image-1454" /></p>
<h2>Ángulo de cámara isométrica</h2>
<p>El siguiente paso es establecer el ángulo de cámara en el modo isométrico perfecto. En los videojuegos cuando decimos &#8220;isométrico&#8221; por lo general significa que el tamaño de los tiles es dos veces el ancho del alto (por ejemplo, 64&#215;32). Con la cámara seleccionada &#8220;N&#8221; para abrir el menú de &#8220;Transform Properties&#8221; (Propiedades de transformación). Las opciones las dejamos de la siguiente manera: RotX = 60, RotY = 0, RotZ = 48. Y ya que estamos aquí vamos a poner la cámara en un lugar predecible: LocX = 5, LocY = -5, LocZ = 5.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/04_isometric_camera.png" alt="" title="04_isometric_camera" width="223" height="157" class="aligncenter size-full wp-image-1455" /></p>
<p>Si se mide la cara superior de este cubo, se puede comprobar que el ancho en píxeles es exactamente el doble que la altura.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/05_isometric_render.jpg" alt="" title="05_isometric_render" width="800" height="600" class="aligncenter size-full wp-image-1456" /></p>
<h2>Tamaño de Render</h2>
<p>Queremos adaptar el tamaño del render para que se adapte a nuestra salida deseada. Para manter sencillo este tutorial, vamos a remplazar el cubo por defecto por un plano predeterminaso. (Seleccionamos el cubo y lo eliminamos. Ass -> Mesh -> Plane para añadir el plano).</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/06_plane.jpg" alt="" title="06_plane" width="800" height="600" class="aligncenter size-full wp-image-1457" /></p>
<p>Vamos a cambiar el tamaño del render. Cambia al panel de escena(F10). Establecer SizeX = 64, SizeY = 32. Cambiamos también el formato de salida de JPG a PNG y el color de RGB a RGBA.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/07_render_format.png" alt="" title="07_render_format" width="153" height="152" class="aligncenter size-full wp-image-1458" /></p>
<p>Ahora la imagen PNG tiene el tamaño correcto, pero el tile obviamente no.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/08_sized_render.png" alt="" title="08_sized_render" width="64" height="32" class="aligncenter size-full wp-image-1459" /></p>
<h2>Cámara LocZ y la escala del objetivo</h2>
<p>Ahora hay que ajustar el LocZ de la cámara y la escala del objetivo hasta que el tile se ajuste a la imagen PNG.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/09_camera_before.png" alt="" title="09_camera_before" width="538" height="412" class="aligncenter size-full wp-image-1460" /></p>
<p>Esta es la manera en la que lo hago: Cambio a la vista cámara (NumPad 0) Hasta la línea de puntos exterior es lo que va a ser nuestra imagen. Con esto como referencia. Camara LocZ esta en el menú &#8220;Transform Properties&#8221; (Seleccionar la cámara y pulsar N) y Lens Scale está en el &#8220;Editing Panel&#8221; (Encima de donde se elige la vista ortográfica).</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/10_camera_after.png" alt="" title="10_camera_after" width="714" height="553" class="aligncenter size-full wp-image-1461" /></p>
<p>En esta caso el me da salen los siguientes valores LocZ = 4.08 y la Escala del objetivo = 2.75. Te daras cuentas que las esquinas se salen de la zona del render, que se salga un poco ayuda acuando RGBA con AA esta activado. Los bordes de los tiles tendrán un valor Alpha que se vería sobre tiles adyacentes.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/11_tile_final_size.png" alt="" title="11_tile_final_size" width="64" height="32" class="aligncenter size-full wp-image-1463" /></p>
<h2>Sobremuestreo/Anti-Aliasing</h2>
<p>La salida es un poco borrosa, pero es difícil de ver, vamos a aplicar una textura bonita al plano.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/12_before_catrom.png" alt="" title="12_before_catrom" width="64" height="32" class="aligncenter size-full wp-image-1464" /></p>
<p>Definitivamente borrosa. Para los sprites pequeños de los tilesets queremos un filtro anti-aliasing diferente. En el panel de escena (F10), cambiar el filtro de Gauss (heavy blur) a CatRom o Mitch (CatRom muestra más detalles, pero es un poco ruidoso, me gusta para las texturas arenosas que uso en mi juego). </p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/13_catrom_filter.png" alt="" title="13_catrom_filter" width="225" height="162" class="aligncenter size-full wp-image-1465" /></p>
<p>El resultado es mucho más nítido.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/14_after_catrom.png" alt="" title="14_after_catrom" width="64" height="32" class="aligncenter size-full wp-image-1466" /></p>
<p>(Si desea aún más nítida, pruebe a desactivar MipMap e Interpol en la configuración de la textura de &#8220;Map Image&#8221;).</p>
<h2>Sky a Key</h2>
<p>Si aumentas la imagen resultante notarás un azul muy leve en el contorno de todo el tile. Esto se debe a que, por defecto, hacer un alpha-layer render (RGBA Mode) se mezcla el color del cielo en los píxeles con transparencias (0 < A < 1). Este azul se mostrará cuando se muestren tiles juntos. Tenemos que cambiar de "Sky" blending a "key" para mantener bien los bordes.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/15_key_blending.png" alt="" title="15_key_blending" width="225" height="160" class="aligncenter size-full wp-image-1467" /><br />
<img src="http://razonartificial.com/wp-content/uploads/2011/03/16_key_render.png" alt="" title="16_key_render" width="64" height="32" class="aligncenter size-full wp-image-1468" /></p>
<h2>Iluminación</h2>
<p>Por último, tenemos que tener una iluminación uniforme en el tile. Si se mira de cerca, el otro extremo del tile se ve más oscuro que el extremo mas cercano. Por defecto, las luces en Blender iluminan dependiendo de la distancia de la fuente de luz. Si cambia la fuente de luz a &#8220;Sun&#8221; la iluminación no disminuye con la distancia. Con un tipo de fuente de luz &#8220;Sun&#8221; se puede elegir el ángulo de la luz. Esta ángulo debe ser (generalmente) el mismo para todos los tiles del tileset y del juego. (En mi proyecto OSARE RPG uso RotX = 27, RotY = 25, RotZ = -12 que proyecta las sombras hacia atrás y a la derecha.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/17_sun_lamp.png" alt="" title="17_sun_lamp" width="220" height="163" class="aligncenter size-full wp-image-1469" /></p>
<p>Ahora tiene una iluminación uniforme:</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/18_tile_final.png" alt="" title="18_tile_final" width="64" height="32" class="aligncenter size-full wp-image-1472" /></p>
<h2>El tile en acción</h2>
<p>Ahora vamos a cargar el tile en el editor de mapas libre Tiled.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/19_tile_preview.png" alt="" title="19_tile_preview" width="512" height="256" class="aligncenter size-full wp-image-1471" /></p>
<p>Los tiles encajan correctamente y se ven claros. Por supuesto son repetitivos, por lo que querrás variedad de tiles.</p>
<p>Pero esto solo es la base, guarde este archivo y utilícelo como base para hacer otros. (<a href="http://razonartificial.com/wp-content/uploads/2011/03/isometric_tiles.blend_.zip">Descargar fichero .blend</a>).</p>
<h2>Tiles con altura</h2>
<p>Cuando llegue el momento de añadir tiles con altura ajuste el tamaño del render, el LocZ de la cámara y la escale del objetivo de nuevo. Un ejemplo: He añadido el cubo por defecto de nuevo y quiero hacerlo un tile de alto. 64&#215;64 no será suficientemente alto como para meter el bloque, así que voy a cambiar el tamaño del render a 64&#215;96 y mover la base del cubo a la parte inferior de la zona de render. Vea la captura de configuración debajo.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/20_tall_tile_settings.png" alt="" title="20_tall_tile_settings" width="630" height="493" class="aligncenter size-full wp-image-1474" /></p>
<p>Y el resultado. (Tenga en cuenta que en esta vista previa he deshabilitado OSA/anti-aliasing de los tiles. OSA en realidad podría ayudar en algunos tiles).</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2011/03/21_tall_tile_test.png" alt="" title="21_tall_tile_test" width="512" height="256" class="aligncenter size-full wp-image-1475" /></p>
<h2>Otras consideraciones</h2>
<ul>
<li>Ayuda usar una escala fija para tus tiles. Por ejemplo: 1 Unidad de blender = 1 metro y 1 tile = 1 metro cuadrado. De esta manera podrás mantener los tiles a escala.</li>
<li>Es posible que quieraas incluir sombras en tiles con altura. Crea un plano grande en (0, 0, 0) y ponle un material con Shaders con la opción &#8220;OnlyShad [ow]&#8220;.</li>
<li>Si tienes muchas tiles diferentes puedes montar tilesets de manera fácil con ImageMagick.</li>
<li>Si estas usando verdadero isométrico en juegos 2:1 pseudo-isométricos, cambia la cámara RotX de 60 a 54.736.</li>
</ul>
<p>Ir a <a href="http://opengameart.org/content/flagstone-floor-tiles">OpenGameArt.com para ver la serie completa de estos tiles marrones</a>.</p>
<p>Written by <a href="http://clintbellanger.net/">Clint Bellanger</a>. Released under CC-BY-SA and the GFDL.</p>
<p><a href="http://clintbellanger.net/rpg/tutorials/isometric_tiles/">Original en inglés</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" class="wp_rp_title">Pack de gráficos para juegos</a></li><li ><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" class="wp_rp_title">Tileset isométrico de gran calidad</a></li><li ><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" class="wp_rp_title">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li ><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" class="wp_rp_title">Tileset isometrico &#8211; Grassland</a></li><li ><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" class="wp_rp_title">Gráficos para prototipos de juegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/RGcqSpS5XNU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/</feedburner:origLink></item>
		<item>
		<title>GfxPlace – Gráficos para juegos gratuitos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/mFLlHVMPrG4/</link>
		<comments>http://razonartificial.com/2011/03/gfxplace-graficos-para-juegos-gratuitos/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 01:45:56 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Interfaces]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Sprites]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1446</guid>
		<description><![CDATA[GfxPlace es un sitio web donde puedes encontrar gráficos gratis para tus juegos. Pueden ser usados tanto en proyectos personales como comerciales. La web cuenta con un sistema de etiquetas y categorías para encontrar recursos de temas específicos. En la web abundan plantillas de interfaces gráficas, tecturas, fuentes tipográficas y Sprites 2D. El autor planea en el futuro abrir la comunidad para que cualquiera pueda subir gráficos, el proyecto solo tiene unos meses, pero es una buena idea una comunidad de gráficos libres, sobre todo para programadores independientes que quieren mostrar sus habilidades. http://www.gfxplace.com Gráficos para prototipos de juegosTileset isométrico de gran calidadOtro tileset isométrico muy bueno &#8211; CavernasTileset isometrico &#8211; GrasslandPack de gráficos para juegosZemanta]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1447 imageborder" title="gfxp" src="http://razonartificial.com/wp-content/uploads/2011/03/gfxp.png" alt="" width="250" height="90" /></p>
<p><a href="http://www.gfxplace.com/">GfxPlace</a> es un sitio web donde puedes encontrar gráficos gratis para tus juegos. Pueden ser usados tanto en proyectos personales como comerciales. La web cuenta con un sistema de etiquetas y categorías para encontrar recursos de temas específicos. En la web abundan plantillas de interfaces gráficas, tecturas, fuentes tipográficas y Sprites 2D.</p>
<p>El autor planea en el futuro abrir la comunidad para que cualquiera pueda subir gráficos, el proyecto solo tiene unos meses, pero es una buena idea una comunidad de gráficos libres, sobre todo para programadores independientes que quieren mostrar sus habilidades.</p>
<p><a href="http://www.gfxplace.com/">http://www.gfxplace.com</a></p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" class="wp_rp_title">Gráficos para prototipos de juegos</a></li><li ><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" class="wp_rp_title">Tileset isométrico de gran calidad</a></li><li ><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" class="wp_rp_title">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li ><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" class="wp_rp_title">Tileset isometrico &#8211; Grassland</a></li><li ><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" class="wp_rp_title">Pack de gráficos para juegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/mFLlHVMPrG4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/gfxplace-graficos-para-juegos-gratuitos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/gfxplace-graficos-para-juegos-gratuitos/</feedburner:origLink></item>
		<item>
		<title>Introducción a PySFML</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/nFKIZRwfEgA/</link>
		<comments>http://razonartificial.com/2011/03/introduccion-a-pysfml/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 01:20:10 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Bibliotecas]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[PySFML]]></category>
		<category><![CDATA[SFML]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1440</guid>
		<description><![CDATA[SFML es una biblioteca que permite crear aplicaciones multimedia de manera sencilla, tiene soporte para que puedas escribir tus aplicaciones en varios lenguajes y utiliza internamente la funcionalidad que provee opengl. La poca documentación que existe de esta biblioteca es para SFML que está escrita en C++ y no para las adaptaciones a otros lenguajes, en este artículo voy a tratar de enseñar lo básico acerca de Pysfml. Doy por sentado que tienes correctamente instalado Python y PySFML. Creando una ventana Lo primero que tenemos que hacer es importar la bibliotecam a continuación creamos la ventana y por último creamos el llamado loop del juego, pero vamos primero a ver el código y lo explicamos mejor. En la primera línea importamos PySFML. En la tercera línea creamos una ventana con sf.RenderWindow como vemos le pasamos dos parámetros (puede recibir más, pero se escapan del objetivo de este tutorial) que son el modo de video que lo establecemos con sf.VideoMode(640, 480) y el título de la ventana que es una cadena de texto. En la quinta línea creamos una variable booleana auxiliar para controlar el bucle del juego. En la sexta línea empezamos el llamado Game Loop del juego, cuando run valga false [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-1443" title="sfml" src="http://razonartificial.com/wp-content/uploads/2011/03/sfml-250x159.jpg" alt="" width="250" height="159" /></p>
<p><a href="http://www.sfml-dev.org/">SFML</a> es una biblioteca que permite crear aplicaciones multimedia de manera sencilla, tiene soporte para que puedas escribir tus aplicaciones en varios lenguajes y utiliza internamente la funcionalidad que provee <em>opengl</em>.</p>
<p>La poca documentación que existe de esta biblioteca es para SFML que está escrita en C++ y no para las adaptaciones a otros lenguajes, en este artículo voy a tratar de enseñar lo básico acerca de Pysfml. Doy por sentado que tienes correctamente instalado Python y PySFML.</p>
<h2>Creando una ventana</h2>
<p>Lo primero que tenemos que hacer es importar la bibliotecam a continuación creamos la ventana y por último creamos el llamado loop del juego, pero vamos primero a ver el código y lo explicamos mejor.</p>
<pre class="brush: python; title: ; notranslate">
from PySFML import sf

window = sf.RenderWindow(sf.VideoMode(640, 480), &quot;Hola Mundo&quot;)

run = True
while run:
    events = sf.Event()
    while window.GetEvent(events):
        if events.Type == sf.Event.Closed:
            run = False

        window.Display()
</pre>
<p>En la <strong>primera línea</strong> importamos PySFML. En la tercera línea creamos una ventana con <strong>sf.RenderWindow</strong> como vemos le pasamos dos parámetros (puede recibir más, pero se escapan del objetivo de este tutorial) que son el modo de video que lo establecemos con <strong>sf.VideoMode(640, 480)</strong> y el título de la ventana que es una cadena de texto.</p>
<p>En la quinta línea creamos una variable booleana auxiliar para controlar el bucle del juego. En la <strong>sexta línea</strong> empezamos el llamado Game Loop del juego, cuando run valga false será cuando se interrumpa el juego.</p>
<p>En la <strong>séptima línea</strong> declaramos otro variable llamada events que toma lo que devuelve sf.Event() y lo que devuelve es una lista de eventos que este recogiendo PySFML. La siguiente línea obtenemos los eventos que se proden sobre la ventana con el método  GetEvent. En la <strong>octava línea</strong> comprobamos si el evento es de Closed, es decir, si es un evento de cierre de la ventana. En cuyo caso el la <strong>línea 9</strong> cambiamos la variable run a False para salir del bucle.</p>
<p>Por último con la última línea llamamos el método <strong>Display()</strong> de la ventana que lo que hace es dibujarla. Con esto ya tenemos una ventana vacía con el título &#8220;Hola Mundo&#8221; que responde a eventos de cierre.</p>
<h2>Añadir un Sprite</h2>
<p>Ahora vamos a cargar una imagen. Yo voy a poner el <a href="http://razonartificial.com/wp-content/uploads/2011/03/logo.png">logo de Razón Artificial</a> en el centro de la pantalla pero puede ser cualquier imagen, simplemente ponerla en el mismo directorio que el script del ejemplo. Como antes, pongo el código y lo comentamos.</p>
<pre class="brush: python; title: ; notranslate">
from PySFML import sf

window = sf.RenderWindow(sf.VideoMode(640, 480), &quot;Hola Mundo&quot;)

logo_img = sf.Image()
logo_img.LoadFromFile('logo.png')
logo_sprite = sf.Sprite(logo_img)
logo_sprite.SetPosition(200, 100)

run = True
while run:
    events = sf.Event()
    while window.GetEvent(events):
        if events.Type == sf.Event.Closed:
            run = False

        window.Clear()
        window.Draw(logo_sprite)
        window.Display()
</pre>
<p>Líneas nuevas a partir de la 5. Creamos una variable llama logo_img y le pasamos sf.Image() con esto la creamos un objeto imagen de PySFML. A continuación llamamos al método LoadFromFile() y le pasamos como parámetro la ruta de nuestra imagen. Con esto tenemos nuestra imagen cargada, pero las imágenes no son dibujables en PySFML solo son un recurso. Lo que es dibujable es un Sprite que se pueden crear con una imagen.</p>
<p>En la <strong>línea 7</strong> creamos un objeto Sprite llamado logo_sprite pasándole como parámetro nuestra imagen cargada. Ya tenemos nuestro Sprite listo. Los Sprites tienen varios métodos y parámetros que ya veremos en otros artículos, pero uno de ellos es SetPosition(x, y) que recibe los valores de las coordenadas donde queremos mostrar nuestra imagen como vemos en la <strong>línea 8</strong>.</p>
<p>Es hora de mostrar el Sprite en nuestra ventana. Lo hacemos en la linea 18 llamando al método Draw() de window y pasándole como parámetro nuestro Sprite. En parte es lógico casi se puede leer: ventana.Dubujar(Sprite).</p>
<p>Anteriormente en la lía anterior limpiamos la ventana con el parámetro Clear(), esto lo que hace es borrar la pantalla para dibujar de nuevo. Es lo que hace que al mover nuestro personaje se borre de un lado antes de ponerlo en otro. Este es el resultado:</p>
<p><img class="aligncenter size-full wp-image-1442" title="Hola Mundo_001" src="http://razonartificial.com/wp-content/uploads/2011/03/Hola-Mundo_001.png" alt="" width="642" height="505" /></p>
<p>Esto es una rápida introducción a PySFML, en futuros artículos miraremos esta estupenda biblioteca más en profundidad.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li><li ><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" class="wp_rp_title">Proyecto Generic Game Engine</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" class="wp_rp_title">SFML &#8211; Juego de ejemplo</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/nFKIZRwfEgA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/introduccion-a-pysfml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/introduccion-a-pysfml/</feedburner:origLink></item>
		<item>
		<title>Bienvenidos a Razón Artificial 2.0</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/m2PoVpINQjA/</link>
		<comments>http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 05:34:19 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1435</guid>
		<description><![CDATA[Bienvenidos a esta nueva etapa de la comunidad, después de unos meses de altibajos nos renovamos completamente para intentar ofrecer una buena comunidad de desarrollo de videojuegos hispana. Abrimos nuevas secciones, reorganizamos todo el contenido que teníamos y por su puesto preparamos mucho más para esta nueva revolución en la comunidad. Continúa leyendo y entérate de todas las novedades. Volvemos a ser comunidad Dejamos de ser solo un blog para convertirnos en un lugar de encuentro para desarrolladores. Ahora tenemos Foro donde podrás preguntar dudas, intercambiar información, recursos con otros desarrolladores, etc., Chat y como siempre nos puedes seguir en Twitter. Reorganizamos el contenido Todo el contenido ha sido reorganizado en tres grandes áreas: Noticias - En ella incluiremos los últimas novedades en la industria y en el Scene. Intentaremos mantenerte informado de todo lo que pasa. Artículos &#8211; Categorizados en 5 grandes áreas: Diseño, Programación, Gráficos y Audio. Todos los tutoriales, reviews, cursos, guías, etc. para todo los temas de desarrollo de videojuegos. Recursos &#8211; Almacén de recursos libres para utilizar en tus proyectos. Códigos, Sprites, Modelos 3D, Música, Sonidos, etc. También podrás buscar contenido utilizando el buscador o por las etiquetas para temas específicos como Python, Inteligencia Artificial o XNA. [...]]]></description>
				<content:encoded><![CDATA[<p>Bienvenidos a esta nueva etapa de la comunidad, después de unos meses de altibajos nos renovamos completamente para intentar ofrecer una buena comunidad de desarrollo de videojuegos hispana.</p>
<p>Abrimos nuevas secciones, reorganizamos todo el contenido que teníamos y por su puesto preparamos mucho más para esta nueva revolución en la comunidad. Continúa leyendo y entérate de todas las novedades.</p>
<h2>Volvemos a ser comunidad</h2>
<p>Dejamos de ser solo un blog para convertirnos en un lugar de encuentro para desarrolladores. Ahora tenemos Foro donde podrás preguntar dudas, intercambiar información, recursos con otros desarrolladores, etc., Chat y como siempre nos puedes seguir en Twitter.<span id="more-1435"></span></p>
<h2>Reorganizamos el contenido</h2>
<p>Todo el contenido ha sido reorganizado en tres grandes áreas:</p>
<ul>
<li><strong>Noticias </strong>- En ella incluiremos los últimas novedades en la industria y en el Scene. Intentaremos mantenerte informado de todo lo que pasa.</li>
<li><strong>Artículos</strong> &#8211; Categorizados en 5 grandes áreas: <strong>Diseño</strong>,<strong> Programación</strong>,<strong> Gráficos </strong>y <strong>Audio</strong>. Todos los tutoriales, reviews, cursos, guías, etc. para todo los temas de desarrollo de videojuegos.</li>
<li><strong>Recursos</strong> &#8211; Almacén de recursos libres para utilizar en tus proyectos. Códigos, Sprites, Modelos 3D, Música, Sonidos, etc.</li>
</ul>
<p>También podrás buscar contenido utilizando el <strong>buscador</strong> o por las etiquetas para temas específicos como <strong>Python, Inteligencia Artificial</strong> o <strong>XNA</strong>.</p>
<h2>Lo último en portada</h2>
<p>La portada ha sido diseñada para tener de un vistazo lo último de la comunidad por lo que podrás encontrar en primera plana las últimas noticias, artículos, recursos, últimos mensajes en el foro y en twitter.</p>
<h2>Diseño limpio</h2>
<p>Hemos hecho un diseño claro y limpio con páginas amplias en la vista completa para facilitar la lectura de la documentación, las noticias, etc.</p>
<p>Apostamos por una comunidad referente en el desarrollo de videojuegos hispano, esperamos tu participación en el proyecto. Bienvenidos a todos.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/" class="wp_rp_title">Ayuda a financiar la web: Vótanos en Lánzanos</a></li><li ><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" class="wp_rp_title">Iberogre &#8211; Documentación de Ogre en español</a></li><li ><a href="http://razonartificial.com/2013/01/propositos-2013/" class="wp_rp_title">Propósitos 2013</a></li><li ><a href="http://razonartificial.com/2012/11/nueva-version-de-razon-artificial/" class="wp_rp_title">Nueva versión de Razón Artificial</a></li><li ><a href="http://razonartificial.com/2010/09/sobre-que-quieres-que-escribamos/" class="wp_rp_title">Sobre qué quieres que escribamos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/m2PoVpINQjA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/</feedburner:origLink></item>
		<item>
		<title>Curso programación de videojuegos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/acDpH4N-ikk/</link>
		<comments>http://razonartificial.com/2011/03/curso-programacion-de-videojuegos/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 21:21:06 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Curso]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Pygame]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1292</guid>
		<description><![CDATA[Curso Cerrado No se aceptan más participantes hasta la próxima edición. Presentamos una nueva iniciativa de parte de CreaGames y Razón Artificial. Un curso para iniciarse en la programación de videojuegos, si siempre has querido aprender a programar videojuegos, pero nunca has sabido por donde empezar esta es tu oportunidad. Características - Iniciar al alumno en en la programación. - Enseñar las matemáticas básicas necesarias. - Curso ameno y divertido, se pretende que sea a base de elaborar juegos que van creciendo en dificultad. - Python como lenguaje de programación. Sencillo para iniciarse y entender los conceptos sin tener que pelearte con el lenguaje. - Aprendizaje de estructura de datos básicas. - Programación gráfica utilizando la biblioteca gráfica Pygame A quien va dirigido A todo aquel que alguna vez a intentado aprender a programar videojuegos y que por una cosa u otra no lo ha conseguido. El curso es para gente que quiere aprender desde cero, no es un curso avanzado. No se verán juegos 3D ni serán capaces de hacer tu propio Final Fantasy al terminar. Se enseñará a programar en un lenguaje, gestionar proyectos de software, estructura de datos y manejo de programas auxiliares para la programación. Se [...]]]></description>
				<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1293" title="curso_python" src="http://razonartificial.com/wp-content/uploads/2011/03/curso_python.png" alt="" width="520" height="320" /></p>
<p><span style="color: #ff0000;"><strong>Curso Cerrado No se aceptan más participantes hasta la próxima edición.</strong></span><br />
Presentamos una nueva iniciativa de parte de <a href="http://www.creagames.es/">CreaGames</a> y <a href="http://razonartificial.com/">Razón Artificial</a>. Un curso para iniciarse en la programación de videojuegos, si siempre has querido aprender a programar videojuegos, pero nunca has sabido por donde empezar esta es tu oportunidad.</p>
<h3>Características</h3>
<p>- Iniciar al alumno en en la programación.<br />
- Enseñar las matemáticas básicas necesarias.<br />
- Curso ameno y divertido, se pretende que sea a base de elaborar juegos que van creciendo en dificultad.<br />
- Python como lenguaje de programación. Sencillo para iniciarse y entender los conceptos sin tener que pelearte con el lenguaje.<br />
- Aprendizaje de estructura de datos básicas.<br />
- Programación gráfica utilizando la biblioteca gráfica Pygame</p>
<h3>A quien va dirigido</h3>
<p>A todo aquel que alguna vez a intentado aprender a programar videojuegos y que por una cosa u otra no lo ha conseguido. El curso es para gente que quiere aprender desde cero, no es un curso avanzado. No se verán juegos 3D ni serán capaces de hacer tu propio Final Fantasy al terminar. Se enseñará a programar en un lenguaje, gestionar proyectos de software, estructura de datos y manejo de programas auxiliares para la programación. Se pretende que el alumno sea capaz de saber hacer juegos 2D usando Python y Pygame, pero más que eso que se inicie en este mundo y que aprenda sobre el proceso de desarrollo de videojuegos que vale para otros lenguajes, tecnologías y juegos en 3D.</p>
<h3>Método de aprendizaje</h3>
<p>Enseñar leyendo un libro o un tutorial a veces puede ser liante y confuso y se puede perder la motivación. Mi objetivo es enseñar cumpliendo objetivos.</p>
<p>La idea es tener unos alumnos fijos a los que pueda supervisar y ayudar. Mediante prácticas, dudas por email, charlas por chat.</p>
<p>En principio no quiero poner un límite de alumnos, vamos a ver la acogida que tiene, pero se intentará que sea un grupo reducido del que me pueda encargar.</p>
<h3>Requisitos</h3>
<p>- Ganas de aprender a programar videojuegos. Es un trabajo de cabeza que requiere lógica y probar y probar. No es apretar dos botones. Hay que leer mucho.<br />
- Tener tiempo para dedicarle. Al menos una hora al día.<br />
- Ser serio y constante. Si alguien se apunta y abandona el curso por motivos no justificables le quedará prohibida la inscripción en nuevos cursos. Pensar si de verdad se puede o no antes de inscribirse, no pierdas mi tiempo ni el de otros posibles alumnos.</p>
<h3>Inscripción</h3>
<p>Para inscribirse dejar un comentario y mandar un correo a <a href="mailto:adrigm@creagames.es">adrigm@creagames.es</a> con los siguientes datos.</p>
<p>- Nombre<br />
- Correo de contacto.<br />
- Edad.<br />
- Conocimientos previos en la programacion de videojuegos.<br />
- Motivo por el que merecen ser elegidos.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" class="wp_rp_title">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li ><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" class="wp_rp_title">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li ><a href="http://razonartificial.com/2010/08/curso-python-iii-%e2%80%93-scripts-y-comentarios/" class="wp_rp_title">Curso Python III – Scripts y Comentarios</a></li><li ><a href="http://razonartificial.com/2010/01/curso-python-i-interprete-y-scripts/" class="wp_rp_title">Curso Python I – Intérprete y scripts</a></li><li ><a href="http://razonartificial.com/2010/01/curso-python/" class="wp_rp_title">Curso Python</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/acDpH4N-ikk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/03/curso-programacion-de-videojuegos/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/03/curso-programacion-de-videojuegos/</feedburner:origLink></item>
		<item>
		<title>Volverán los tutoriales</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/jhoepahDMW8/</link>
		<comments>http://razonartificial.com/2011/01/volveran-los-tutoriales/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 22:55:58 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1287</guid>
		<description><![CDATA[Desde que se estreno el blog nunca había pasado tanto tiempo sin escribir. Anteriormente escribí acerca del cambio de filosofía del blog y eso se mantiene. En el sentido de que esto será algo personal y cosas propias y no un intento de comunidad, pero volveré a escribir artículos y tutoriales acerca de inteligencia artificial y el desarrollo de videojuegos. Intentaré escribir buenos artículos de desarrollo de videojuegos sin centrarme en un lenguaje o tecnología. Todo el que sepa ya programar lo básico sabe que lo difícil no es escribir el código sino saber como escribirlo, como hacer las cosas para que quede bien y sea eficiente y eso trataré de poner aquí. Yo ahora mismo estoy embarcado en crear juegos para IOS, así que puede que haya artículos relacionados con objective-c, mac, iphone, etc. Pero intentaré que los dedicados a la IA y el desarrollo de videojuego sea lo más genérico posible. Aprovecho para agradecer a todos los que comentan en el blog y dan las gracias, que son muchos, muchas veces no contesto por no llenar los post de comentarios alejados del tema, pero se agradecen. Espero que todavía alguien me siga, si es así os prometo mucho [...]]]></description>
				<content:encoded><![CDATA[<p>Desde que se estreno el blog nunca había pasado tanto tiempo sin escribir. Anteriormente escribí acerca del cambio de filosofía del blog y eso se mantiene. En el sentido de que esto será algo personal y cosas propias y no un intento de comunidad, pero volveré a escribir artículos y tutoriales acerca de inteligencia artificial y el desarrollo de videojuegos.</p>
<p>Intentaré escribir buenos artículos de desarrollo de videojuegos sin centrarme en un lenguaje o tecnología. Todo el que sepa ya programar lo básico sabe que lo difícil no es escribir el código sino saber como escribirlo, como hacer las cosas para que quede bien y sea eficiente y eso trataré de poner aquí.</p>
<p>Yo ahora mismo estoy embarcado en crear juegos para IOS, así que puede que haya artículos relacionados con objective-c, mac, iphone, etc. Pero intentaré que los dedicados a la IA y el desarrollo de videojuego sea lo más genérico posible.</p>
<p>Aprovecho para agradecer a todos los que comentan en el blog y dan las gracias, que son muchos, muchas veces no contesto por no llenar los post de comentarios alejados del tema, pero se agradecen. Espero que todavía alguien me siga, si es así os prometo mucho más contenido este año.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/01/%c2%a1hola-mundo/" class="wp_rp_title">¡Hola Mundo!</a></li><li ><a href="http://razonartificial.com/2010/12/cambio-de-filosofia-del-blog/" class="wp_rp_title">Cambio de filosofía del blog</a></li><li ><a href="http://razonartificial.com/2010/09/sobre-que-quieres-que-escribamos/" class="wp_rp_title">Sobre qué quieres que escribamos</a></li><li ><a href="http://razonartificial.com/2013/01/propositos-2013/" class="wp_rp_title">Propósitos 2013</a></li><li ><a href="http://razonartificial.com/2010/07/futuro-del-engine-y-los-tutoriales/" class="wp_rp_title">Futuro del Engine y los tutoriales</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/jhoepahDMW8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/01/volveran-los-tutoriales/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/01/volveran-los-tutoriales/</feedburner:origLink></item>
		<item>
		<title>Charla sobre Programación Orientada a Objetos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/6HZMAZyLMHA/</link>
		<comments>http://razonartificial.com/2010/12/charla-sobre-programacion-orientada-a-objetos/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 22:35:13 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1277</guid>
		<description><![CDATA[He mantenido una charla muy interesante con el compañero Jogui por irc sobre la programación orientada a objetos en Python, me gustaría publicarla ya que considero que puede servir de ayuda al que se trabe con este estilo de programación para comenzar. Es una charla, no un tutorial, pero a veces así se aprende más. Ver charla Avances del Engine RPG: Añadido el ScrollCurso PythonArkanoid I &#8211; Empezando y configurandoPygame III: Cargar imágenesArkanoid II &#8211; Gestionando escenasZemanta]]></description>
				<content:encoded><![CDATA[<p>He mantenido una charla muy interesante con el compañero <strong>Jogui</strong> por irc sobre la programación orientada a objetos en Python, me gustaría publicarla ya que considero que puede servir de ayuda al que se trabe con este estilo de programación para comenzar. Es una charla, no un tutorial, pero a veces así se aprende más.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/12/charla_poo.txt">Ver charla</a></li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/07/avances-del-engine-rpg-anadido-el-scroll/" class="wp_rp_title">Avances del Engine RPG: Añadido el Scroll</a></li><li ><a href="http://razonartificial.com/2010/01/curso-python/" class="wp_rp_title">Curso Python</a></li><li ><a href="http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/" class="wp_rp_title">Arkanoid I &#8211; Empezando y configurando</a></li><li ><a href="http://razonartificial.com/2010/02/pygame-3-cargar-imagenes/" class="wp_rp_title">Pygame III: Cargar imágenes</a></li><li ><a href="http://razonartificial.com/2010/09/arkanoid-ii-gestionando-escenas/" class="wp_rp_title">Arkanoid II &#8211; Gestionando escenas</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/6HZMAZyLMHA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/charla-sobre-programacion-orientada-a-objetos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/charla-sobre-programacion-orientada-a-objetos/</feedburner:origLink></item>
		<item>
		<title>Cambio de filosofía del blog</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/5UYfpfEPv1w/</link>
		<comments>http://razonartificial.com/2010/12/cambio-de-filosofia-del-blog/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 20:00:44 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1264</guid>
		<description><![CDATA[Razón artificial está a punto de cumplir un año, ha día de hoy cuenta con 110 posts y unos 450 comentarios. En primer lugar quería agradecer a todos los que me han leído y se molestan en comentar porque te hacen sentir que estás ayudando a alguien y eso reconforta. He tenido más de un intento y la idea de que Razón Artificial fuera más que un blog y fuera una comunidad de desarrollo de videojuegos, la idea nunca terminó de cuajar del todo. Ahora después de unos días de reflexión, he decidido seguir el camino contrario. Escribir en un blog es gratificante, ver tu contenido publicado y que a otros les pueda servir enorgullece a uno, pero llega un momento en el que uno se tiene que plantear si quiere aprender o quiere enseñar. Por eso el blog pasará a ser simplemente mi web personal, en la que publicar mis proyectos, apuntes, notas, etc. Seguirá todo relacionado con el mundo de los videojuegos, la inteligencia artificial y la programación, pero ahora estará mas centrada en cosas personales o simplemente  que sean de mi interés. ¿Y qué significa todo esto, no habrá más tutoriales? Pues no lo sé, depende, quizás algún [...]]]></description>
				<content:encoded><![CDATA[<p>Razón artificial está a punto de cumplir un año, ha día de hoy cuenta con 110 posts y unos 450 comentarios. En primer lugar quería agradecer a todos los que me han leído y se molestan en comentar porque te hacen sentir que estás ayudando a alguien y eso reconforta. He tenido más de un intento y la idea de que Razón Artificial fuera más que un blog y fuera una comunidad de desarrollo de videojuegos, la idea nunca terminó de cuajar del todo.</p>
<p>Ahora después de unos días de reflexión, he decidido seguir el camino contrario. Escribir en un blog es gratificante, ver tu contenido publicado y que a otros les pueda servir enorgullece a uno, pero llega un momento en el que uno se tiene que plantear si quiere aprender o quiere enseñar. Por eso el blog pasará a ser simplemente mi web personal, en la que publicar mis proyectos, apuntes, notas, etc.</p>
<p>Seguirá todo relacionado con el mundo de los videojuegos, la inteligencia artificial y la programación, pero ahora estará mas centrada en cosas personales o simplemente  que sean de mi interés. ¿Y qué significa todo esto, no habrá más tutoriales? Pues no lo sé, depende, quizás algún día escriba pequeñas guías, experiencias, problemas que me surjan&#8230; a modo de bloc de notas personal y quizás os pueda ser útil.</p>
<p>Todo el contenido que hay seguirá estando disponible, pero ya no tendré la presión de escribir un artículo, tutorial, guía, etc. Simplemente escribiré para mí. Quizás incluso ahora liberado de esa presión escriba mucho más y cosas más interesante, no sé a donde llevará esta nueva etapa.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/07/%c2%bfuna-comunidad/" class="wp_rp_title">¿Una comunidad?</a></li><li ><a href="http://razonartificial.com/2010/05/volvemos-a-las-andadas/" class="wp_rp_title">Volvemos a las andadas</a></li><li ><a href="http://razonartificial.com/2010/06/opiniones-sobre-division/" class="wp_rp_title">Opiniones sobre división</a></li><li ><a href="http://razonartificial.com/2011/01/volveran-los-tutoriales/" class="wp_rp_title">Volverán los tutoriales</a></li><li ><a href="http://razonartificial.com/2010/09/sobre-que-quieres-que-escribamos/" class="wp_rp_title">Sobre qué quieres que escribamos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/5UYfpfEPv1w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/cambio-de-filosofia-del-blog/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/cambio-de-filosofia-del-blog/</feedburner:origLink></item>
		<item>
		<title>Gran Pack de desarrollo de videojuegos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/fyrEs_dMTW0/</link>
		<comments>http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 06:01:55 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[DirectX]]></category>
		<category><![CDATA[Engines]]></category>
		<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Pack]]></category>
		<category><![CDATA[Planificación]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Videojuegos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1250</guid>
		<description><![CDATA[Antes de nada quiero aclarar que no soy partidario de la piratería ni del todo &#8220;gratix&#8221; en el que parece que se ha convertido Internet. Por otro lado, si soy partidario de nuestro derecho como ciudadanos al acceso a la cultura. Mucha gente no puede permitirse comprarse todo juego, libro o película que sale al mercado, ¿Entonces como elegir? Pienso que para eso si está internet, puedes probar un juego o leer los primeros capítulos de un libro antes de comprarlo y ver si es realmente lo que quieres o mejor esperar a otra cosa. Con esa mentalidad he hecho este pack. Una gran colección de libros y documentos sobre el desarrollo de videojuegos, hay mezcla de material tanto con copyright como material libre o con licencias abiertas. Por favor, te pido que si de verdad encuentras útil alguno de los libros con copyright y crees que de verdad puedes sacarle provecho, ve y compralo. Ganarás mucho teniendo el libro en papel y estarás pagando sabiendo ya de ante mano lo que compras. Sobre el pack decir que cuenta con cientos de documentos de Diseño de niveles, Diseño de videojuegos, Programación, DirectX, OpenGL, Inteligencia Artificial, Matemáticas, Física, Engines, Gráficos y [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-1253" title="pack" src="http://razonartificial.com/wp-content/uploads/2010/12/pack-300x164.png" alt="" width="300" height="164" /></p>
<p>Antes de nada quiero aclarar que no soy partidario de la piratería ni del todo &#8220;gratix&#8221; en el que parece que se ha convertido Internet. Por otro lado, si soy partidario de nuestro derecho como ciudadanos al acceso a la cultura. Mucha gente no puede permitirse comprarse todo juego, libro o película que sale al mercado, ¿Entonces como elegir? Pienso que para eso si está internet, puedes probar un juego o leer los primeros capítulos de un libro antes de comprarlo y ver si es realmente lo que quieres o mejor esperar a otra cosa.</p>
<p>Con esa mentalidad he hecho este pack. Una gran colección de libros y documentos sobre el desarrollo de videojuegos, hay mezcla de material tanto con copyright como material libre o con licencias abiertas. Por favor, te pido que si de verdad encuentras útil alguno de los libros con copyright y crees que de verdad puedes sacarle provecho, ve y compralo. Ganarás mucho teniendo el libro en papel y estarás pagando sabiendo ya de ante mano lo que compras.</p>
<p>Sobre el pack decir que cuenta con cientos de documentos de Diseño de niveles, Diseño de videojuegos, Programación, DirectX, OpenGL, Inteligencia Artificial, Matemáticas, Física, Engines, Gráficos y un largo etc son unos 2GB de documentación a cerca de la creación de videojuegos.</p>
<p>Está dividido en 16 partes de 100MB menos la última que tiene 50MB.</p>
<ol>
<li>http://www.megaupload.com/?d=ZRB6LMT0</li>
<li>http://www.megaupload.com/?d=IHLAYGBT</li>
<li>http://www.megaupload.com/?d=RT3JJ9D0</li>
<li>http://www.megaupload.com/?d=K1SAGFGQ</li>
<li>http://www.megaupload.com/?d=E8HO5WT0</li>
<li>http://www.megaupload.com/?d=VW70J0E4</li>
<li>http://www.megaupload.com/?d=JOR6PHEE</li>
<li>http://www.megaupload.com/?d=X9X1SJXI</li>
<li>http://www.megaupload.com/?d=YOYVLJSC</li>
<li>http://www.megaupload.com/?d=AGVSH574</li>
<li>http://www.megaupload.com/?d=B1WOYA8H</li>
<li>http://www.megaupload.com/?d=WVSAXDZ0</li>
<li>http://www.megaupload.com/?d=784SYZFR</li>
<li>http://www.megaupload.com/?d=1N9JP834</li>
<li>http://www.megaupload.com/?d=XNFWJZN6</li>
<li>http://www.megaupload.com/?d=EKCOIVO1</li>
</ol>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" class="wp_rp_title">Iberogre &#8211; Documentación de Ogre en español</a></li><li ><a href="http://razonartificial.com/2011/04/artesania-control-exploradores-juegos-estrategia/" class="wp_rp_title">Artesania del control de exploradores en juegos de estrategia</a></li><li ><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" class="wp_rp_title">Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</a></li><li ><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" class="wp_rp_title">Tileset isométrico de gran calidad</a></li><li ><a href="http://razonartificial.com/2010/08/gamedevlesson-crear-videojuegos/" class="wp_rp_title">GameDevLesson – Crear videojuegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/fyrEs_dMTW0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/</feedburner:origLink></item>
		<item>
		<title>Tenemos canal de irc</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/tjPhEyiI7DI/</link>
		<comments>http://razonartificial.com/2010/12/tenemos-canal-de-irc/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 22:04:12 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1225</guid>
		<description><![CDATA[¡Tenemos canal de irc! Debido a que paso bastante tiempo en otros canales de irc, he decidido crear un canal para razón artificial para el que desee hablar o preguntar dudas acerca de la creación de videojuegos. Podéis entrar al canal desde el Webchat que hemos añadido al blog. Pero es mucho mejor disponer de un cliente nativo de irc como xchat. Nos podéis encontrar en el freenode en el canal #razonartificial. Yo estaré por allí, espero que se animen a entrar. Repositorio en github para el Engine-RPGCharla sobre Programación Orientada a ObjetosPygame IV: Creando SpritesJuego de la serpiente paso a paso. Parte 2Pygame III: Cargar imágenesZemanta]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-1226" title="IRCChat" src="http://razonartificial.com/wp-content/uploads/2010/12/IRCChat-300x173.jpg" alt="" width="300" height="173" /></p>
<p>¡Tenemos canal de irc! Debido a que paso bastante tiempo en otros canales de irc, he decidido crear un canal para razón artificial para el que desee hablar o preguntar dudas acerca de la creación de videojuegos. Podéis entrar al canal desde el <a href="http://razonartificial.com/chat/">Webchat</a> que hemos añadido al blog.</p>
<p>Pero es mucho mejor disponer de un cliente nativo de irc como <a href="http://xchat.org/">xchat</a>. Nos podéis encontrar en el <strong>freenode</strong> en el canal <strong>#razonartificial</strong>. Yo estaré por allí, espero que se animen a entrar.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/07/repositorio-en-github-para-el-engine-rpg/" class="wp_rp_title">Repositorio en github para el Engine-RPG</a></li><li ><a href="http://razonartificial.com/2010/12/charla-sobre-programacion-orientada-a-objetos/" class="wp_rp_title">Charla sobre Programación Orientada a Objetos</a></li><li ><a href="http://razonartificial.com/2010/02/pygame-4-creando-sprites/" class="wp_rp_title">Pygame IV: Creando Sprites</a></li><li ><a href="http://razonartificial.com/2010/07/juego-de-la-serpiente-paso-a-paso-parte-2/" class="wp_rp_title">Juego de la serpiente paso a paso. Parte 2</a></li><li ><a href="http://razonartificial.com/2010/02/pygame-3-cargar-imagenes/" class="wp_rp_title">Pygame III: Cargar imágenes</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/tjPhEyiI7DI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/tenemos-canal-de-irc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/tenemos-canal-de-irc/</feedburner:origLink></item>
		<item>
		<title>Sobre la IA de los videojuegos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/1l6QAHLs34I/</link>
		<comments>http://razonartificial.com/2010/12/sobre-la-ia-de-los-videojuegos/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 17:00:10 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1174</guid>
		<description><![CDATA[Navegando por la red he encontrado un buen documento acerca de la Inteligencia Artificial en los videojuegos. Nos habla de las principales técnicas de IA empleadas y de los hitos de la IA a lo largo de la historia de los videojuegos. Hace un repaso de los juegos más innovadores en cuando a inteligencia artificial y en qué innovaron, por último nos explica algunas te las técnicas más usadas en los videojuegos. Un documento que merece la pena leer. IA en videojuegos &#8211; Persiguiendo y evadiendo ILa Inteligencia Artificial de L4DArboles e inteligencia ArtificialTécnicas de IA en los videojuegosModelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTSZemanta]]></description>
				<content:encoded><![CDATA[<p>Navegando por la red he encontrado un buen documento acerca de la Inteligencia Artificial en los videojuegos. Nos habla de las principales técnicas de IA empleadas y de los hitos de la IA a lo largo de la historia de los videojuegos. Hace un repaso de los juegos más innovadores en cuando a inteligencia artificial y en qué innovaron, por último nos explica algunas te las técnicas más usadas en los videojuegos. Un documento que merece la pena leer.</p>
<div id="__ss_3657462"><object id="__sse3657462" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="625" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=iavideojuegos-100407103002-phpapp01&amp;stripped_title=ia-videojuegosd&amp;userName=jccortizo" /><param name="name" value="__sse3657462" /><param name="allowfullscreen" value="true" /><embed id="__sse3657462" type="application/x-shockwave-flash" width="625" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=iavideojuegos-100407103002-phpapp01&amp;stripped_title=ia-videojuegosd&amp;userName=jccortizo" name="__sse3657462" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li ><a href="http://razonartificial.com/2010/08/la-inteligencia-artificial-de-l4d/" class="wp_rp_title">La Inteligencia Artificial de L4D</a></li><li ><a href="http://razonartificial.com/2010/08/arboles-e-inteligencia-artificial/" class="wp_rp_title">Arboles e inteligencia Artificial</a></li><li ><a href="http://razonartificial.com/2010/10/tecnicas-de-ia-en-los-videojuegos/" class="wp_rp_title">Técnicas de IA en los videojuegos</a></li><li ><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" class="wp_rp_title">Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/1l6QAHLs34I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/sobre-la-ia-de-los-videojuegos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/sobre-la-ia-de-los-videojuegos/</feedburner:origLink></item>
		<item>
		<title>Otro tileset isométrico muy bueno – Cavernas</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/sxC3ktku3Vk/</link>
		<comments>http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 22:11:08 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[Isométrico]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1168</guid>
		<description><![CDATA[Bueno viendo que os gusto el tileset isometrico que mostré ayer, hoy os traigo otro, esta vez de una caverna. Está creado por pfunked y tiene licencia GPL 3.0 Viene preparado para el editor de mapas tiled espero que guste tanto como el anterior. Descargar tileset Tileset isométrico de gran calidadTileset isometrico &#8211; GrasslandPack de gráficos para juegosCrear tiles isométricos 2D con BlenderGráficos para prototipos de juegosZemanta]]></description>
				<content:encoded><![CDATA[<p><a href="http://razonartificial.com/wp-content/uploads/2010/12/caves_preview_large.png"><img class="aligncenter size-full wp-image-1170" title="caves_preview_large" src="http://razonartificial.com/wp-content/uploads/2010/12/caves_preview_large.png" alt="" width="600" height="294" /></a></p>
<p>Bueno viendo que os gusto el tileset isometrico que mostré ayer, hoy os traigo otro, esta vez de una caverna. Está creado por <strong>pfunked </strong>y tiene licencia <strong>GPL 3.0</strong> Viene preparado para el editor de mapas <a href="http://www.mapeditor.org/">tiled</a> espero que guste tanto como el anterior.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/12/tiled_cave_1.png">Descargar tileset</a></li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" class="wp_rp_title">Tileset isométrico de gran calidad</a></li><li ><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" class="wp_rp_title">Tileset isometrico &#8211; Grassland</a></li><li ><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" class="wp_rp_title">Pack de gráficos para juegos</a></li><li ><a href="http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/" class="wp_rp_title">Crear tiles isométricos 2D con Blender</a></li><li ><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" class="wp_rp_title">Gráficos para prototipos de juegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/sxC3ktku3Vk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/</feedburner:origLink></item>
		<item>
		<title>Documento de diseño de videojuegos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/dl_tb56qST8/</link>
		<comments>http://razonartificial.com/2010/12/documento-de-diseno-de-videojuegos/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 13:40:56 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Diseño]]></category>
		<category><![CDATA[Documentos]]></category>
		<category><![CDATA[Planificación]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1160</guid>
		<description><![CDATA[El documento de diseño de videojuegos o Game design document (GDD) es un documento que me parece esencial para el desarrollo de un videojuego medianamente serio. En SionDream han hablado de ello y han elaborado uno para un proyecto que tienen entre manos de crear un juego de ejemplo para Ogre3D. Es totalmente recomandable revisarlo si estás planeando el diseño de un videojuego ya que tiempo que inviertas en este documento son quebraderos de cabeza y correcciones que te evitas en la fase de desarrollo. Dejo la entrada en la que lo explica y el documento de ejemplo que han creado. Sobre Game Design Document GDD de ejemplo GameDevLesson – Crear videojuegosConceptos de Diseño de VideojuegosGran Pack de desarrollo de videojuegos[RAGE] Estructura básica del Engine[RAGE] La clase AppZemanta]]></description>
				<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1161" title="game-design-document" src="http://razonartificial.com/wp-content/uploads/2010/12/game-design-document.jpg" alt="" width="550" height="125" /></p>
<p>El documento de diseño de videojuegos o Game design document (GDD) es un documento que me parece esencial para el desarrollo de un videojuego medianamente serio. En <a href="http://siondream.com">SionDream</a> han hablado de ello y han elaborado uno para un proyecto que tienen entre manos de crear un juego de ejemplo para Ogre3D.</p>
<p>Es totalmente recomandable revisarlo si estás planeando el diseño de un videojuego ya que tiempo que inviertas en este documento son quebraderos de cabeza y correcciones que te evitas en la fase de desarrollo. Dejo la entrada en la que lo explica y el documento de ejemplo que han creado.</p>
<ul>
<li><a href="http://siondream.com/blog/proyectos/pfc/sion-tower/game-design-document/">Sobre Game Design Document</a></li>
<li><a href="http://forja.rediris.es/frs/download.php/2019/gdd.pdf">GDD de ejemplo</a></li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/08/gamedevlesson-crear-videojuegos/" class="wp_rp_title">GameDevLesson – Crear videojuegos</a></li><li ><a href="http://razonartificial.com/2010/08/conceptos-de-diseno-de-videojuegos/" class="wp_rp_title">Conceptos de Diseño de Videojuegos</a></li><li ><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" class="wp_rp_title">Gran Pack de desarrollo de videojuegos</a></li><li ><a href="http://razonartificial.com/2013/01/rage-estructura-basica-del-engine/" class="wp_rp_title">[RAGE] Estructura básica del Engine</a></li><li ><a href="http://razonartificial.com/2013/01/rage-la-clase-app/" class="wp_rp_title">[RAGE] La clase App</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/dl_tb56qST8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/documento-de-diseno-de-videojuegos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/documento-de-diseno-de-videojuegos/</feedburner:origLink></item>
		<item>
		<title>Tileset isométrico de gran calidad</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/eB0fkL_Ydp8/</link>
		<comments>http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 00:46:25 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[Gráficos]]></category>
		<category><![CDATA[Isométrico]]></category>
		<category><![CDATA[Tileset]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1153</guid>
		<description><![CDATA[Os traigo un tileset isométrico de gran calidad para exteriores, no abundan los tilesets libres y mucho menos isométricos, pero este es muy bueno. El tileset tiene licencia CC-BY 3.0 y pertenece a Yar. los tiles son de 64&#215;64 y son perfectos para prototipos. La imagen superior está realizada con el tileset, a mi la verdad que no me parece para nada una imagen creada a base de tiles. Descargar tileset Tileset isometrico &#8211; GrasslandOtro tileset isométrico muy bueno &#8211; CavernasPack de gráficos para juegosCrear tiles isométricos 2D con BlenderGráficos para prototipos de juegosZemanta]]></description>
				<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1155" title="demo-image" src="http://razonartificial.com/wp-content/uploads/2010/12/demo-image.png" alt="" width="640" height="256" /></p>
<p>Os traigo un tileset isométrico de gran calidad para exteriores, no abundan los tilesets libres y mucho menos isométricos, pero este es muy bueno. El tileset tiene licencia <strong>CC-BY 3.</strong>0 y pertenece a <strong>Yar</strong>. los tiles son de 64&#215;64 y son perfectos para prototipos.</p>
<p>La imagen superior está realizada con el tileset, a mi la verdad que no me parece para nada una imagen creada a base de tiles.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/12/iso-64x64-outside.png">Descargar tileset</a></li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" class="wp_rp_title">Tileset isometrico &#8211; Grassland</a></li><li ><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" class="wp_rp_title">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li ><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" class="wp_rp_title">Pack de gráficos para juegos</a></li><li ><a href="http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/" class="wp_rp_title">Crear tiles isométricos 2D con Blender</a></li><li ><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" class="wp_rp_title">Gráficos para prototipos de juegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/eB0fkL_Ydp8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/</feedburner:origLink></item>
		<item>
		<title>Tutorial XNA 2 – Entendiendo el código</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/DgdZAKVJy1E/</link>
		<comments>http://razonartificial.com/2010/11/tutorial-xna-2-entendiendo-el-codigo/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 20:40:13 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1021</guid>
		<description><![CDATA[Después de tener nuestro proyecto listo y de haber ejecutado y ver una ventana vacía es hora de ver que es lo que tenemos y que nos ha creado el Visual Studio por defecto. Para ello prestamos atención al explorador de soluciones de la parte derecha, deberíamos tener algo como esto. En principio prestamos atención a 3 cosas: El fichero Program.cs El fichero Game1.cs MiPongContent (Content) Los dos primeros son los únicos ficheros de código que nos crea Visual Studio que pasamos a comentar a continuación. El Content es el manejador de contenido es aquí donde cargaremos los diferentes recursos que usemos en nuestros juegos: Imágenes, Sonidos, Fuentes, etc. El archivo Program.cs Bueno Como vemos por los comentarios que he puesto en el código este archivo es el principal de nuestro proyecto y se encarga de crear la clase del programa y el método main que es el punto de entrada a los porgramas C#. Luego dentro crea un objeto Game1 que es la clase de nuestro juego (el otro archivo) y llama a su método Run() que se encarga de entrar en el bucle del juego. El archivo Game1.cs El archivo Game1.cs tiene bastanes cosas, en este tutorial explicaremos [...]]]></description>
				<content:encoded><![CDATA[<p>Después de tener nuestro proyecto listo y de haber ejecutado y ver una ventana vacía es hora de ver que es lo que tenemos y que nos ha creado el Visual Studio por defecto. Para ello prestamos atención al explorador de soluciones de la parte derecha, deberíamos tener algo como esto.</p>
<p><a href="http://razonartificial.com/wp-content/uploads/2010/11/explorador_xna.png"><img class="aligncenter size-full wp-image-1036" title="explorador_xna" src="http://razonartificial.com/wp-content/uploads/2010/11/explorador_xna.png" alt="" width="284" height="264" /></a>En principio prestamos atención a 3 cosas:</p>
<ul>
<li>El fichero Program.cs</li>
<li>El fichero Game1.cs</li>
<li>MiPongContent (Content)</li>
</ul>
<p>Los dos primeros son los únicos ficheros de código que nos crea Visual Studio que pasamos a comentar a continuación. El Content es el manejador de contenido es aquí donde cargaremos los diferentes recursos que usemos en nuestros juegos: Imágenes, Sonidos, Fuentes, etc.</p>
<h2>El archivo Program.cs</h2>
<pre class="brush: csharp; title: ; notranslate">
using System;

namespace MiPong // Namespace del juego que es el nombre del mismo
{
#if WINDOWS || XBOX
    static class Program
    {
        /// &lt;summary&gt;
        /// Este es el punto de entrada al juego, empieza ejecutandose aquí.
        /// &lt;/summary&gt;
        static void Main(string[] args)
        {
            using (Game1 game = new Game1()) // Crea un objeto game de la clase Game1 (nuestro juego).
            {
                game.Run(); // Lanza el juego con el método Run().
            }
        }
    }
#endif
}
</pre>
<p>Bueno Como vemos por los comentarios que he puesto en el código este archivo es el principal de nuestro proyecto y se encarga de crear la clase del programa y el método main que es el punto de entrada a los porgramas C#. Luego dentro crea un objeto Game1 que es la clase de nuestro juego (el otro archivo) y llama a su método Run() que se encarga de entrar en el bucle del juego.</p>
<h2>El archivo Game1.cs</h2>
<p>El archivo Game1.cs tiene bastanes cosas, en este tutorial explicaremos la estructura general y lo que es relevante de momento. Lo pongo entero y vamos explicándolo paso a paso.</p>
<pre class="brush: csharp; title: ; notranslate">
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace MiPong
{
    /// &lt;summary&gt;
    /// This is the main type for your game
    /// &lt;/summary&gt;
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

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

        /// &lt;summary&gt;
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// &lt;/summary&gt;
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
        }

        /// &lt;summary&gt;
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// &lt;/summary&gt;
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here
        }

        /// &lt;summary&gt;
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// &lt;/summary&gt;
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// &lt;summary&gt;
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;gameTime&quot;&gt;Provides a snapshot of timing values.&lt;/param&gt;
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            base.Update(gameTime);
        }

        /// &lt;summary&gt;
        /// This is called when the game should draw itself.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;gameTime&quot;&gt;Provides a snapshot of timing values.&lt;/param&gt;
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }
    }
}
</pre>
<p>Primero tenemos los <strong>using</strong> que se encargan de importar las partes de .Net y XNA necesarias, vemos algunos de los imports de XNA ahí con respecto a los típicos de un programa en C#.</p>
<p>A continuación abrimos el <strong>Namespace </strong>de nuestro juego que se llama igual que nuestro proyecto en nuestro caso MiPong. Todas las clases que escribamos para nuestro proyecto deberían de estar dentro de este Namespace.</p>
<p>Ya dentro del Namespace vemos solamente la creación de una Clase, la clase <strong>Game1</strong> que hereda de <strong>Microsoft.Xna.Framework.Game</strong> y será la clase principal de nuestro juego, es de la que creamos el objeto en el archivo Program.cs. Vamos a comentar la clase.</p>
<p>Lo primero que nos encontramos son dos variable de clase:</p>
<pre class="brush: csharp; title: ; notranslate">
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
</pre>
<p>Son el manejador de gráficos y de sprites, muy útiles y usados. Ya los veremos en profundidad a continuación.</p>
<p>Luego viene el constructor de la clase:</p>
<pre class="brush: csharp; title: ; notranslate">
public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = &quot;Content&quot;;
        }
</pre>
<p>Simplemente crea el GraphicsDeviceManager que es el encargado de dibujar en pantalla. La otra línea define el directorio del contenido, de momento no nos preocuparemos por esto porque no vamos a tener que tocar el constructor.</p>
<pre class="brush: csharp; title: ; notranslate">
protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
        }
</pre>
<p>Este método solo se ejecuta una vez, al principio y en el se debe iniciar toda la lógica del juego, es decir, dar valores a variables, crear objetos necesarios, etc.</p>
<pre class="brush: csharp; title: ; notranslate">
protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here
        }
</pre>
<p>Este método también se carga una sola vez y se usa para cargar el contenido, imagenes, texturas, etc. Dentro creamos el <strong>spriteBatch</strong> que lo usamos para dibujar texturas en pantalla. En XNA todos los sprites son texturas.</p>
<pre class="brush: csharp; title: ; notranslate">
 protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }
</pre>
<p>El método <strong>UnloadContent</strong> es para quitar contenido, de momento no lo usaremos.</p>
<pre class="brush: csharp; title: ; notranslate">
protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            base.Update(gameTime);
        }
</pre>
<p>El método <strong>Update</strong>, es de los más importantes se ejecuta continuamente y en el deberemos poner todo lo que necesita ser comprobado constantemente. Teclado, Colisiones, Movimiento, etc.</p>
<p>Dentro tenemos:</p>
<pre class="brush: csharp; title: ; notranslate">
 if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
</pre>
<p>Sirve para salir del juego en la Xbox 360 ya que el juego es compatible tanto con WIndows como con Xbox y con muy poco también en Phone 7.</p>
<pre class="brush: csharp; title: ; notranslate">
protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }
</pre>
<p>Por último el método <strong>Draw</strong> se encaga de dibujar en pantalla los sprites. También se ejecuta constantemente</p>
<p>De todo esto de momento nos debemos de quedar con que se el contenido se carga en el método <strong>LoadContent</strong>, la lógica se actualiza en <strong>Update </strong>y se dibuja con el método <strong>Draw</strong>, lo demás profundizaremos más adelante.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/11/tutorial-xna-1-preparandonos-para-trabajar/" class="wp_rp_title">Tutorial XNA 1 – Preparándonos para trabajar</a></li><li ><a href="http://razonartificial.com/2010/11/cambio-hacia-xna/" class="wp_rp_title">Cambio hacia XNA</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" class="wp_rp_title">SFML &#8211; Abriendo una ventana</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/DgdZAKVJy1E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/11/tutorial-xna-2-entendiendo-el-codigo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/11/tutorial-xna-2-entendiendo-el-codigo/</feedburner:origLink></item>
		<item>
		<title>Geometría espacial. Vectores II</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/gu5ECNRiE_g/</link>
		<comments>http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 05:30:21 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Matemáticas]]></category>
		<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Geometría]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1022</guid>
		<description><![CDATA[En la primera parte empezamos a ver vectores y vimos algunas de sus características y usos. En esta segunda parte seguiremos profundizando el tema de vectores que es uno de los más importantes de la geometría espacial. Dependencia e independencia lineal de vectores Varios vectores se llaman linealmente  dependientes si alguno de ellos se puede poner como combinación lineal de los demás. En caso contrario se dirán que son linealmente independientes. En el último apartado del artículo anterior vimos cuando un vector es combinación lineal de otro. Base Tres vectores linealmente indendientes en (En el espacio) forman una base. Si los vectores básicos son perpendiculares entre sí, se dice que la base es  ortogonal. Si además los vectores tienen módulo 1, se dice que la base es ortonormal. Cuando hemos encontrado una base, cualquier vector de (del espacio) se puede poner como combinación lineal de los vectores básicos, es decir, si es una base de y (el vector v pertenece al espacio) entonces  La terna  se denomina coordenadas cartesianas de  respecto a la base B. A partir de ahora tomaremos la base  que es la base canónica de y todas las coordenadas de vectores estarán expresadas en esa base. Los vectores canónicos [...]]]></description>
				<content:encoded><![CDATA[<p>En la <a href="http://razonartificial.com/2010/11/geometria-espacial-vectore/">primera parte</a> empezamos a ver vectores y vimos algunas de sus características y usos. En esta segunda parte seguiremos profundizando el tema de vectores que es uno de los más importantes de la geometría espacial.</p>
<h2>Dependencia e independencia lineal de vectores</h2>
<p>Varios vectores se llaman linealmente  dependientes si alguno de ellos se puede poner como combinación lineal de los demás. En caso contrario se dirán que son linealmente independientes. En el último apartado del artículo anterior vimos cuando un vector es combinación lineal de otro.</p>
<h2>Base</h2>
<p>Tres vectores linealmente indendientes en <img src='http://s.wordpress.com/latex.php?latex=R%5E%7B3%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='R^{3}' title='R^{3}' class='latex' /> (En el espacio) forman una base. Si los vectores básicos son perpendiculares entre sí, se dice que la base es  ortogonal. Si además los vectores tienen módulo 1, se dice que la base es ortonormal.</p>
<p>Cuando hemos encontrado una base, cualquier vector de <img src='http://s.wordpress.com/latex.php?latex=R%5E%7B3%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='R^{3}' title='R^{3}' class='latex' /> (del espacio) se puede poner como combinación lineal de los vectores básicos, es decir, si <img src='http://s.wordpress.com/latex.php?latex=B%20%3D%20%28%5Cvec%7Be_1%7D%2C%20%5Cvec%7Be_2%7D%2C%20%5Cvec%7Be_3%7D%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='B = (\vec{e_1}, \vec{e_2}, \vec{e_3})' title='B = (\vec{e_1}, \vec{e_2}, \vec{e_3})' class='latex' /> es una base de <img src='http://s.wordpress.com/latex.php?latex=R%5E%7B3%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='R^{3}' title='R^{3}' class='latex' /> y <img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bv%7D%5Cin%7BR%5E%7B3%7D%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{v}\in{R^{3}}' title='\vec{v}\in{R^{3}}' class='latex' /> (el vector v pertenece al espacio) entonces <img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bv%7D%20%3D%20v_1%20%5Ccdot%20%5Cvec%7Be_1%7D%20%2B%20v_2%20%5Ccdot%20%5Cvec%7Be_2%7D%20%2B%20v_3%20%5Ccdot%20%5Cvec%7Be_3%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{v} = v_1 \cdot \vec{e_1} + v_2 \cdot \vec{e_2} + v_3 \cdot \vec{e_3}' title='\vec{v} = v_1 \cdot \vec{e_1} + v_2 \cdot \vec{e_2} + v_3 \cdot \vec{e_3}' class='latex' /></p>
<p>La terna <img src='http://s.wordpress.com/latex.php?latex=%28v_1%2C%20v_2%2C%20v_3%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='(v_1, v_2, v_3)' title='(v_1, v_2, v_3)' class='latex' /> se denomina coordenadas cartesianas de <img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bv%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{v}' title='\vec{v}' class='latex' /> respecto a la base B.</p>
<p>A partir de ahora tomaremos la base <img src='http://s.wordpress.com/latex.php?latex=B%20%3D%20%7B%5Cvec%7Bi%7D%2C%20%5Cvec%7Bj%7D%2C%20%5Cvec%7Bk%7D%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='B = {\vec{i}, \vec{j}, \vec{k}}' title='B = {\vec{i}, \vec{j}, \vec{k}}' class='latex' /> que es la base canónica de <img src='http://s.wordpress.com/latex.php?latex=R%5E3&#038;bg=T&#038;fg=000000&#038;s=0' alt='R^3' title='R^3' class='latex' /> y todas las coordenadas de vectores estarán expresadas en esa base.</p>
<p>Los vectores canónicos i, j y k se corresponden con los vectores <img src='http://s.wordpress.com/latex.php?latex=%281%2C%200%2C%200%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='(1, 0, 0)' title='(1, 0, 0)' class='latex' />, <img src='http://s.wordpress.com/latex.php?latex=%280%2C%201%2C%200%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='(0, 1, 0)' title='(0, 1, 0)' class='latex' /> y <img src='http://s.wordpress.com/latex.php?latex=%280%2C%200%2C%201%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='(0, 0, 1)' title='(0, 0, 1)' class='latex' /> respectivamente. Como vemos son 3 vectores de módulo uno en la dirección de los tres ejes, por lo tanto podemos representar fácilmente cualquier vector con esa base.</p>
<img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bv%7D%20%3D%202%5Cvec%7Bi%7D%20%2B%203%5Cvec%7Bj%7D%20%2B%202%5Cvec%7Bk%7D%20%3D%20%282%2C%203%2C%202%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{v} = 2\vec{i} + 3\vec{j} + 2\vec{k} = (2, 3, 2)' title='\vec{v} = 2\vec{i} + 3\vec{j} + 2\vec{k} = (2, 3, 2)' class='latex' />
<p>que se representaría de la siguiente manera.</p>
<h2><img class="aligncenter size-full wp-image-1024" title="canoni" src="http://razonartificial.com/wp-content/uploads/2010/11/canoni.png" alt="" width="374" height="285" />Operaciones con vectores cartesianamente</h2>
<p>Anteriormente vimos como hacer operaciones con vectores gráficamente, ahora vamos a ver como hacerlas por métodos matemáticos.</p>
<p>sean <img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bu%7D%20%3D%20%28u_1%2C%20u_2%2C%20u_3%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{u} = (u_1, u_2, u_3)' title='\vec{u} = (u_1, u_2, u_3)' class='latex' /> y <img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bv%7D%20%3D%20%28v_1%2C%20v_2%2C%20v_3%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{v} = (v_1, v_2, v_3)' title='\vec{v} = (v_1, v_2, v_3)' class='latex' /> dos vectores de <img src='http://s.wordpress.com/latex.php?latex=R%5E%7B3%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='R^{3}' title='R^{3}' class='latex' /> entonces:</p>
<ul>
<li><img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bu%7D%20%2B%20%5Cvec%7Bv%7D%20%3D%20%28u_1%20%2B%20v_1%2C%20u_2%20%2B%20v_2%2C%20u_3%2B%20v_3%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{u} + \vec{v} = (u_1 + v_1, u_2 + v_2, u_3+ v_3)' title='\vec{u} + \vec{v} = (u_1 + v_1, u_2 + v_2, u_3+ v_3)' class='latex' /></li>
<li><img src='http://s.wordpress.com/latex.php?latex=%5Clambda%20%5Ccdot%20%5Cvec%7Bu%7D%20%3D%20%28%5Clambda%20%5Ccdot%20u_1%20%2C%5Clambda%20%5Ccdot%20u_2%2C%5Clambda%20%5Ccdot%20u_3%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='\lambda \cdot \vec{u} = (\lambda \cdot u_1 ,\lambda \cdot u_2,\lambda \cdot u_3)' title='\lambda \cdot \vec{u} = (\lambda \cdot u_1 ,\lambda \cdot u_2,\lambda \cdot u_3)' class='latex' /></li>
</ul>
<h2>Determinación de un punto en el espacio</h2>
<p><img class="aligncenter size-full wp-image-1028" title="punto" src="http://razonartificial.com/wp-content/uploads/2010/11/punto.png" alt="" width="248" height="245" /></p>
<p class="advertencia">No debemos confundir punto con vector, aunque el punto y el vector tengan las mismas coordenadas como sucede en la imagen superior donde el punto P y el vector <img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bv%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{v}' title='\vec{v}' class='latex' /> tienen las mismas coordenadas.</p>
<h2>Coordenadas de un vector determinadas por dos puntos</h2>
<p>Sean los puntos <img src='http://s.wordpress.com/latex.php?latex=A%28a_1%2C%20a_2%2C%20a_3%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='A(a_1, a_2, a_3)' title='A(a_1, a_2, a_3)' class='latex' /> y <img src='http://s.wordpress.com/latex.php?latex=B%28b_1%2C%20b_2%2C%20b_3%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='B(b_1, b_2, b_3)' title='B(b_1, b_2, b_3)' class='latex' /> se define el vector formado por A y B como: <img src='http://s.wordpress.com/latex.php?latex=%5Coverrightarrow%7BAB%7D%20%3D%20%28b_1%20-%20a_1%2C%20b_2%20-%20a_2%2C%20b_3%20-%20a_3%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='\overrightarrow{AB} = (b_1 - a_1, b_2 - a_2, b_3 - a_3)' title='\overrightarrow{AB} = (b_1 - a_1, b_2 - a_2, b_3 - a_3)' class='latex' /></p>
<p>Por ahora esto que no es mucho, pero al principio puede ser denso. En el próximo artículo espero terminar con vectores y ya para el próximo empezar con el espacio afín que es cuando la cosa se pone interesante.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/11/geometria-espacial-vectore/" class="wp_rp_title">Geometría espacial. Vectores</a></li><li ><a href="http://razonartificial.com/2010/10/funcion-matematica/" class="wp_rp_title">Función matemática</a></li><li ><a href="http://razonartificial.com/2010/10/eje-cartesiano-y-punto/" class="wp_rp_title">El eje cartesiano y el punto</a></li><li ><a href="http://razonartificial.com/2010/10/funciones-de-segundo-grado/" class="wp_rp_title">Funciones de segundo Grado</a></li><li ><a href="http://razonartificial.com/2010/10/hablemos-de-fisica-y-matematicas/" class="wp_rp_title">Hablemos de física y matemáticas</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/gu5ECNRiE_g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/</feedburner:origLink></item>
		<item>
		<title>Tutorial XNA 1 – Preparándonos para trabajar</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/WBltUgsfII0/</link>
		<comments>http://razonartificial.com/2010/11/tutorial-xna-1-preparandonos-para-trabajar/#comments</comments>
		<pubDate>Sat, 06 Nov 2010 20:47:02 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1016</guid>
		<description><![CDATA[Bueno voy a empezar un pequeño tutorial de iniciación a XNA, en él pretendo realizar el clásico juego del Pong paso a paso para ver las cosas básicas y esenciales de XNA. ¿Qué es XNA? XNA es un Framework desarrollado por Microsoft para desarrollar videojuegos para las plataformas Windows, Xbox 360, Zune y Phone 7. Está desarrollado sobre la plataforma .NET y se programa usando el lenguaje C#. XNA nos provee de muchas clases y recursos que facilitan el desarrollo de videojuegos tanto en 2D como en 3D, ahorrandote toda la parte tediosa de la programación de videojuegos y dejando al programador la implementación y la creatividad. Requisitos del tutorial Tener un ordenador con una versión de Windows instalada. Conocimientos de C#. Si conoces otros lenguajes como C++ o Java aprender C# te llevará bastante poco, es un lenguaje sencillo y de alto nivel, pero muy potente. Instalando lo necesario Para desarrollar videojuegos en XNA necesitamos Visual C# 2010 Express, XNA Game Studio 4.0 y .NET Framework 4. Está son las últimas versiones a la hora de escribir este tutorial. Se puede conseguir todo el pack y algunos extras más de la siguiente url: http://create.msdn.com/en-us/home/getting_started Creando un proyecto Una vez [...]]]></description>
				<content:encoded><![CDATA[<p>Bueno voy a empezar un pequeño tutorial de iniciación a XNA, en él pretendo realizar el clásico juego del Pong paso a paso para ver las cosas básicas y esenciales de XNA.</p>
<p><img class="aligncenter size-full wp-image-1017" title="xnacapas" src="http://razonartificial.com/wp-content/uploads/2010/11/xnacapas.jpg" alt="" width="400" height="325" /></p>
<h2>¿Qué es XNA?</h2>
<p>XNA es un Framework desarrollado por Microsoft para desarrollar videojuegos para las plataformas Windows, Xbox 360, Zune y Phone 7. Está desarrollado sobre la plataforma .NET y se programa usando el lenguaje C#. XNA nos provee de muchas clases y recursos que facilitan el desarrollo de videojuegos tanto en 2D como en 3D, ahorrandote toda la parte tediosa de la programación de videojuegos y dejando al programador la implementación y la creatividad.</p>
<h2>Requisitos del tutorial</h2>
<ul>
<li>Tener un ordenador con una versión de Windows instalada.</li>
<li>Conocimientos de C#. Si conoces otros lenguajes como C++ o Java aprender C# te llevará bastante poco, es un lenguaje sencillo y de alto nivel, pero muy potente.</li>
</ul>
<h2>Instalando lo necesario</h2>
<p>Para desarrollar videojuegos en XNA necesitamos <strong>Visual C# 2010 Express</strong>, <strong>XNA Game Studio 4.0</strong> y <strong>.NET Framework 4</strong>. Está son las últimas versiones a la hora de escribir este tutorial. Se puede conseguir todo el pack y algunos extras más de la siguiente url: <a href="http://create.msdn.com/en-us/home/getting_started">http://create.msdn.com/en-us/home/getting_started</a></p>
<h2>Creando un proyecto</h2>
<p>Una vez todo instalado ya estamos listos para empezar a programar videojuegos usando XNA. Abrimos el <strong>Visual Studio</strong> y vamos a <strong>Archivo </strong>&#8211;&gt; <strong>Nuevo </strong>&#8211;&gt; <strong>Proyecto&#8230;</strong></p>
<p>Elegimos XNA Game Studio 4.0 en el menú de la izquierda y luego seleccionamos Windows Game (4.0) le ponemos un nombre al proyecto, en mi caso lo he llamado MiPong y le damos a aceptar.</p>
<p><a href="http://razonartificial.com/wp-content/uploads/2010/11/pong1.png"><img class="aligncenter size-medium wp-image-1018" title="pong1" src="http://razonartificial.com/wp-content/uploads/2010/11/pong1-300x207.png" alt="" width="300" height="207" /></a>Con esto ya tenemos nuestro proyecto creado, en el siguiente tutorial explicaremos los diferentes ficheros creados. Por ahora puedes pulsar <strong>F5 </strong> y debería ejecutarse nuestro juego que es una simple ventana con un fondo celeste. Felicidades, ya tienes iniciado tu primer juego en XNA.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/11/tutorial-xna-2-entendiendo-el-codigo/" class="wp_rp_title">Tutorial XNA 2 &#8211; Entendiendo el código</a></li><li ><a href="http://razonartificial.com/2010/11/cambio-hacia-xna/" class="wp_rp_title">Cambio hacia XNA</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li><li ><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" class="wp_rp_title">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li ><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" class="wp_rp_title">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/WBltUgsfII0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/11/tutorial-xna-1-preparandonos-para-trabajar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/11/tutorial-xna-1-preparandonos-para-trabajar/</feedburner:origLink></item>
		<item>
		<title>Cambio hacia XNA</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/TCN-qJQcLZs/</link>
		<comments>http://razonartificial.com/2010/11/cambio-hacia-xna/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 17:26:24 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1012</guid>
		<description><![CDATA[En el mundo del desarrollo de videojuegos siempre hay que estar avanzando y descubriendo nuevas tecnologías. Hace tiempo que quería mirarme bien el framework XNA de Microsoft. Este fin de semana he estado a fondo con él y me he enamorado. No sabía nada de el el viernes y hoy ya tengo hecho mi Pong clásico que suelo hacer al estilo Hola Mundo. A partir de ahora creo que trabajaré con el y publicaré algunas cosillas sobre XNA. Me gusta mucho Python y Pygame, pero lo cierto es que para videojuegos más allá que para una toma de contacto y empezar en el mundo no es muy útil ya que es algo limitado. He intentado analizar los pros y contras de Python+Pygame y C#+XNA y mis conclusiones son. Python + Pygame Ventajas Son libres. Son multiplataforma. Lenguaje y Biblioteca super sencilla. Muy recomendado para inciarse. Desventajas El soporte de gráficos por hardware es limitado, tira mucho de procesador. Python es un lenguaje interpretado, para juegos que requieran grandes cálculo eso se nota. Soporte solo para 2D. La gestión del sonido de Pygame es nefasta. Hay que usar bibliotecas adicionales. C# + XNA Ventajas C# es un lenguaje moderno y eficaz. [...]]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1013" title="xna-logo" src="http://razonartificial.com/wp-content/uploads/2010/11/xna-logo.png" alt="" width="296" height="196" />En el mundo del desarrollo de videojuegos siempre hay que estar avanzando y descubriendo nuevas tecnologías. Hace tiempo que quería mirarme bien el framework XNA de Microsoft. Este fin de semana he estado a fondo con él y me he enamorado. No sabía nada de el el viernes y hoy ya tengo hecho mi Pong clásico que suelo hacer al estilo Hola Mundo.</p>
<p>A partir de ahora creo que trabajaré con el y publicaré algunas cosillas sobre XNA. Me gusta mucho Python y Pygame, pero lo cierto es que para videojuegos más allá que para una toma de contacto y empezar en el mundo no es muy útil ya que es algo limitado. He intentado analizar los pros y contras de Python+Pygame y C#+XNA y mis conclusiones son.</p>
<h2>Python + Pygame</h2>
<h3>Ventajas</h3>
<ul>
<li>Son libres.</li>
<li>Son multiplataforma.</li>
<li>Lenguaje y Biblioteca super sencilla. Muy recomendado para inciarse.</li>
</ul>
<h3>Desventajas</h3>
<ul>
<li>El soporte de gráficos por hardware es limitado, tira mucho de procesador.</li>
<li>Python es un lenguaje interpretado, para juegos que requieran grandes cálculo eso se nota.</li>
<li>Soporte solo para 2D.</li>
<li>La gestión del sonido de Pygame es nefasta. Hay que usar bibliotecas adicionales.</li>
</ul>
<h2>C# + XNA</h2>
<h3>Ventajas</h3>
<ul>
<li>C# es un lenguaje moderno y eficaz. Hereda toda la potencia de C++, pero lo hace sencillo.</li>
<li>Tiene detrás toda la plataforma .NET que hace que tengas un mundo de posibilidades.</li>
<li>C# es un lenguaje compilado, por lo tanto más velocidad.</li>
<li>XNA tiene soporte para 2D y 3D.</li>
<li>El framework XNA construido sobre directX.</li>
<li>Fácil de aprender a usar, casi todo viene hecho. Es montar las piezas para hacer lo que tu quieres.</li>
<li>Puedes publicar tu juegos para Xbox 360 y Microsoft Phone.</li>
<li>Es gratuito. Tando C# express como XNA son gratuitos.</li>
</ul>
<h3>Desventajas</h3>
<ul>
<li>No es libre (XNA).</li>
<li>Soporta menos plataformas que Pygame(nada de Linux, ni Mac por ahora).</li>
</ul>
<p>Por tanto para mí la decisión es clara, me gusta el software libre y linux, pero en el mundo de los videojuegos si quieres dedicarte a eso no es el camino más óptimo actualmente. Así que bienvenido a XNA.</p>
<p>Intentaré terminar los tutoriales de Pygame que tengo a medias, no os los dejaré a la mitad.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/11/tutorial-xna-1-preparandonos-para-trabajar/" class="wp_rp_title">Tutorial XNA 1 – Preparándonos para trabajar</a></li><li ><a href="http://razonartificial.com/2010/11/tutorial-xna-2-entendiendo-el-codigo/" class="wp_rp_title">Tutorial XNA 2 &#8211; Entendiendo el código</a></li><li ><a href="http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/" class="wp_rp_title">Guía aprender programar videojuegos con C++</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" class="wp_rp_title">SFML &#8211; Instalación y configuración</a></li><li ><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" class="wp_rp_title">SFML &#8211; Manejando eventos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/TCN-qJQcLZs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/11/cambio-hacia-xna/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/11/cambio-hacia-xna/</feedburner:origLink></item>
		<item>
		<title>Geometría espacial. Vectores</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/UcLKIbrOWBU/</link>
		<comments>http://razonartificial.com/2010/11/geometria-espacial-vectore/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 01:38:43 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Matemáticas]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[Espacial]]></category>
		<category><![CDATA[Geometría]]></category>
		<category><![CDATA[Vectores]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=982</guid>
		<description><![CDATA[Este es el primero de unos cuantos artículos dirigidos a la geometría espacial. La geometría espacial está muy relacionada con los videojuegos y es esencial para el dedarrollo de juegos 3D. A lo largo de estos artículos estaremos situados en el espacio por los que las coordenadas de puntos y vectores serán de la forma . Doy por su puesto que se conoce el concepto de punto en el espacio y que situarlo viene dado por sus 3 coordenadas. Así que pasaré directamente a los vectores. Concepto de vector Un vector fijo es un segmento orientado que tiene su origen en el punto y su extremo en el punto . Un vector tiene 3 elementos: Dirección: Es la recta en la que está apoyada la flecha. Sentido: Es el que viene indicado por la flecha, hacia donde va. Módulo: Es la longitud del vector. Cálculo del módulo Para calcular el módulo del vector vamos a verlo con un ejemplo, para simplificar vamos a situarlo en el plano y no en el espacio, es decir, dos coordenadas solamente , pero se aplica el mismo principio al espacio. Tenemos el vector que tiene su origen en el punto ﻿ y su extremo en . [...]]]></description>
				<content:encoded><![CDATA[<p>Este es el primero de unos cuantos artículos dirigidos a la geometría espacial. La geometría espacial está muy relacionada con los videojuegos y es esencial para el dedarrollo de juegos 3D.</p>
<p>A lo largo de estos artículos estaremos situados en el espacio <img src='http://s.wordpress.com/latex.php?latex=R%5E%7B3%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='R^{3}' title='R^{3}' class='latex' /> por los que las coordenadas de puntos y vectores serán de la forma <img src='http://s.wordpress.com/latex.php?latex=%28x%2C%20y%2C%20z%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='(x, y, z)' title='(x, y, z)' class='latex' />.</p>
<p>Doy por su puesto que se conoce el concepto de punto en el espacio y que situarlo viene dado por sus 3 coordenadas. Así que pasaré directamente a los vectores.</p>
<h2>Concepto de vector</h2>
<p>Un vector fijo <img src='http://s.wordpress.com/latex.php?latex=%5Coverrightarrow%7BAB%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\overrightarrow{AB}' title='\overrightarrow{AB}' class='latex' /> es un segmento orientado que tiene su origen en el punto <img src='http://s.wordpress.com/latex.php?latex=A&#038;bg=T&#038;fg=000000&#038;s=0' alt='A' title='A' class='latex' /> y su extremo en el punto <img src='http://s.wordpress.com/latex.php?latex=B&#038;bg=T&#038;fg=000000&#038;s=0' alt='B' title='B' class='latex' />.</p>
<p><img class="aligncenter size-full wp-image-985" title="vec1" src="http://razonartificial.com/wp-content/uploads/2010/11/vec1.png" alt="" width="222" height="200" />Un vector tiene 3 elementos:</p>
<ul>
<li><strong>Dirección:</strong> Es la recta en la que está apoyada la flecha.</li>
<li><strong>Sentido:</strong> Es el que viene indicado por la flecha, hacia donde va.</li>
<li><strong>Módulo:</strong> Es la longitud del vector.</li>
</ul>
<h3>Cálculo del módulo</h3>
<p>Para calcular el módulo del vector vamos a verlo con un ejemplo, para simplificar vamos a situarlo en el plano y no en el espacio, es decir, dos coordenadas solamente <img src='http://s.wordpress.com/latex.php?latex=%28x%2C%20y%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='(x, y)' title='(x, y)' class='latex' />, pero se aplica el mismo principio al espacio. Tenemos el vector que tiene su origen en el punto ﻿<img src='http://s.wordpress.com/latex.php?latex=A%282%2C%203%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='A(2, 3)' title='A(2, 3)' class='latex' /> y su extremo en <img src='http://s.wordpress.com/latex.php?latex=B%286%2C%206%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='B(6, 6)' title='B(6, 6)' class='latex' />. Pues bien, trazando la distancia que hay desde ﻿<img src='http://s.wordpress.com/latex.php?latex=A_x&#038;bg=T&#038;fg=000000&#038;s=0' alt='A_x' title='A_x' class='latex' /> hasta <img src='http://s.wordpress.com/latex.php?latex=B_x&#038;bg=T&#038;fg=000000&#038;s=0' alt='B_x' title='B_x' class='latex' /> y desde <img src='http://s.wordpress.com/latex.php?latex=A_y&#038;bg=T&#038;fg=000000&#038;s=0' alt='A_y' title='A_y' class='latex' /> a <img src='http://s.wordpress.com/latex.php?latex=B_y&#038;bg=T&#038;fg=000000&#038;s=0' alt='B_y' title='B_y' class='latex' /> tenemos lo siguiente.</p>
<p><img class="aligncenter size-full wp-image-987" title="modulo" src="http://razonartificial.com/wp-content/uploads/2010/11/modulo.png" alt="" width="222" height="200" />Con esto se nos forma un triángulo rectángulo en el que la incógnita es el buscado módulo, siguiendo el teorema de pitágoras sabemos que.</p>
<p><img src='http://s.wordpress.com/latex.php?latex=h%5E%7B2%7D%3D%20a%5E%7B2%7D%2Bb%5E%7B2%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='h^{2}= a^{2}+b^{2}' title='h^{2}= a^{2}+b^{2}' class='latex' /><br />
<br />
<img src='http://s.wordpress.com/latex.php?latex=%5Cleft%20%7Ch%5Cright%20%7C%3D%5Csqrt%7Ba%5E%7B2%7D%2Bb%5E%7B2%7D%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\left |h\right |=\sqrt{a^{2}+b^{2}}' title='\left |h\right |=\sqrt{a^{2}+b^{2}}' class='latex' /></p>
<p class="advertencia">Las Barras de la h significan valor absoluto, quiere decir que el valor que nos de, si sale negativo, debemos cambiar el signo siempre a positivo. Esto es así porque estamos calculando un módulo que es una distancia y las distancias nunca pueden ser negativas.</p>
<p>Bien aplicada a nuestra ecuación, la h quedaría de la siguiente manera.</p>
<img src='http://s.wordpress.com/latex.php?latex=%5Cleft%20%7Ch%5Cright%20%7C%3D%5Csqrt%7B%28B_x-A_x%29%5E%7B2%7D%2B%28B_y-A_y%29%5E%7B2%7D%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\left |h\right |=\sqrt{(B_x-A_x)^{2}+(B_y-A_y)^{2}}' title='\left |h\right |=\sqrt{(B_x-A_x)^{2}+(B_y-A_y)^{2}}' class='latex' />
<p>Sustituyendo valores nos queda:</p>
<p><img src='http://s.wordpress.com/latex.php?latex=%5Cleft%20%7Ch%5Cright%20%7C%3D%5Csqrt%7B%286-2%29%5E%7B2%7D%2B%286-3%29%5E%7B2%7D%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\left |h\right |=\sqrt{(6-2)^{2}+(6-3)^{2}}' title='\left |h\right |=\sqrt{(6-2)^{2}+(6-3)^{2}}' class='latex' /><br />
<br />
<img src='http://s.wordpress.com/latex.php?latex=%5Cleft%20%7Ch%5Cright%20%7C%3D%5Csqrt%7B16%2B9%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\left |h\right |=\sqrt{16+9}' title='\left |h\right |=\sqrt{16+9}' class='latex' /><br />
<br />
<img src='http://s.wordpress.com/latex.php?latex=%5Cleft%20%7Ch%5Cright%20%7C%3D%5Csqrt%7B25%7D%3D5&#038;bg=T&#038;fg=000000&#038;s=0' alt='\left |h\right |=\sqrt{25}=5' title='\left |h\right |=\sqrt{25}=5' class='latex' /></p>
<p>Por lo tanto ya tenemos la manera de hallar el módulo de un vector, a modo simplificado solo hay que saber que el módulo equivale a la raiz cuadrada de la suma de sus coordenadas al cuadrado, pero siempre es bueno saber de donde sale la formula.</p>
<h3>Equipolencia de los vectores</h3>
<p>Dos vectores no nulos son equivalente si tienen igual módulo dirección y sentido.</p>
<h3>Vectores libres</h3>
<p>A un representante de todos los vectores equipolentes a uno dado, se le llama vector libre. Se designan por <img src='http://s.wordpress.com/latex.php?latex=%5Coverrightarrow%7BAB%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\overrightarrow{AB}' title='\overrightarrow{AB}' class='latex' /> o simplemente por una letra minúscula, por ejemplo <img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bu%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{u}' title='\vec{u}' class='latex' /></p>
<p><img src="http://razonartificial.com/wp-content/uploads/2010/11/vec_libre.png" alt="" title="vec_libre" width="614" height="158" class="aligncenter size-full wp-image-994" /></p>
<h2>Operaciones con vectores</h2>
<p>Producto de un vector por un escalar:</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2010/11/vec_escalar.png" alt="" title="vec_escalar" width="542" height="155" class="aligncenter size-full wp-image-998" /></p>
<p>Suma de vectores:</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2010/11/vec_suma.png" alt="" title="vec_suma" width="600" height="273" class="aligncenter size-full wp-image-996" /></p>
<h2>Combinación lineal de vectores</h2>
<p>Dados varios vectores <img src='http://s.wordpress.com/latex.php?latex=%5Cvec%7Bx%7D%2C%20%5Cvec%7By%7D%2C%20%5Cvec%7Bz%7D%2C%20%5Ccdot%5Ccdot%5Ccdot%2C%20%5Cvec%7Bw%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='\vec{x}, \vec{y}, \vec{z}, \cdot\cdot\cdot, \vec{w}' title='\vec{x}, \vec{y}, \vec{z}, \cdot\cdot\cdot, \vec{w}' class='latex' /> y varios números reales <img src='http://s.wordpress.com/latex.php?latex=a%2C%20b%2C%20c%2C%20%5Ccdot%5Ccdot%5Ccdot%2C%20t&#038;bg=T&#038;fg=000000&#038;s=0' alt='a, b, c, \cdot\cdot\cdot, t' title='a, b, c, \cdot\cdot\cdot, t' class='latex' /> la expresión <img src='http://s.wordpress.com/latex.php?latex=a%5Cvec%7Bx%7D%2Bb%5Cvec%7By%7D%2Bc%5Cvec%7Bz%7D%2B%5Ccdot%5Ccdot%5Ccdot%2Bt%5Cvec%7Bw%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='a\vec{x}+b\vec{y}+c\vec{z}+\cdot\cdot\cdot+t\vec{w}' title='a\vec{x}+b\vec{y}+c\vec{z}+\cdot\cdot\cdot+t\vec{w}' class='latex' /> se llama combinación lineal de los vectores.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2010/11/comb_lineak.png" alt="" title="comb_lineak" width="270" height="262" class="aligncenter size-full wp-image-1006" /></p>
<p>Está es la primera parte acerca de vectores, en el siguiente artículo seguiremos hablando de vectores y ya puede que en el siguiente entremos en materia más interesante.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/" class="wp_rp_title">Geometría espacial. Vectores II</a></li><li ><a href="http://razonartificial.com/2010/10/eje-cartesiano-y-punto/" class="wp_rp_title">El eje cartesiano y el punto</a></li><li ><a href="http://razonartificial.com/2010/10/funcion-matematica/" class="wp_rp_title">Función matemática</a></li><li ><a href="http://razonartificial.com/2010/10/funciones-de-segundo-grado/" class="wp_rp_title">Funciones de segundo Grado</a></li><li ><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" class="wp_rp_title">Gran Pack de desarrollo de videojuegos</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/UcLKIbrOWBU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/11/geometria-espacial-vectore/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/11/geometria-espacial-vectore/</feedburner:origLink></item>
		<item>
		<title>IA en videojuegos – Persiguiendo y evadiendo II</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/NJm9908Kdt0/</link>
		<comments>http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 21:44:47 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Teoría]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=972</guid>
		<description><![CDATA[En la primera parte vimos un algoritmo de persecución y evasión bastante simple, pero efectivo. En este artículo vamos a ver otro que es algo mejor que el anterior. Persiguiendo en la línea de visión Este algoritmo consiste en que el depredador persigue a la presa en línea recta desde su posición hasta la presa. En teoría el movimiento en línea recta es el camino mas corto entre dos puntos, a menos que haya obstáculos o que la presa esté en movimiento. Si hay obstáculos no es tema de este artículo pues necesitamos combinarlo con un algoritmo de pathfinding, sin embargo, si la presa está en movimiento el algoritmo también es válido, solo que debemos calcular la línea recta en cada interacción del bucle, haciendo que aunque nos movamos en línea recta, al cambiar la dirección de la recta podamos trazar un camino curvo, esté algoritmo es más eficiente que el anterior. En la imagen anterior supongamos que el círculo es el depredador y la presa es el cuadrado, que está quieta. Los diferentes círculos son las posiciones del depredador en diferentes periodos de tiempo, en los que calcula una nueva recta hacia la presa, como la presa está estática [...]]]></description>
				<content:encoded><![CDATA[<p>En la <a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/">primera parte</a> vimos un algoritmo de persecución y evasión bastante simple, pero efectivo. En este artículo vamos a ver otro que es algo mejor que el anterior.</p>
<h2>Persiguiendo en la línea de visión</h2>
<p>Este algoritmo consiste en que el depredador persigue a la presa en línea recta desde su posición hasta la presa. En teoría el movimiento en línea recta es el camino mas corto entre dos puntos, a menos que haya obstáculos o que la presa esté en movimiento. Si hay obstáculos no es tema de este artículo pues necesitamos combinarlo con un algoritmo de pathfinding, sin embargo, si la presa está en movimiento el algoritmo también es válido, solo que debemos calcular la línea recta en cada interacción del bucle, haciendo que aunque nos movamos en línea recta, al cambiar la dirección de la recta podamos trazar un camino curvo, esté algoritmo es más eficiente que el anterior.</p>
<p><img class="aligncenter size-full wp-image-973" title="ch02_fig02" src="http://razonartificial.com/wp-content/uploads/2010/10/ch02_fig02.jpg" alt="" width="106" height="158" />En la imagen anterior supongamos que el círculo es el depredador y la presa es el cuadrado, que está quieta. Los diferentes círculos son las posiciones del depredador en diferentes periodos de tiempo, en los que calcula una nueva recta hacia la presa, como la presa está estática es siempre la misma recta la que debe seguir el depredador.</p>
<p>Vamos a ver dos versiones de este algoritmo una para juegos basados en tiles y otra para espacios continuos.</p>
<h3>Línea de visión para juegos basados en tiles</h3>
<p>Como dijimos en el articulo anterior los juegos basados en tiles se dividen en casillas. Esto crea una limitación de movimiento que no se aplica a los entornos continuos. En los entornos continuos, las posiciones por lo general se representan con variables en punto flotante. Esas posiciones se asignan a los píxeles de la pantalla más cercanos. Al cambiar de posición en un entorno continuo puedes saltarte algunos píxeles ya que suelen ser lo suficientemente pequeños como para que el movimiento sea fluido y no se noten los saltos de uno a otro.</p>
<p>En los juegos basados en tiles, sin embargo, el cambio de posiciones es más restrictivo. Por su propia naturaleza, el movimiento los movimientos son más dentados y cuadriculados. Si tenemos que nuestros tiles son cuadrados tendremos 8 posibles direcciones a las que movernos.</p>
<p><img class="aligncenter size-full wp-image-974" title="ch02_fig03" src="http://razonartificial.com/wp-content/uploads/2010/10/ch02_fig03.jpg" alt="" width="540" height="360" />Como vemos en la imagen ninguna de las 8 direcciones está en línea recta entre el perseguidor y la presa matemáticamente hablando. Esto nos crea un dilema, como movernos en línea recta si no hay línea recta directa entre las casillas.</p>
<p>Lo que necesitamos es una manera de determinar a cuál de las ocho casillas adyacentes hay que trasladarse con el fin de que el depredador avance a la presa en línea recta.</p>
<p>Como mostramos anteriormente, podemos utilizar el algoritmo de persecución simple. Se calculará la ruta más corta posible para el depredador. Así que, ¿Cual es el problema? La estética, me explico. Cuando trabajamos con tiles el método de persecución simple si siempre produce una línea visual directa, veámoslo con una imagen.</p>
<p><img class="aligncenter size-full wp-image-975" title="ch02_fig04" src="http://razonartificial.com/wp-content/uploads/2010/10/ch02_fig04.jpg" alt="" width="311" height="145" /></p>
<p>Como podemos ver la primera imagen la produce un algoritmo de persecución simple que ya hemos visto. Va moviendo las coordenadas x e y de manera que se acercan a la presa. Cuando la coordenada x coincide con la de la presa pasa a moverse en la coordenada y solamente hasta que también coincide por lo que ha alcanzado a la presa. Sin embargo, podemos ver que no es el camino más directo, como podemos ver el camino de la imagen de la derecha es mucho más directo hacia el objetivo. Cabe destacar que la distancia recorrida es la misma, 8 tiles en este caso, pero el segundo es mucho más natural el movimiento.</p>
<p>Otro problema sería que si en vez de uno tenemos varios perseguidores, llegados a un punto puede que todos estén en la misma coordenada y avanzando en línea hacia la presa, lo que queda algo antiestético, mejor que todos desde su posición avancen en línea recta hacia el objetivo.</p>
<p>El enfoque que vamos a tomar para resolver el problema consiste en utilizar un algoritmo para generar una línea entre los dos puntos que normalmente se utiliza en entornos de píxeles. Así que vamos a tratar nuestro mapa como si los diferentes tiles fueran píxeles gigantes y los cuadros que pasen por esa línea será la ruta que tomara nuestro depredador.</p>
<p>Por tanto el modo de hacer es trazar una línea entre el punto de origen (posición del depredador) y el punto destino (posición de la presa). Luego calculamos los puntos por los que pasa la recta y ya tendríamos los cuadros, por los que pasaría nuestro personaje, pero hay algo más. Hay varias maneras de calcular los puntos por los que pasa una recta, nosotros vamos a usar el algoritmo de Bresenham. Este algoritmo es uno de los más eficientes para dibujar líneas en entornos basados en píxeles. Este algoritmo es ideal porque a diferencia de otros algoritmos no dibuja dos puntos adyacentes en el eje más corto. Veámos.</p>
<p><img class="aligncenter size-full wp-image-976" title="ch02_fig05" src="http://razonartificial.com/wp-content/uploads/2010/10/ch02_fig05.jpg" alt="" width="239" height="226" /></p>
<p>A la derecha podemos ver los puntos que dibujarían otros algoritmos, es decir, todos los cuadros por los que pasa la recta. Sin embargo como vemos, ese camino no es el más corto ni el más eficiente. Sin embargo a la derecha podemos ver los puntos por los puntos que dibujaría en algoritmo Bresenham. Como vemos no dibuja dos puntos adyacentes en el eje más corto (en este caso el eje x) Obteniendo así un camino directo y optimizado. Creo que se puede ver claramente como el camino de la izquierda es mucho más corto que el de la derecha.</p>
<p>El algoritmo de Bresenham no es nada complicado, pero puede ser lioso porque hay que detectar cual es el punto más a la izquierda y cual más a la derecha. En <a href="http://www.nosolounix.com/2010/05/algoritmo-bresenham-dibujar-linea.html">este artículo</a> podéis ver la explicación del algoritmo, y una implementación en C, tiene la explicación del algoritmo, pero da por supuesto que el eje corto es el x y no el y. Sin embargo en <a href="http://galia.fc.uaslp.mx/~medellin/Applets/LineasRectas/Recta.htm">este otro artículo</a> al final del mismo encontré una implementación generalizada para dos puntos cuales quieras. He hecho una traducción a Python del programa.</p>
<pre class="brush: python; title: ; notranslate">
class Punto:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
        
    def __str__(self):
        return &quot;(&quot; + str(self.x) + &quot;, &quot; + str(self.y) + &quot;)&quot;
        

def linea(p1, p2):
    puntos = []
    dx = (p2.x - p1.x)
    dy = (p2.y - p1.y)
    
    # Determinar que punto usar para empezar y cual para terminar.
    if dy &lt; 0:
        dy = -dy
        stepy = -1
    else:
        stepy = 1
    if dx &lt; 0:
        dx = -dx
        stepx = -1
    else:
        stepx = 1
    x = p1.x
    y = p1.y
    
    # Bucle hasta llegar al otro extremo de la linea.
    if dx &gt; dy:
        p = 2*dy-dx
        while x != p2.x:
            x += stepx
            if p &lt; 0:
                p += 2*dy
            else:
                y += stepy
                p += 2*(dy-dx)
            puntos.append(Punto(x, y))
    else:
        p = 2*dx-dy
        while y != p2.y:
            y = y + stepy
            if p &lt; 0:
                p += 2*dx
            else:
                x += stepx
                p += 2*(dx-dy)
            puntos.append(Punto(x, y))
    return puntos
            

p = Punto(2, 3)
q = Punto(9, 6)
puntos = linea(p, q)
for i in range(len(puntos)):
    print puntos[i]
</pre>
<p>Esto es un programa de prueba que lo implementa, imprimiendo en pantalla los puntos por los que pasaría. He creado una clase punto para manejarlos más fácil, pero el algoritmo en sí está en la función línea que devuelve la lista de puntos que tendría que tomar el depredador.</p>
<p>Ojo, si la presa se mueve de su posición habría que calcular de nuevo las posiciones a moverse, por lo que si la presa está en movimiento hay que calcular en cada bucle la nueva línea, si sabes que la presa se va a mover sí o sí en la siguiente interacción optimizar el algoritmo para que no calcule toda la lista y solo calcule la siguiente posición.</p>
<p>El resultado sería como el siguiente.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2010/10/ch02_fig06.jpg" alt="" title="ch02_fig06" width="540" height="360" class="aligncenter size-full wp-image-977" /></p>
<p>Como vemos es un camino mucho más natural y estético, haciendo que las persecuciones sean más inteligentes y realistas. En el próximo artículo veremos el problema en juegos sin tiles, es decir, de espacios continuos con coordenadas en coma flotante.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" class="wp_rp_title">Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</a></li><li ><a href="http://razonartificial.com/2010/03/a-pathfinding-camino-optimo/" class="wp_rp_title">A* Pathfinding. Camino óptimo</a></li><li ><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" class="wp_rp_title">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li ><a href="http://razonartificial.com/2010/01/optimizacion-basada-en-colonias-de-hormigas-en-la-naturaleza/" class="wp_rp_title">Optimización basada en colonias de hormigas</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/NJm9908Kdt0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/</feedburner:origLink></item>
		<item>
		<title>IA en videojuegos – Persiguiendo y evadiendo I</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/xayFgEiw2eA/</link>
		<comments>http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 21:14:36 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Algoritmos genéticos]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Teoría]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=962</guid>
		<description><![CDATA[En este artículo nos centraremos en el problema omnipresente de la persecución y la evasión. Ya sea que esté desarrollando un juego de acción espacial, una simulación, estrategia o un juego de rol, es probable que necesites que los personajes no jugadores de la IA tengan que perseguir o huir del jugador. En un juego arcade la situación podría implicar tener naves enemigas que deben perseguir o evadir al jugador o un misil guiado que debe acabar con nosotros. En cualquier caso, necesitas una cierta lógica que permite a los depredadores no jugadores cazar y a sus presas, correr. El problema de perseguir/evadir consta de dos partes. La primera parte consiste en la decisión de iniciar una persecución o una evasión. La segunda parte consiste en efectuar la persecución o la evasión, es decir, ser depredador o presa. Se podría decir que el problema contiene un tercer elemento: Evitar obstáculos. Tener que evitar obstáculos mientras se persigue o se huye definitivamente complica mucho las cosas, por lo que los algoritmos serán más difíciles de programar. En este artículo no nos centraremos en evitar obstáculos, pero ya hemos visto en el blog varios artículos de pathfinding para evitar obstáculos y en [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://razonartificial.com/wp-content/uploads/2010/10/Tiger_chasing_a_deer.jpg"><img class="size-full wp-image-965 imageborder alignright" title="Tiger_chasing_a_deer" src="http://razonartificial.com/wp-content/uploads/2010/10/Tiger_chasing_a_deer.jpg" alt="" width="400" height="286" /></a></p>
<p>En este artículo nos centraremos en el problema omnipresente de la persecución y la evasión. Ya sea que esté desarrollando un juego de acción espacial, una simulación, estrategia o un juego de rol, es probable que necesites que los personajes no jugadores de la IA tengan que perseguir o huir del jugador. En un juego arcade la situación podría implicar tener naves enemigas que deben perseguir o evadir al jugador o un misil guiado que debe acabar con nosotros. En cualquier caso, necesitas una cierta lógica que permite a los depredadores no jugadores cazar y a sus presas, correr.</p>
<p>El problema de perseguir/evadir consta de dos partes. La primera parte consiste en la decisión de iniciar una persecución o una evasión. La segunda parte consiste en efectuar la persecución o la evasión, es decir, ser depredador  o presa. Se podría decir que el problema contiene un tercer elemento: Evitar obstáculos. Tener que evitar obstáculos mientras se persigue o se huye definitivamente complica mucho las cosas, por lo que los algoritmos serán más difíciles de programar. En este artículo no nos centraremos en evitar obstáculos, pero ya hemos visto en el blog varios artículos de pathfinding para evitar obstáculos y en próximos artículos veremos como combinarlos con la persecución y la huida. De la primera parte entra en la toma de decisiones que veremos en futuros artículos cuando tratemos las maquinas de estados finitos y las redes neuronales. Por tanto en este artículo nos centraremos en la parte central del problema que es la persecución o la huida en sí misma.</p>
<p>La forma más simple y el método más común de programar una persecución consiste en actualizar las coordenadas del perseguidor (lo llamaremos depredador) en cada bucle del juego tal que las coordenadas que separan a depredador y presa sean cada vez menores. Este algoritmo no presta atención ni a la velocidad ni a la dirección de la presa y el depredador. Este método es eficaz si el depredador se mueve constante y en la misma dirección y no hay obstáculos, pero tiene sus limitaciones, como veremos.</p>
<p>Este método como vemos es muy básico, hay otros métodos que seguramente te resulten más útiles que junto con un motor de física se pueden combinar para tener en cuenta distancia y velocidades de depredador y presa. En los que el depredador podría tratar de interceptar a su presa y no solo perseguirla. En este caso, la información de posición y velocidad relativa puede utilizarse como entrada para un algoritmo que determinará la actuación adecuada: la dirección de la fuerza, por ejemplo, para guiar al depredador a su destino.</p>
<p>En este artículo vamos a ver varios métodos de persecución y evasión empezando por los métodos más básicos.</p>
<h2>Persecución y evasión básica</h2>
<p>El método más básico consiste, como ya dijimos, en comprobar las coordenadas de la presa y en función de ella mover nuestras coordenadas, para la evasión es lo mismo, pero hacer justo lo contrario alejarnos lo más posible.</p>
<pre class="brush: python; title: ; notranslate">
if depredador_x &gt; presa_x:
    depredador_x -= 1
elif: depredador_x &lt; presa_x:
    depredador_x += 1

if depredador_y &gt; presa_y:
    depredador_x -= 1
elif: depredador_y &lt; presa_y:
    depredador_y += 1
</pre>
<p>Como vemos en el código comprobamos si la coordenada x del depredador es mayor que la coordenada x de la presa en cuyo caso disminuimos la coordenada x del depredador con el fin de acercarlo a la presa, si por el contrario la coordenada x es menor a la de la presa lo que hacemos es aumentarla. Lo mismo se aplica a la coordenada y.</p>
<p>Para la evasión es lo mismo, pero si la coordenada x de la presa es mayor que la coordenada x del depredador pues lo que hacemos es seguir aumentándola con el fin de alejarnos.</p>
<pre class="brush: python; title: ; notranslate">
if presa_x &gt; depredador_x:
    presa_x += 1
elif: presa_x &lt; depredador_x:
    presa_x -= 1

if presa_y &gt; depredador_y:
    presa_y += 1
elif: presa_y &lt; depredador_y:
    presa_y -= 1
</pre>
<p>Podemos ver que si las velocidades del depredador y la presa son las mismas y ambas se mueven en una unidad por ciclo de juego como en el ejemplo, la distancia entre ambas va a permanecer constante, el depredador deberá tener algo más de velocidad con este método si quiere alcanzar a la presa.</p>
<p>En juegos basados en tiles el mapa esta dividido en celdas que pueden ser cuadrados, hexágonos, etc. y la posición del jugador está limitada a una de estas celdas. El moviento de jugador está limitado a estos tiles, normalmente a los tiles adyacentes. En un entorno continuo viene dado por un punto con coordenadas x e y normalmente en coma flotante y puede moverse en cualquier dirección.</p>
<p>El enfoque anterior es válido tanto para un método como para otro, pues en vez de coordenadas x e y usaremos filas y columnas. Veamos un ejemplo.</p>
<pre class="brush: python; title: ; notranslate">
if depredador_col &gt; presa_col:
    depredador_col -= 1
elif: depredador_col &lt; presa_col:
    depredador_col += 1

if depredador_fil &gt; presa_fil:
    depredador_col -= 1
elif: depredador_fil &lt; presa_fil:
    depredador_fil += 1
</pre>
<p>Podemos ver como solo necesitamos cambiar las referencias a las coordenadas del punto por las filas y columnas y el algoritmo es perfectamente válido.</p>
<p><img class="aligncenter size-full wp-image-963" title="ch02_fig01" src="http://razonartificial.com/wp-content/uploads/2010/10/ch02_fig01.jpg" alt="" width="540" height="360" /></p>
<p>En la imagen podemos ver como sería la persecución en un mapa basado en tiles.</p>
<p class="advertencia">Cuidado con los movimientos diagonales en juegos basados en tiles, pongamos que tenemos tiles de 32&#215;32 píxeles, el movimiento de un tile a otro en horizontal o vertical sería de exactamente 32 píxeles, pero el movimiento en diagonal seria: sqrt(25²+25²) Es decir, la raiz cuadrada de los lados al cuadrado, que es la diagonal de un tile que nos daría aproximadamente 35.35 por tanto el movimiento en diagonal debería penalizarse más.</p>
<p>En la segunda parte veremos métodos más avanzados, de momento esto nos sirve como introducción al tema.</p>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/10/introduccion-a-la-ia-en-los-juegos/" class="wp_rp_title">Introducción a la IA en los juegos</a></li><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li ><a href="http://razonartificial.com/2010/10/tecnicas-de-ia-en-los-videojuegos/" class="wp_rp_title">Técnicas de IA en los videojuegos</a></li><li ><a href="http://razonartificial.com/2010/08/algoritmo-minimax-un-jugador-incansable/" class="wp_rp_title">Algoritmo Minimax, un jugador incansable</a></li><li ><a href="http://razonartificial.com/2010/08/la-inteligencia-artificial-de-l4d/" class="wp_rp_title">La Inteligencia Artificial de L4D</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/xayFgEiw2eA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/</feedburner:origLink></item>
		<item>
		<title>Técnicas de IA en los videojuegos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/UfQFP7y8mGg/</link>
		<comments>http://razonartificial.com/2010/10/tecnicas-de-ia-en-los-videojuegos/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 19:11:40 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Teoría]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=954</guid>
		<description><![CDATA[En el artículo anterior vimos una introducción a la diferentes técnicas de inteligencia artificial aplicadas a los videojuegos y en sucesivos artículos intentaremos tratar cada uno de estos temas más a fondo, pero he encontrado un pdf bastante completo que explica las bases de todas estas técnicas y que puede servir como complemente al artículo de introducción anterior. En el explica los algoritmos de IA más comunes separándolos en básicos y avanzado, anteriormente nosotros a estos dos grupos los llamamos IA Débil e IA Fuerte, se trata de los mismos conceptos. Dejo el pdf para descargar. No puedo poner la fuente, porque no la tengo. Descargar Técnicas de ia en los videojuegos IA en videojuegos &#8211; Persiguiendo y evadiendo IIntroducción a la IA en los juegosIA en videojuegos &#8211; Persiguiendo y evadiendo IISobre la IA de los videojuegosLa Inteligencia Artificial de L4DZemanta]]></description>
				<content:encoded><![CDATA[<p><a href="http://razonartificial.com/wp-content/uploads/2010/01/ia-150x150.jpg"><img class="alignright size-full wp-image-13 imageborder" title="ia-150x150" src="http://razonartificial.com/wp-content/uploads/2010/01/ia-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>En el <a href="http://razonartificial.com/2010/10/introduccion-a-la-ia-en-los-juegos/">artículo anterior</a> vimos una introducción a la diferentes técnicas de inteligencia artificial aplicadas a los videojuegos y en sucesivos artículos intentaremos tratar cada uno de estos temas más a fondo, pero he encontrado un pdf bastante completo que explica las bases de todas estas técnicas y que puede servir como complemente al artículo de introducción anterior.</p>
<p>En el explica los algoritmos de IA más comunes separándolos en básicos y avanzado, anteriormente nosotros a estos dos grupos los llamamos IA Débil e IA Fuerte, se trata de los mismos conceptos. Dejo el pdf para descargar. No puedo poner la fuente, porque no la tengo.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/10/tecnicas_ia.pdf">Descargar Técnicas de ia en los videojuegos</a></li>
</ul>

<div class="wp_rp_wrap  wp_rp_plain" ><div class="wp_rp_content"><ul class="related_post wp_rp" style="visibility: visible"><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li ><a href="http://razonartificial.com/2010/10/introduccion-a-la-ia-en-los-juegos/" class="wp_rp_title">Introducción a la IA en los juegos</a></li><li ><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" class="wp_rp_title">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li ><a href="http://razonartificial.com/2010/12/sobre-la-ia-de-los-videojuegos/" class="wp_rp_title">Sobre la IA de los videojuegos</a></li><li ><a href="http://razonartificial.com/2010/08/la-inteligencia-artificial-de-l4d/" class="wp_rp_title">La Inteligencia Artificial de L4D</a></li></ul><div class="wp_rp_footer"><a class="wp_rp_backlink" target="_blank" href="http://www.zemanta.com/?wp-related-posts">Zemanta</a></div></div></div>
<img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/UfQFP7y8mGg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/tecnicas-de-ia-en-los-videojuegos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/tecnicas-de-ia-en-los-videojuegos/</feedburner:origLink></item>
	</channel>
</rss><!-- This Quick Cache file was built for (  razonartificial.com/feed/ ) in 5.14719 seconds, on May 19th, 2013 at 3:12 pm UTC. --><!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 19th, 2013 at 4:12 pm UTC --><!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --><!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  razonartificial.com/feed/ ) in 0.01176 seconds, on May 19th, 2013 at 3:47 pm UTC. -->
