<?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>Wed, 14 Mar 2012 15:42:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</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>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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo II">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li><li><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" title="SFML &#8211; Abriendo una ventana">SFML &#8211; Abriendo una ventana</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/gcliIpj2OIHG43dwUmFIHx1nElA/0/da"><img src="http://feedads.g.doubleclick.net/~a/gcliIpj2OIHG43dwUmFIHx1nElA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/gcliIpj2OIHG43dwUmFIHx1nElA/1/da"><img src="http://feedads.g.doubleclick.net/~a/gcliIpj2OIHG43dwUmFIHx1nElA/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" title="[BGE] La clase App">[BGE] La clase App</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/EvlrzEpmddNV2zeB7IVGGgrwD1c/0/da"><img src="http://feedads.g.doubleclick.net/~a/EvlrzEpmddNV2zeB7IVGGgrwD1c/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/EvlrzEpmddNV2zeB7IVGGgrwD1c/1/da"><img src="http://feedads.g.doubleclick.net/~a/EvlrzEpmddNV2zeB7IVGGgrwD1c/1/di" border="0" ismap="true"></img></a></p><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>6</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. [...]]]></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>
<p>&nbsp;</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" title="SFML &#8211; Instalación y configuración">SFML &#8211; Instalación y configuración</a></li><li><a href="http://razonartificial.com/2011/03/introduccion-a-pysfml/" title="Introducción a PySFML">Introducción a PySFML</a></li><li><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" title="[BGE] Espacio de nombre, tipos y cabeceras">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li><li><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" title="Haciendo un Game Engine 2D básico">Haciendo un Game Engine 2D básico</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/4Q6NI0FJlaZKI3Ew5W2dl-O2GUE/0/da"><img src="http://feedads.g.doubleclick.net/~a/4Q6NI0FJlaZKI3Ew5W2dl-O2GUE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/4Q6NI0FJlaZKI3Ew5W2dl-O2GUE/1/da"><img src="http://feedads.g.doubleclick.net/~a/4Q6NI0FJlaZKI3Ew5W2dl-O2GUE/1/di" border="0" ismap="true"></img></a></p><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>2</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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" title="Tileset isométrico de gran calidad">Tileset isométrico de gran calidad</a></li><li><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" title="Otro tileset isométrico muy bueno &#8211; Cavernas">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li><a href="http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/" title="Crear tiles isométricos 2D con Blender">Crear tiles isométricos 2D con Blender</a></li><li><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" title="Gráficos para prototipos de juegos">Gráficos para prototipos de juegos</a></li><li><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" title="Pack de gráficos para juegos">Pack de gráficos para juegos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/1Sljs7ir0voSzA6Oyc8qMcCTXAw/0/da"><img src="http://feedads.g.doubleclick.net/~a/1Sljs7ir0voSzA6Oyc8qMcCTXAw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/1Sljs7ir0voSzA6Oyc8qMcCTXAw/1/da"><img src="http://feedads.g.doubleclick.net/~a/1Sljs7ir0voSzA6Oyc8qMcCTXAw/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li><li><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" title="SFML &#8211; Abriendo una ventana">SFML &#8211; Abriendo una ventana</a></li><li><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" title="SFML &#8211; Instalación y configuración">SFML &#8211; Instalación y configuración</a></li><li><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" title="Una introducción a la STL I &#8211; Introducción a los contenedores">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/2gHCYrCBOfstI_2SKHR1sGs48WQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/2gHCYrCBOfstI_2SKHR1sGs48WQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/2gHCYrCBOfstI_2SKHR1sGs48WQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/2gHCYrCBOfstI_2SKHR1sGs48WQ/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li><li><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" title="SFML &#8211; Abriendo una ventana">SFML &#8211; Abriendo una ventana</a></li><li><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" title="SFML &#8211; Instalación y configuración">SFML &#8211; Instalación y configuración</a></li><li><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" title="Una introducción a la STL I &#8211; Introducción a los contenedores">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/nVWv8YxF5S-UUstk7z4s82R_hl0/0/da"><img src="http://feedads.g.doubleclick.net/~a/nVWv8YxF5S-UUstk7z4s82R_hl0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/nVWv8YxF5S-UUstk7z4s82R_hl0/1/da"><img src="http://feedads.g.doubleclick.net/~a/nVWv8YxF5S-UUstk7z4s82R_hl0/1/di" border="0" ismap="true"></img></a></p><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>4</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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li><li><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" title="Haciendo un Game Engine 2D básico">Haciendo un Game Engine 2D básico</a></li><li><a href="http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/" title="Guía aprender programar videojuegos con C++">Guía aprender programar videojuegos con C++</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/GEOcw6o5HiK-E_joDYjBn25QQiU/0/da"><img src="http://feedads.g.doubleclick.net/~a/GEOcw6o5HiK-E_joDYjBn25QQiU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/GEOcw6o5HiK-E_joDYjBn25QQiU/1/da"><img src="http://feedads.g.doubleclick.net/~a/GEOcw6o5HiK-E_joDYjBn25QQiU/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" title="[BGE] La clase App">[BGE] La clase App</a></li><li><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" title="[BGE] Espacio de nombre, tipos y cabeceras">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li><li><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" title="Haciendo un Game Engine 2D básico">Haciendo un Game Engine 2D básico</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/QVOk6XdReZC_qOjC56Pzksdfmzs/0/da"><img src="http://feedads.g.doubleclick.net/~a/QVOk6XdReZC_qOjC56Pzksdfmzs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/QVOk6XdReZC_qOjC56Pzksdfmzs/1/da"><img src="http://feedads.g.doubleclick.net/~a/QVOk6XdReZC_qOjC56Pzksdfmzs/1/di" border="0" ismap="true"></img></a></p><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, [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" title="[BGE] La clase App">[BGE] La clase App</a></li><li><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" title="[BGE] Espacio de nombre, tipos y cabeceras">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li><li><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" title="Haciendo un Game Engine 2D básico">Haciendo un Game Engine 2D básico</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/tQuy3IZDVO7QmFbxDRJiTMa1oI8/0/da"><img src="http://feedads.g.doubleclick.net/~a/tQuy3IZDVO7QmFbxDRJiTMa1oI8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/tQuy3IZDVO7QmFbxDRJiTMa1oI8/1/da"><img src="http://feedads.g.doubleclick.net/~a/tQuy3IZDVO7QmFbxDRJiTMa1oI8/1/di" border="0" ismap="true"></img></a></p><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>0</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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li><li><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" title="Haciendo un Game Engine 2D básico">Haciendo un Game Engine 2D básico</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li><li><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" title="Proyecto Generic Game Engine">Proyecto Generic Game Engine</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/BcQjcyepnoVYwXCIPIYFMUB8yyM/0/da"><img src="http://feedads.g.doubleclick.net/~a/BcQjcyepnoVYwXCIPIYFMUB8yyM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/BcQjcyepnoVYwXCIPIYFMUB8yyM/1/da"><img src="http://feedads.g.doubleclick.net/~a/BcQjcyepnoVYwXCIPIYFMUB8yyM/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" title="Haciendo un Game Engine 2D básico">Haciendo un Game Engine 2D básico</a></li><li><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" title="[BGE] Espacio de nombre, tipos y cabeceras">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" title="[BGE] La clase App">[BGE] La clase App</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/eIwII7moz0S-lUPv37HGwrlYSbc/0/da"><img src="http://feedads.g.doubleclick.net/~a/eIwII7moz0S-lUPv37HGwrlYSbc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/eIwII7moz0S-lUPv37HGwrlYSbc/1/da"><img src="http://feedads.g.doubleclick.net/~a/eIwII7moz0S-lUPv37HGwrlYSbc/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" title="Una introducción a la STL I &#8211; Introducción a los contenedores">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li><li><a href="http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/" title="Guía aprender programar videojuegos con C++">Guía aprender programar videojuegos con C++</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/HMCXSrwmOgWMQnaSjvmRbzBrQ1M/0/da"><img src="http://feedads.g.doubleclick.net/~a/HMCXSrwmOgWMQnaSjvmRbzBrQ1M/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HMCXSrwmOgWMQnaSjvmRbzBrQ1M/1/da"><img src="http://feedads.g.doubleclick.net/~a/HMCXSrwmOgWMQnaSjvmRbzBrQ1M/1/di" border="0" ismap="true"></img></a></p><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>0</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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" title="[BGE] La clase App">[BGE] La clase App</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li><li><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" title="[BGE] Espacio de nombre, tipos y cabeceras">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/zN_35_SEhB2D1Uja1HuqaSHjd_I/0/da"><img src="http://feedads.g.doubleclick.net/~a/zN_35_SEhB2D1Uja1HuqaSHjd_I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/zN_35_SEhB2D1Uja1HuqaSHjd_I/1/da"><img src="http://feedads.g.doubleclick.net/~a/zN_35_SEhB2D1Uja1HuqaSHjd_I/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li><li><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" title="[BGE] Espacio de nombre, tipos y cabeceras">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-app/" title="[BGE] La clase App">[BGE] La clase App</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/rqvMi1L7DyBEImNBdYGSLJdAj-Q/0/da"><img src="http://feedads.g.doubleclick.net/~a/rqvMi1L7DyBEImNBdYGSLJdAj-Q/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rqvMi1L7DyBEImNBdYGSLJdAj-Q/1/da"><img src="http://feedads.g.doubleclick.net/~a/rqvMi1L7DyBEImNBdYGSLJdAj-Q/1/di" border="0" ismap="true"></img></a></p><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>Organización del código fuente en C++</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/9fid6kvByhE/</link>
		<comments>http://razonartificial.com/2011/07/organizacion-del-codigo-fuente-en-cpp/#comments</comments>
		<pubDate>Fri, 22 Jul 2011 22:24:46 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1610</guid>
		<description><![CDATA[Introducción Si bien muchos programas simples caben en un solo archivo C o Cpp, cualquier proyecto serio va a necesitar dividir el código en varios ficheros con el fin de ser manejable. Sin embargo, muchos principiantes no se dan cuenta hasta que punto esto es importante (Sobre todo por que muchos lo han intentado y les ha dado más problemas que soluciones y decidieron que no merecía la pena el esfuerzo). En este artículo [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción</h2>
<p>Si bien muchos programas simples caben en un solo archivo C o Cpp, cualquier proyecto serio va a necesitar dividir el código en varios ficheros con el fin de ser manejable. Sin embargo, muchos principiantes no se dan cuenta hasta que punto esto es importante (Sobre todo por que muchos lo han intentado y les ha dado más problemas que soluciones y decidieron que no merecía la pena el esfuerzo). En este artículo intentaré explicar porqué hacerlo y cómo hacerlo correctamente. Cuando sea necesario, doy une breve explicación de como trabajan los compiladores y enlazadores para ayudar a entender porque se tienen que hacer las cosas de una manera determinada.</p>
<h3>Terminología</h3>
<p>En este artículo voy a llamar a los ficheros estándar de C y C++ (normalmente con extensión .c o .cpp) &#8220;ficheros fuentes&#8221;. Esto será para distinguirlos de los &#8220;archivos de cabecera&#8221; (normalmente con extensión .h o .hpp). Esta terminología es la usada por Visual C++ y la mayoría de los libros. Ten en cuenta que esta diferencia es puramente conceptual, ambos son archivos de texto con código en el interior. Sin embargo, como se muestra en el resto del artículo, la diferencia de como se trata a unos archivos u otros es muy importante.<span id="more-1610"></span></p>
<h2>¿Por qué dividir el código en varios archivos?</h2>
<p>La primera pregunta que los programadores novatos se hacen cuando ven un directorio lleno de archivos de código es ¿Por qué no un solo archivo? No entienden el sentido de separar el código en varios ficheros.</p>
<p>Dividir cualquier proyecto de tamaño razonable tiene algunas ventajas, siendo las más significativas las siguientes:</p>
<ul>
<li><strong>Acelerar la compilación</strong>. La mayoría de compiladores trabajan en un solo archivo a la vez. Así que si tenemos 10.000 líneas de código en un solo archivo y cambiamos una línea para compilar nuestro programa necesitamos volver a procesar y compilar 10.000 líneas de código. Sin embargo, si 10.000 líneas de código se distribuyen uniformemente en 10 archivos, si cambiamos una línea solo tendremos que volver a compilar 1000 líneas de código, ahorrando tener que compilar las 9000 líneas restantes del resto de ficheros.</li>
<li><strong>Aumenta la organización</strong>. Dividir el código en una línea lógica hará el trabajo más fácil para ti (O cualquier programador del proyecto) para encontrar variables, clases, estructuras, funciones, etc. Imagina que usas la función de búsqueda de tu editor para encontrar una parte del código, si tienes un fichero llamado juego.cpp tendrás que buscar a lo largo de todo el código, sin embargo, si tienes tu juego dividido en 4 ficheros del tipo <strong>graphics.cpp</strong>, <strong>main.cpp</strong>, <strong>audio.cpp</strong> e <strong>input.cpp</strong>, si quieres buscar algo relacionado con el sonido sabrás donde buscar reduciendo en 3/4 tu búsqueda.</li>
<li><strong>Facilita reutilizar código</strong>. Si el código está cuidadosamente dividido y los archivos son independientes unos de otros te permite reutilizarlos en otros proyecto ahorrándote mucho trabajo en el futuro. Hay muchas más cosas necesarias para poder reutilizar el código, pero sin una buena organización es difícil saber que partes van a trabajar juntas y cuales no. Por lo tanto, poner los subsistemas y clases en ficheros independientes ayuda a portar el código a otros proyectos fácilmente.</li>
<li><strong>Compartir código entre proyectos</strong>. En principio es el mismo tema que la reutilización, pero hay ocasiones que el mismo archivo se usa en varios proyectos en vez de simplemente copiar y pegar, esto facilita que si se corrigen errores o se cambia algo no se tenga que modificar cada copia del archivo y te aseguras de que ambos proyectos utilizan la última versión del código.</li>
<li><strong>Dividir las tareas entre los programadores</strong>. En proyectos grandes donde trabajan varios programadores no es factible trabajar todos en el mismo fichero, la separación de código facilita que cada uno pueda dedicarse a una parte sin interferir en las demás. Por supuesto, puede darse el caso de que dos quieran modificar el mismo archivo a la vez, para ello existen el software de control de versiones como SVN, GIT, Mercurial&#8230;</li>
</ul>
<p>Todo lo anterior son aspectos de modularidad, un elemento clave tanto en el diseño estructurado como orientado a objetos.</p>
<h2>Como hacerlo. Los Fundamentos</h2>
<p>Es probable que te estés convenciendo de que hay que dividir el código, ahora la cuestión es cómo hacerlo. Aunque algunas de las decisiones que tome serán razonablemente arbitrarias hay algunas reglas básicas que debería seguir para asegurar el trabajo.</p>
<p>En primer lugar, mirar como dividir el código en secciones. A menudo se separa en subsistemas o &#8220;módulos&#8221; como el sonido, música, gráficos, manejo de ficheros, etc. Crea nuevos ficheros con nombres significativos para saber a simple vista que contiene, a continuación mueva todo el código que pertenece al módulo a ese archivo. A veces no está claro que pertenece a cada módulo (Algunos te dirían que es por un mal diseño de su software).</p>
<p>Una vez dividido el código en archivos fuentes el siguiente paso es considerar que meter en el archivo de cabecera, en un nivel simple, lo que suele estar en la parte superior del código es un serio candidato a ir al archivo de cabecera, de ahí a que se llamen así.</p>
<p>Los archivos de cabecera suelen incluir algunas o todas de las siguientes cosas:</p>
<ul>
<li>Definición de estructuras y clases.</li>
<li>Definición de tipos (typedef).</li>
<li>Prototipos de funciones.</li>
<li>Variables Globales (ver más adelante).</li>
<li>Constantes</li>
<li>Macros #define.</li>
<li>Directivas #pragma.</li>
</ul>
<p>(Además, deberías incluir las plantillas y las funciones en línea. Esto debería quedar claro al terminar este artículo).</p>
<p>Por ejemplo, mira cualquier biblioteca estándar que venga con el compilador que uses. <strong>Stdlib.h</strong> es un buen ejemplo (<a href="http://www.koders.com/c/fid34FD5D2F1BAF8DC1EC81F8B2E7936A9BB9DAD232.aspx" target="_blank">ver aquí</a>). Te darás cuenta que tiene algunas de las cosas mencionadas en la lista de antes. Del mismo modo puedes ver que las variables globales están precedidas por el modificador <strong>extern</strong>, esto es importante, pero lo veremos más adelante.</p>
<p>En general será necesario tener un archivo de cabecera para cara archivo de código fuente, si tienes un <strong>sound.cpp</strong> tendrás un <strong>sound.h</strong>, si tienes un <strong>sprite.cpp</strong> tendrás un <strong>sprite.h</strong>. Mantener siempre el mismo orden es importante. Saber lo que va en el archivo de cabecera y lo que va en el archivo fuente.</p>
<p>Estos archivos de cabecera se convertirán en la interfaz entre los subsistemas. Al incluir (#include) un archivo de cabecera en otro archivo tendrás acceso a todas las funciones, clases y tipos declarados en ella. Por lo tanto en todos los archivos que uses sprintes probablemente tengas que incluir sprite.h en cada uno de ellos. Recuerda usar <strong>#include &#8220;sprite.h&#8221;</strong> y no <strong>#include &lt;sprite.h&gt;</strong> para que busque en el directorio del proyecto y no en la biblioteca estándar.</p>
<p>Recuerda que, en lo que al compilador se refiere, no existe ninguna diferencia entre un archivo de cabecera y un archivo de código fuente, para el compilador ambos son archivos de texto que contienen código y tratarán igual, la diferencia es puramente conceptual y para los programadores. Los archivos de cabecera deben contener la interfaz, es decir, la definición de lo que contienen los archivos de código fuentes. Estos son los que contienen las funciones, clases y demás. Esto significa que un archivo fuente utiliza otros archivos fuentes gracias a los archivos de cabecera, estos hacen de enlace entre unos y otros.</p>
<h2>Dificultades potenciales</h2>
<p>Las reglas anteriores son bastante vagas y sólo sirven como punto de partida para organizar el código. En casos sencillos, se puede producir por completo los programas de trabajo siguiendo las directrices. Sin embargo, hay algunos detalles más que han de tenerse en cuenta, y es a menudo estos detalles los que causan a los programadores noveles tanto dolor, cuando comienzan a dividir su código hasta en los archivos de cabecera y los archivos normales.</p>
<p>En mi opinión hay cuatro errores básicos de los que entran en el turbio mundo de los archivos de cabeceras definidos por el usuario:</p>
<ul>
<li>La fuente de los archivos ya no compila ya que no pueden encontrar las funciones o variables que necesitan. (Esto a menudo se manifiesta en forma de algo parecido a un &#8220;error C2065: &#8216;MyStruct&#8217;: identificador no declarado&#8221;. En Visual C++, aunque esto puede producir cualquier número de mensajes de error diferentes en función de exactamente lo que están tratando de referencia)</li>
<li>Dependencias cíclicas.  Cuando dos encabezados tienen la necesidad de incluirse entre sí. Por ejemplo la clase sprite incluye un puntero a la criatura que representa y la clase de la criatura necesita un puntero a la clase sprite. No importa como lo hagas ambas deben ser declaradas antes de usarse, pero a la fuerza cuando una se está declarando la otra no ha sido declarada aún.</li>
<li>Duplicar las definiciones. Imagina que tienes un archivo llamado map.h que incluye los archivos sprite.h y hero.h, a su vez hero.h incluye sprite.h por lo que sprite.h se incluiría dos veces en map.h, provocando un error.</li>
<li>Duplicado las instancias de los objetos dentro del código que compila bien. Este es un error vincular, a menudo difícil de entender.</li>
</ul>
<p>Entonces, ¿cómo solucionar estos problemas?</p>
<h2>Solución problema 1</h2>
<p>Afortunadamente, estos problemas son fáciles de arreglar, y aún más fácil de evitar, una vez que las entienda.</p>
<p>El primer error, en un archivo de origen se niega a compilar porque uno de los identificadores fue declarado, es fácil de resolver. Simplemente incluye (#include) el archivo que contiene la definición del identificador que usted necesita. Si sus archivos de cabecera están organizados de forma lógica y llamado así, esto debe ser fácil. Si es necesario utilizar la estructura Sprite, entonces es probable que tenga que incluir &#8220;sprite.h&#8221; en todos los archivos que lo hace. Un error que los programadores suelen tener es asumir que es un archivo ha sido incluido porque está incluido en otro archivo ya incluido, un ejemplo.</p>
<pre class="brush: cpp; title: ; notranslate">
/* Header1.h */
#include &quot;header2.h&quot;
class ClassOne { ... };

/* Header2.h */
class ClassTwo { ... };

/* File1.cpp */
#include &quot;Header1.h&quot;
ClassOne myClassOne_instance;
ClassTwo myClassTwo_instance;
</pre>
<p>En este caso <strong>File1.cpp</strong> compila bien ya que incluye a <strong>Header1.h</strong> e indirectamente (a través de <strong>Header1.h</strong>) también incluye a <strong>Header2.h</strong>, pero en el futuro alguien puede decidir que <strong>Header1.h</strong> no necesita incluir a <strong>Header2.h</strong>. Esto hará que se rompa <strong>File1.cpp</strong> la próxima vez que compiles al no tener la declareción de <strong>ClassTwo</strong>.</p>
<p>La solución está en incluir siempre los archivos necesarios explícitamente en el archivo que son necesarios y no confiar en que otros archivos incluidos ya lo incluyen, esto además ayuda a entender y documentar el código pues se ve que archivos necesita ese fichero en concreto para funcionar.</p>
<h2>Solución Problema 2</h2>
<p>Las dependencias cíclicas son un problema común en la ingeniería de software. A menudo se necesita que una clase o estuctura conozca la existencia de otra y esta de la primera, esto termina con el siguiente aspecto.</p>
<pre class="brush: cpp; title: ; notranslate">
/* Parent.h */
#include &quot;child.h&quot;
class Parent
{
    Child* theChild;
};

/* Child.h */
#include &quot;parent.h&quot;
class Child
{
    Parent* theParent;
};
</pre>
<p>Dado que uno de ellos tiene que ser compilado en primer lugar, necesita alguna manera de romper el ciclo. En este caso, de hecho es bastante trivial. La estructura de <strong>Parent</strong> en realidad no necesita saber los detalles de la clase del <strong>Child</strong>, ya que sólo se almacena un puntero a una. Los punteros son casi lo mismo no importa lo que apuntan, por lo tanto no es necesario que la definición de la estructura o la clase con el fin de almacenar un puntero a una instancia de esa estructura o clase. Así que la línea <em>#include</em> no es necesario. Sin embargo, sólo tiene que sacarla para tener un &#8220;identificador no declarado&#8221; error cuando se encuentra con la palabra <strong>Child</strong>, así que tienes que dejar que el compilador saber que Child es una clase a la que desea apuntar. Esto se hace con una declaración adelantada (forward declaration), tomando la forma de una definición de clase o de clase sin un cuerpo. ejemplo:</p>
<pre class="brush: cpp; title: ; notranslate">
/* Parent.h */
class Child; /* Forward declaration of Child; */
class Parent
{
    Child* theChild;
};
</pre>
<p>Observa como sustituimos la línea #include por la declaración adelantada, igualmente podemos hacerlo en el archivo Parent.h, esto, además, ahorra tiempo de compilación ya que es un #include menos que tratar. Como solo estamos utilizando un puntero y no el tipo en sí no necesita la declaración entera. En el 99% de los casos esto se puede aplicar a uno o ambos archivos para romper las dependencias cíclicas.</p>
<p>Por supuesto, en los archivos fuentes, habrá funciones que se aplican a <strong>Parent</strong> que modifican también a <strong>Child</strong>. Por lo tanto es probable que haya que incluir <strong>Parent.h</strong> y <strong>Child.h</strong> tanto en <strong>Parent.cpp</strong> como en <strong>Child.cpp</strong> Click para ver la imagen.</p>
<p><a href="http://razonartificial.com/wp-content/uploads/2011/07/DependenciasCiclicas.png"><img class="aligncenter size-medium wp-image-1611" title="DependenciasCiclicas" src="http://razonartificial.com/wp-content/uploads/2011/07/DependenciasCiclicas-250x89.png" alt="" width="250" height="89" /></a></p>
<p>Tenga en cuenta que ser capaz de eliminar completamente la dependencia no siempre es posible. Muchas de las clases y las estructuras están compuestas de otras clases y las estructuras, que es una dependencia no se puede evitar. Sin embargo, siempre que esta dependencia es de un solo sentido, el orden de compilación será fijo y no debería haber ningún problema.</p>
<h2>Solución Problema 3</h2>
<p>Duplicar definiciones en tiempo de compilación significa que un archivo de cabecera terminó incluyéndose más de una vez en un archivo en particular. Esto lleva a que una clase o estructura se define más de una vez, causando error. Lo primero que debes hacer es asegurarte de que se incluyen solo los archivos necesarios para ese código fuente en particular y quitar todo lo que no utilice.</p>
<p>Lamentablemente, esto rara vez es suficiente, ya que algunas cabeceras se incluyen otras cabeceras. Vamos a revisar un ejemplo de las anteriores, con ligeras modificaciones:</p>
<pre class="brush: cpp; title: ; notranslate">
/* Header1.h */
#include &quot;header3.h&quot;
class ClassOne { ... };

/* Header2.h */
#include &quot;header3.h&quot;
class ClassTwo { ... };

/* File1.cpp */
#include &quot;Header1.h&quot;
#include &quot;Header2.h&quot;
ClassOne myClassOne_instance;
ClassTwo myClassTwo_instance;
</pre>
<p>Por alguna razón tanto <strong>Header1.h</strong> como <strong>Header2.h</strong> incluyen a <strong>Header3.h</strong>, quizás <strong>ClassOne</strong> y <strong>ClassTwo</strong> se compenen con funciones de <strong>Header3.h</strong>. La razón no es importante, pero muchas veces sucede casos como estos en los que al final en <strong>File1.cpp</strong> se acaba incluyendo dos veces el mismo archivo incluso sin haber una <em>#include</em> a él en el mismo archivo, recuerda que la directiva <em>#include</em> lo que hace es, antes de compilar, copiar todo el contenido del archivo incluido en el archivo actual. así que <strong>File1.cpp</strong> quedaría de la siguiente manera.</p>
<p><img class="aligncenter size-full wp-image-1612" title="gdarticle_includefiles" src="http://razonartificial.com/wp-content/uploads/2011/07/gdarticle_includefiles.png" alt="" width="280" height="341" /></p>
<p>A los efectos de la compilación, <strong>File1.cpp</strong> termina con copias de <strong>Header1.h</strong> y <strong>Header2.h</strong>, los cuales incluyen sus propias copias de <strong>Header3.h</strong>. El archivo resultante, con todas las cabeceras de expansión en línea en su archivo original, se conoce como una unidad de traducción. Debido a esta expansión en línea, todo lo declarado en <strong>Header3.h</strong> va a aparecer dos veces en esta unidad de traducción, causando un error.</p>
<p>Así que, ¿qué hacer? No se puede hacer sin <strong>Header1.h</strong> o <strong>Header2.h</strong>, ya que se necesita para acceder a las estructuras declaradas en su interior lo que necesita alguna forma de asegurar que, no importa qué, <strong>Header3.h</strong> no va a aparecer dos veces en el <strong>File1.cpp</strong> cuando se compila.</p>
<p>Si se miraba stdlib.h antes, te habrás dado cuenta las líneas en la parte superior similar a lo siguiente:</p>
<pre class="brush: cpp; title: ; notranslate">
#ifndef _INC_STDLIB
#define _INC_STDLIB
</pre>
<p>Y en la parte inferior del archivo, algo así como:</p>
<pre class="brush: cpp; title: ; notranslate">
#endif  /* _INC_STDLIB */
</pre>
<p>Esto es lo que se conoce como un &#8220;inclusion guard&#8221;. Viene a decir que si no está definido _INC_STDLIB defínelo, sino, ve a #endif sería similar al código cuando quieres que algo se ejecute solo una vez.</p>
<pre class="brush: cpp; title: ; notranslate">
static bool done = false;
if (!done)
{
    /* Do something */
    done = true;
}
</pre>
<p>Durante la compilación de File1.cpp, la primera vez que pide que se incluya el archivo <strong>stdlib.h</strong>, llega a la línea <em>#ifndef</em> y continúa porque &#8220;_INC_STDLIB&#8221; aún no está definida. La siguiente línea define ese símbolo y lleva a cabo la lectura en stdlib.h. Si hay otra &#8220;#include&#8221; durante la compilación de File1.cpp, leerá el cheque #ifndef y luego salta a #endif al final del archivo. Esto se debe a todo lo que entre el #ifndef y #endif se ejecuta sólo si &#8220;_INC_STDLIB&#8221; no está definido, y que se definió la primera vez que lo incluye. De esta manera, se garantiza que las definiciones en stdlib.h sólo son cada vez incluye una vez al ponerlos dentro de #ifndef / #endif.</p>
<p>Esto es trivial para aplicar a sus propios proyectos. Al comienzo de cada archivo de cabecera que usted escribe, escribe lo siguiente:</p>
<pre class="brush: cpp; title: ; notranslate">
#ifndef INC_FILENAME_H
#define INC_FILENAME_H
</pre>
<p>Tenga en cuenta que el símbolo (en este caso, &#8220;INC_FILENAME_H&#8221;) tiene que ser único a través de su proyecto. Es por esto que es una buena idea de incorporar el nombre del archivo en el símbolo. No agregue un guión bajo al principio como stdlib.h tiene como identificadores precedidos por un guión bajo se supone que son reservados para &#8220;la aplicación&#8221; (es decir, el compilador, las librerías estándar, y así sucesivamente). Luego se agrega el <em>#endif / * INC_FILENAME_H * /</em> al final del archivo. El comentario no es necesario, pero le ayudará a recordar a que pertenece ese #endif.</p>
<h2>Solución Problema 4</h2>
<p>Cuando el enlazador trata de crear un archivo ejecutable (o biblioteca) de su código lo que hace es meterlo todo en un archivo objeto (.obj o .o), uno por cada archivo de código fuente y los une. El trabajo principal del enlazador es resolver los identificadores (básicamente, las variables o los nombres de funciones) y convertirlas en direcciones máquina en el archivo final. El problema surge cuando el enlazador en cuentra dos intancias o más de ese identificador en los archivos objetos, entonces no se puede determinar cual es el &#8220;correcto&#8221; para su uso. El identificador debe ser único para evitar cualquier ambigüedad, Así que ¿Cómo es que el compilador no ve que hay un identificador duplicado y el enlazador si lo ve?</p>
<p>Imagina el siguiente código:</p>
<pre class="brush: cpp; title: ; notranslate">
/* Header.h */
#ifndef INC_HEADER_H
#define INC_HEADER_H
int my_global;
#endif /* INC_HEADER_H */

/* code1.cpp */
#include &quot;header1.h&quot;
void DoSomething()
{
    ++my_global;
}

/* code2.cpp */
#include &quot;header1.h&quot;
void DoSomethingElse()
{
    --my_global;
}
</pre>
<p>La primera se compila en dos archivos objeto, probablemente llamado code1.obj y code2.obj. Recuerde que una unidad de traducción contiene una copia completa de todos los encabezados incluidos en el archivo que está compilando. Finalmente, los archivos de objetos se combinan para producir el archivo final.</p>
<p>Aquí hay una representación visual de la forma en que estos archivos (y su contenido) se combinan:</p>
<p><img class="aligncenter size-full wp-image-1613" title="gdarticle_linker" src="http://razonartificial.com/wp-content/uploads/2011/07/gdarticle_linker.png" alt="" width="422" height="365" /></p>
<p>Note que hay dos copias de &#8220;my_global&#8221; en ese bloque final. Aunque &#8220;my_global&#8221; fue único para cada unidad de traducción (esto sería garantizada por el uso de los guardias de inclusión), que combina los archivos objeto generados por cada unidad de traducción se traduciría en que haya más de una instancia de my_global en el archivo. Esto se marca como un error, ya que el enlazador no tiene manera de saber si estos dos identificadores son en realidad una misma, o si uno de ellos era mal llamado justa y que se supone en realidad que es de 2 variables independientes. Así que hay que arreglarlo.</p>
<p>La respuesta no consiste en definir las variables o funciones en los archivos de cabecera en lugar de los archivos fuentes, donde estás seguro que se compilan solo una vez. Esto trae un nuevo problema, ¿Cómo hacer las funciones y variables visibles globalmente si no se encuentra en un archivo de cabecera? ¿De qué manera la pueden &#8220;ver&#8221; otros archivos? La respuesta es declararlas en los archivos de cabecera, pero no definirlas. Esto permite al compilador saber que la función o variable existe, pero delega el acto de de asignarle una dirección al enlazador.</p>
<p>Para hacer esto para una variable, se añade &#8216;<em>extern</em>&#8216; la palabra clave antes de su nombre:</p>
<pre class="brush: cpp; title: ; notranslate">
extern int my_global;
</pre>
<p>El especificador &#8216;<em>extern</em>&#8216; es como decirle al compilador que esperar hasta el tiempo de enlace para resolver la &#8220;conexión&#8221;. Y para una función, simplemente hay que poner el prototipo de función:</p>
<pre class="brush: cpp; title: ; notranslate">
int SomeFunction(int parameter);
</pre>
<p>Las funciones se consideran &#8220;extern&#8221; por defecto por lo que se acostumbra a omitir el &#8216;extern&#8217; en un prototipo de función.</p>
<p>Por supuesto, estas son sólo las declaraciones de que <strong>my_global</strong> y <strong>SomeFunction</strong> existen en alguna parte. En realidad, no los creas. Todavía tiene que hacer esto en uno de los archivos de origen, de lo contrario aparecerá un error de vinculador nuevo cuando se descubre que no puede resolver uno de los identificadores a una dirección real. Así que para este ejemplo, tendría que añadir &#8220;<strong>int my_global</strong>&#8221; a cualquiera de <strong>Code1.cpp</strong> o <strong>Code2.cpp</strong>, y todo debería funcionar bien. Si se trata de una función, deberá añadir la función como su cuerpo (es decir, el código de la función) en uno de los archivos de origen.</p>
<p>La regla aquí es recordar que los archivos de cabecera define una interfaz, no una implementación. En ellas se indica que las funciones, variables y objetos existen, pero no se hace responsable de su creación. Ellos pueden decir lo que una estructura o clase debe contener, pero en realidad no debe crear instancias de esa estructura o clase. Se puede especificar los parámetros de una función y se lo devuelve, pero no cómo se obtiene el resultado. Y así sucesivamente. Esta es la razón por la que la lista de lo que puede entrar en un fichero de cabecera al principio de este artículo es importante.</p>
<p>Hay dos notables excepciones a no incluir el cuerpo de las funciones en los archivos de cabecera:</p>
<p>La primera excepción es la de funciones de la plantilla. La mayoría de los compiladores y enlazadores no puede manejar plantillas se definen en archivos diferentes a la que se utilizan en, por lo que las plantillas casi siempre es necesario definir en un encabezado para que la definición se puede incluir en todos los archivos que necesita para usarlo. Debido a la forma de plantillas se crea una instancia en el código, esto no conduce a los mismos errores que se podrían obtener mediante la definición de una función normal en un encabezado. Esto es así porque las plantillas no se compilan en el lugar de la definición, sino que se compilan, ya que son utilizados por el código en otros lugares.</p>
<p>La segunda excepción es las funciones en línea, mencionó brevemente antes. Una función en línea se ha compilado en el código, en vez de llamadas de la forma habitual. Esto significa que cualquier unidad de traducción que &#8216;llama &#8220;el código de una función en línea tiene que ser capaz de ver el funcionamiento interno (es decir, la puesta en práctica) de esa función con el fin de insertar el código de esa función directamente. Esto significa que un prototipo de función sencilla no es suficiente para llamar a la función en línea, lo que significa que donde quiera que normalmente sólo tiene que utilizar un prototipo de función, se necesita el cuerpo de la función general de una función en línea. Al igual que con las plantillas, esto no causa errores de vinculador como la función en línea no es realmente compilado en el lugar de la definición, pero se inserta en el lugar de la llamada.</p>
<h2>Otras Consideraciones</h2>
<p>Por lo tanto, el código está muy bien dividido en varios archivos, que le da todos los beneficios mencionados en el inicio como la velocidad de compilación de una mayor y mejor organización. ¿Hay algo más que necesitas saber?</p>
<p>En primer lugar, si estás usando la biblioteca estándar de C++ (STL) o cualquier otra biblioteca que utilice espacios de nombres, no utilice la se sentencia &#8220;using&#8221; en los archivos de cabecera pues reducirás la utilidad de los espacios de nombres casi por completo, es mejor usar el identificador del espacio de nombre en cada función u objeto que uses, así tienes la ventaja de saber a que biblioteca pertenece ese código y no tendrás problemas de superponer nombres de funciones propias que te hagan rectificar el código.</p>
<p>En segundo lugar, el uso de macros debe ser cuidadosamente controlado. Los programadores de C tienen que confiar en las macros de un montón de funcionalidades, pero los programadores de C++ debe evitarlos siempre que sea posible. Si desea una constante en C + +, utilice la palabra clave &#8216;const&#8217;. Si desea una función en línea en C++, utilice la palabra clave &#8216;inline&#8217;. Si desea una función que opera sobre los diferentes tipos utilice plantillas o sobrecarga. Pero si necesitas utilizar una macro, por alguna razón, y lo coloca en un fichero de cabecera, trate de no escribir macros que podrían interferir con el código en los archivos que se incluyen. Cuando se producen errores extraños de compilación, no quiero tener que buscar a través de todos los archivos de cabecera para ver si alguien utiliza un # define para cambiar inadvertidamente su función o sus parámetros a otra cosa. Así que siempre que sea posible, mantener las macros de cabeceras a menos que usted puede estar seguro de que no les importa que afecta a todo en el proyecto.</p>
<p><strong>original:</strong> http://www.gamedev.net/page/reference/index.html/_/reference/programming/languages/c-and-c/organizing-code-files-in-c-and-c-r1798</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/" title="Guía aprender programar videojuegos con C++">Guía aprender programar videojuegos con C++</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/eST2WB1f5nopXiFngFIJSkszPFo/0/da"><img src="http://feedads.g.doubleclick.net/~a/eST2WB1f5nopXiFngFIJSkszPFo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/eST2WB1f5nopXiFngFIJSkszPFo/1/da"><img src="http://feedads.g.doubleclick.net/~a/eST2WB1f5nopXiFngFIJSkszPFo/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/9fid6kvByhE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2011/07/organizacion-del-codigo-fuente-en-cpp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2011/07/organizacion-del-codigo-fuente-en-cpp/</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 [...]]]></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>
<ul class="related_post"><li>No hay entradas relacionadas.</li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/2dEJV7LdIAAu5gGWUdgYj3FOha0/0/da"><img src="http://feedads.g.doubleclick.net/~a/2dEJV7LdIAAu5gGWUdgYj3FOha0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/2dEJV7LdIAAu5gGWUdgYj3FOha0/1/da"><img src="http://feedads.g.doubleclick.net/~a/2dEJV7LdIAAu5gGWUdgYj3FOha0/1/di" border="0" ismap="true"></img></a></p><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>0</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 [...]]]></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.
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.
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);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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/04/artesania-control-exploradores-juegos-estrategia/" title="Artesania del control de exploradores en juegos de estrategia">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/" title="Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia">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/" title="ORTS. Estrategia en tiempo real OpenSource">ORTS. Estrategia en tiempo real OpenSource</a></li><li><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" title="Gran Pack de desarrollo de videojuegos">Gran Pack de desarrollo de videojuegos</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo II">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/pkU1lElAtvL2FM8Bd-Ew4e1zR7w/0/da"><img src="http://feedads.g.doubleclick.net/~a/pkU1lElAtvL2FM8Bd-Ew4e1zR7w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/pkU1lElAtvL2FM8Bd-Ew4e1zR7w/1/da"><img src="http://feedads.g.doubleclick.net/~a/pkU1lElAtvL2FM8Bd-Ew4e1zR7w/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" title="Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS">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/" title="Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia">Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia</a></li><li><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" title="Gran Pack de desarrollo de videojuegos">Gran Pack de desarrollo de videojuegos</a></li><li><a href="http://razonartificial.com/2010/08/orts-estrategia-en-tiempo-real-opensource/" title="ORTS. Estrategia en tiempo real OpenSource">ORTS. Estrategia en tiempo real OpenSource</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo II">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/5Wc7DSBzfOZt1G9w5IwTjyg9zFo/0/da"><img src="http://feedads.g.doubleclick.net/~a/5Wc7DSBzfOZt1G9w5IwTjyg9zFo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5Wc7DSBzfOZt1G9w5IwTjyg9zFo/1/da"><img src="http://feedads.g.doubleclick.net/~a/5Wc7DSBzfOZt1G9w5IwTjyg9zFo/1/di" border="0" ismap="true"></img></a></p><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; [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" title="Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS">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/" title="ORTS. Estrategia en tiempo real OpenSource">ORTS. Estrategia en tiempo real OpenSource</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo I">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li><a href="http://razonartificial.com/2010/08/la-inteligencia-artificial-de-l4d/" title="La Inteligencia Artificial de L4D">La Inteligencia Artificial de L4D</a></li><li><a href="http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/" title="Guía aprender programar videojuegos con C++">Guía aprender programar videojuegos con C++</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/mBMKJaMmF3QkW5LfzJP4s4E-pII/0/da"><img src="http://feedads.g.doubleclick.net/~a/mBMKJaMmF3QkW5LfzJP4s4E-pII/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/mBMKJaMmF3QkW5LfzJP4s4E-pII/1/da"><img src="http://feedads.g.doubleclick.net/~a/mBMKJaMmF3QkW5LfzJP4s4E-pII/1/di" border="0" ismap="true"></img></a></p><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. [...]]]></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>
<ul class="related_post"><li>No hay entradas relacionadas.</li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/0pZPlUjwfXgeWI3dNBm9cSqtvI4/0/da"><img src="http://feedads.g.doubleclick.net/~a/0pZPlUjwfXgeWI3dNBm9cSqtvI4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/0pZPlUjwfXgeWI3dNBm9cSqtvI4/1/da"><img src="http://feedads.g.doubleclick.net/~a/0pZPlUjwfXgeWI3dNBm9cSqtvI4/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" title="SFML &#8211; Instalación y configuración">SFML &#8211; Instalación y configuración</a></li><li><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" title="SFML &#8211; Abriendo una ventana">SFML &#8211; Abriendo una ventana</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" title="SFML &#8211; Juego de ejemplo">SFML &#8211; Juego de ejemplo</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/XQUoYza6RZTQGoQ4mWV3ucEJr9Q/0/da"><img src="http://feedads.g.doubleclick.net/~a/XQUoYza6RZTQGoQ4mWV3ucEJr9Q/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/XQUoYza6RZTQGoQ4mWV3ucEJr9Q/1/da"><img src="http://feedads.g.doubleclick.net/~a/XQUoYza6RZTQGoQ4mWV3ucEJr9Q/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li><li><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" title="SFML &#8211; Instalación y configuración">SFML &#8211; Instalación y configuración</a></li><li><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" title="Proyecto Generic Game Engine">Proyecto Generic Game Engine</a></li><li><a href="http://razonartificial.com/2011/09/bge-espacio-de-nombre-tipos-y-cabeceras/" title="[BGE] Espacio de nombre, tipos y cabeceras">[BGE] Espacio de nombre, tipos y cabeceras</a></li><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/-k6KuMNKJ59XIJ4_xoF07Nh1ABo/0/da"><img src="http://feedads.g.doubleclick.net/~a/-k6KuMNKJ59XIJ4_xoF07Nh1ABo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-k6KuMNKJ59XIJ4_xoF07Nh1ABo/1/da"><img src="http://feedads.g.doubleclick.net/~a/-k6KuMNKJ59XIJ4_xoF07Nh1ABo/1/di" border="0" ismap="true"></img></a></p><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>1</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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li><li><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" title="SFML &#8211; Instalación y configuración">SFML &#8211; Instalación y configuración</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" title="Una introducción a la STL I &#8211; Introducción a los contenedores">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/SRpatxIdjzgATBc51KehENH9euY/0/da"><img src="http://feedads.g.doubleclick.net/~a/SRpatxIdjzgATBc51KehENH9euY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SRpatxIdjzgATBc51KehENH9euY/1/da"><img src="http://feedads.g.doubleclick.net/~a/SRpatxIdjzgATBc51KehENH9euY/1/di" border="0" ismap="true"></img></a></p><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>1</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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li><li><a href="http://razonartificial.com/2011/03/sfml-abriendo-una-ventana/" title="SFML &#8211; Abriendo una ventana">SFML &#8211; Abriendo una ventana</a></li><li><a href="http://razonartificial.com/2011/03/introduccion-a-pysfml/" title="Introducción a PySFML">Introducción a PySFML</a></li><li><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" title="Proyecto Generic Game Engine">Proyecto Generic Game Engine</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/NltSNTRBh6Eefuc558E2ygrNADY/0/da"><img src="http://feedads.g.doubleclick.net/~a/NltSNTRBh6Eefuc558E2ygrNADY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/NltSNTRBh6Eefuc558E2ygrNADY/1/da"><img src="http://feedads.g.doubleclick.net/~a/NltSNTRBh6Eefuc558E2ygrNADY/1/di" border="0" ismap="true"></img></a></p><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) [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" title="Gran Pack de desarrollo de videojuegos">Gran Pack de desarrollo de videojuegos</a></li><li><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" title="Una introducción a la STL I &#8211; Introducción a los contenedores">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/lDwOJag_IkOCGjCF8C4E4-XySV0/0/da"><img src="http://feedads.g.doubleclick.net/~a/lDwOJag_IkOCGjCF8C4E4-XySV0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/lDwOJag_IkOCGjCF8C4E4-XySV0/1/da"><img src="http://feedads.g.doubleclick.net/~a/lDwOJag_IkOCGjCF8C4E4-XySV0/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/" title="Bienvenidos a Razón Artificial 2.0">Bienvenidos a Razón Artificial 2.0</a></li><li><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" title="Iberogre &#8211; Documentación de Ogre en español">Iberogre &#8211; Documentación de Ogre en español</a></li><li><a href="http://razonartificial.com/2011/01/volveran-los-tutoriales/" title="Volverán los tutoriales">Volverán los tutoriales</a></li><li><a href="http://razonartificial.com/2010/12/cambio-de-filosofia-del-blog/" title="Cambio de filosofía del blog">Cambio de filosofía del blog</a></li><li><a href="http://razonartificial.com/2010/09/sobre-que-quieres-que-escribamos/" title="Sobre qué quieres que escribamos">Sobre qué quieres que escribamos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/KzI4A-VrK4yRayCSkHNe3RY0Oac/0/da"><img src="http://feedads.g.doubleclick.net/~a/KzI4A-VrK4yRayCSkHNe3RY0Oac/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/KzI4A-VrK4yRayCSkHNe3RY0Oac/1/da"><img src="http://feedads.g.doubleclick.net/~a/KzI4A-VrK4yRayCSkHNe3RY0Oac/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" title="Tileset isometrico &#8211; Grassland">Tileset isometrico &#8211; Grassland</a></li><li><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" title="Otro tileset isométrico muy bueno &#8211; Cavernas">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" title="Tileset isométrico de gran calidad">Tileset isométrico de gran calidad</a></li><li><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" title="Pack de gráficos para juegos">Pack de gráficos para juegos</a></li><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/pFj2ybZGxOjdh93vInRrA3iqrsU/0/da"><img src="http://feedads.g.doubleclick.net/~a/pFj2ybZGxOjdh93vInRrA3iqrsU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/pFj2ybZGxOjdh93vInRrA3iqrsU/1/da"><img src="http://feedads.g.doubleclick.net/~a/pFj2ybZGxOjdh93vInRrA3iqrsU/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" title="Gráficos para prototipos de juegos">Gráficos para prototipos de juegos</a></li><li><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" title="Tileset isometrico &#8211; Grassland">Tileset isometrico &#8211; Grassland</a></li><li><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" title="SFML &#8211; Juego de ejemplo">SFML &#8211; Juego de ejemplo</a></li><li><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" title="Otro tileset isométrico muy bueno &#8211; Cavernas">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" title="Tileset isométrico de gran calidad">Tileset isométrico de gran calidad</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/S0ku3rjbL8uBnhe9BAAnjVyjDpk/0/da"><img src="http://feedads.g.doubleclick.net/~a/S0ku3rjbL8uBnhe9BAAnjVyjDpk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/S0ku3rjbL8uBnhe9BAAnjVyjDpk/1/da"><img src="http://feedads.g.doubleclick.net/~a/S0ku3rjbL8uBnhe9BAAnjVyjDpk/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/sfml-instalacion-y-configuracion/" title="SFML &#8211; Instalación y configuración">SFML &#8211; Instalación y configuración</a></li><li><a href="http://razonartificial.com/2012/02/proyecto-generic-game-engine/" title="Proyecto Generic Game Engine">Proyecto Generic Game Engine</a></li><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li><li><a href="http://razonartificial.com/2011/09/bge-sistema-base-del-engine/" title="[BGE] Sistema base del Engine">[BGE] Sistema base del Engine</a></li><li><a href="http://razonartificial.com/2011/09/haciendo-un-game-engine-2d-basico/" title="Haciendo un Game Engine 2D básico">Haciendo un Game Engine 2D básico</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/d3h4Qdo2b5DnDEL3vnxF_XNH8wc/0/da"><img src="http://feedads.g.doubleclick.net/~a/d3h4Qdo2b5DnDEL3vnxF_XNH8wc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/d3h4Qdo2b5DnDEL3vnxF_XNH8wc/1/da"><img src="http://feedads.g.doubleclick.net/~a/d3h4Qdo2b5DnDEL3vnxF_XNH8wc/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/" title="Ayuda a financiar la web: Vótanos en Lánzanos">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/" title="Iberogre &#8211; Documentación de Ogre en español">Iberogre &#8211; Documentación de Ogre en español</a></li><li><a href="http://razonartificial.com/2011/01/volveran-los-tutoriales/" title="Volverán los tutoriales">Volverán los tutoriales</a></li><li><a href="http://razonartificial.com/2010/12/cambio-de-filosofia-del-blog/" title="Cambio de filosofía del blog">Cambio de filosofía del blog</a></li><li><a href="http://razonartificial.com/2010/09/sobre-que-quieres-que-escribamos/" title="Sobre qué quieres que escribamos">Sobre qué quieres que escribamos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/CQAGNgnCHTtwovPrzRgSwe85QNc/0/da"><img src="http://feedads.g.doubleclick.net/~a/CQAGNgnCHTtwovPrzRgSwe85QNc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/CQAGNgnCHTtwovPrzRgSwe85QNc/1/da"><img src="http://feedads.g.doubleclick.net/~a/CQAGNgnCHTtwovPrzRgSwe85QNc/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" title="Gran Pack de desarrollo de videojuegos">Gran Pack de desarrollo de videojuegos</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/" title="Arkanoid V &#8211; Creando la bola">Arkanoid V &#8211; Creando la bola</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/" title="Arkanoid IV &#8211; Creando la pala">Arkanoid IV &#8211; Creando la pala</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/RNbCVUUdOI206ygVZ24cfw1u00Y/0/da"><img src="http://feedads.g.doubleclick.net/~a/RNbCVUUdOI206ygVZ24cfw1u00Y/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/RNbCVUUdOI206ygVZ24cfw1u00Y/1/da"><img src="http://feedads.g.doubleclick.net/~a/RNbCVUUdOI206ygVZ24cfw1u00Y/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/" title="Ayuda a financiar la web: Vótanos en Lánzanos">Ayuda a financiar la web: Vótanos en Lánzanos</a></li><li><a href="http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/" title="Bienvenidos a Razón Artificial 2.0">Bienvenidos a Razón Artificial 2.0</a></li><li><a href="http://razonartificial.com/2010/12/cambio-de-filosofia-del-blog/" title="Cambio de filosofía del blog">Cambio de filosofía del blog</a></li><li><a href="http://razonartificial.com/2010/09/sobre-que-quieres-que-escribamos/" title="Sobre qué quieres que escribamos">Sobre qué quieres que escribamos</a></li><li><a href="http://razonartificial.com/2010/07/repositorio-en-github-para-el-engine-rpg/" title="Repositorio en github para el Engine-RPG">Repositorio en github para el Engine-RPG</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/8-JIyvOlZFFzGNO6MZQ_JOvkAgk/0/da"><img src="http://feedads.g.doubleclick.net/~a/8-JIyvOlZFFzGNO6MZQ_JOvkAgk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8-JIyvOlZFFzGNO6MZQ_JOvkAgk/1/da"><img src="http://feedads.g.doubleclick.net/~a/8-JIyvOlZFFzGNO6MZQ_JOvkAgk/1/di" border="0" ismap="true"></img></a></p><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 Curso programación de videojuegosGran Pack de desarrollo de videojuegosIA en videojuegos &#8211; Persiguiendo y evadiendo IIArkanoid V [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/curso-programacion-de-videojuegos/" title="Curso programación de videojuegos">Curso programación de videojuegos</a></li><li><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" title="Gran Pack de desarrollo de videojuegos">Gran Pack de desarrollo de videojuegos</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo II">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/" title="Arkanoid V &#8211; Creando la bola">Arkanoid V &#8211; Creando la bola</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/" title="Arkanoid IV &#8211; Creando la pala">Arkanoid IV &#8211; Creando la pala</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/P-TAfdc0TK0y_hHteVdwI5LrOaU/0/da"><img src="http://feedads.g.doubleclick.net/~a/P-TAfdc0TK0y_hHteVdwI5LrOaU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/P-TAfdc0TK0y_hHteVdwI5LrOaU/1/da"><img src="http://feedads.g.doubleclick.net/~a/P-TAfdc0TK0y_hHteVdwI5LrOaU/1/di" border="0" ismap="true"></img></a></p><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>2</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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/03/ayuda-a-financiar-la-web-votanos-en-lanzanos/" title="Ayuda a financiar la web: Vótanos en Lánzanos">Ayuda a financiar la web: Vótanos en Lánzanos</a></li><li><a href="http://razonartificial.com/2011/03/bienvenidos-a-razon-artificial-2-0/" title="Bienvenidos a Razón Artificial 2.0">Bienvenidos a Razón Artificial 2.0</a></li><li><a href="http://razonartificial.com/2011/01/volveran-los-tutoriales/" title="Volverán los tutoriales">Volverán los tutoriales</a></li><li><a href="http://razonartificial.com/2010/09/sobre-que-quieres-que-escribamos/" title="Sobre qué quieres que escribamos">Sobre qué quieres que escribamos</a></li><li><a href="http://razonartificial.com/2010/07/repositorio-en-github-para-el-engine-rpg/" title="Repositorio en github para el Engine-RPG">Repositorio en github para el Engine-RPG</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/OvsMz0v-8x5QvYoBuCQgqr_G_EM/0/da"><img src="http://feedads.g.doubleclick.net/~a/OvsMz0v-8x5QvYoBuCQgqr_G_EM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/OvsMz0v-8x5QvYoBuCQgqr_G_EM/1/da"><img src="http://feedads.g.doubleclick.net/~a/OvsMz0v-8x5QvYoBuCQgqr_G_EM/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" title="Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS">Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</a></li><li><a href="http://razonartificial.com/2010/08/algoritmo-minimax-un-jugador-incansable/" title="Algoritmo Minimax, un jugador incansable">Algoritmo Minimax, un jugador incansable</a></li><li><a href="http://razonartificial.com/2010/08/muestra-del-engine-de-pyia/" title="Muestra del Engine de PyIA">Muestra del Engine de PyIA</a></li><li><a href="http://razonartificial.com/2010/03/pathfinding-a-en-python-parte-i/" title="Pathfinding A* en Python. Parte I">Pathfinding A* en Python. Parte I</a></li><li><a href="http://razonartificial.com/2010/01/el-salto-del-caballo-backtracking/" title="El salto del caballo, backtracking">El salto del caballo, backtracking</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/y9K2Ri0yDSgslbo20XpPMlllpcY/0/da"><img src="http://feedads.g.doubleclick.net/~a/y9K2Ri0yDSgslbo20XpPMlllpcY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/y9K2Ri0yDSgslbo20XpPMlllpcY/1/da"><img src="http://feedads.g.doubleclick.net/~a/y9K2Ri0yDSgslbo20XpPMlllpcY/1/di" border="0" ismap="true"></img></a></p><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>15</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/</feedburner:origLink></item>
		<item>
		<title>Tiled map editor – El editor de mapas libre</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/UnriMncO6G4/</link>
		<comments>http://razonartificial.com/2010/12/tiled-map-editor-el-editor-de-mapas-libre/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 22:14:01 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Map Editor]]></category>
		<category><![CDATA[Tiled]]></category>
		<category><![CDATA[Tilemapping]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=1231</guid>
		<description><![CDATA[Ya he hablado en el blog acerca de este programa, pero ahora paso a hacerle un análisis en profundidad ya que es un programa que utilizo mucho y un buen recurso. Desarrollar videojuegos no es solo escribir código. Conlleva una gran parte de diseño y diferentes recursos como gráficos, audios, modelos, etc. Teniendo los recursos y un buen compilador se podría crear un juego, pero eso sería tan absurdo como utilizar un ordenador a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://razonartificial.com/wp-content/uploads/2010/12/1066_Tiled.png"><img class="alignright size-medium wp-image-1240" title="1066_Tiled" src="http://razonartificial.com/wp-content/uploads/2010/12/1066_Tiled-300x143.png" alt="" width="300" height="143" /></a></p>
<p>Ya he hablado en el blog acerca de este programa, pero ahora paso a hacerle un análisis en profundidad ya que es un programa que utilizo mucho y un buen recurso.</p>
<p>Desarrollar videojuegos no es solo escribir código. Conlleva una gran parte de diseño y diferentes recursos como gráficos, audios, modelos, etc. Teniendo los recursos y un buen compilador se podría crear un juego, pero eso sería tan absurdo como utilizar un ordenador a base de 1 y 0, se puede, pero nadie lo hace. Con los juegos pasa algo parecido lo que se crea no es directamente el juego en sí, sino que se hacen una serie de herramientas que faciliten el proceso y abstraigan ciertas partes de bajo nivel. Engines gráficos, de física, de inteligencia artificial que se programan a bajo nivel para hacerlo eficiente y luego son llamados desde lenguajes de scripts más sencillos para darle lógica al juego. Otra de las grandes herramientas son los editores de nivel. En los que se compone la acción con los gráficos y demás para luego ser cargados desde el juego y de los editores de niveles vamos a hablar.</p>
<p>Lo que he explicado arriba no se aplica solo a grandes producciones juegos en 2D también precisan de editores de nivel, editores de sprites e incluso algunos complejo de ciertos engines que abstraigan del bajo nivel de bibliotecas como SDL o Allegro.</p>
<p>Las compañías que cuentan con recursos y presupuesto suele crear sus propias herramientas y formatos propios para sus proyectos, pero para amateur a veces nos interesa centrarnos en crear videojuegos y aprovecharnos de herramientas libres para crear nuestros juegos y ahí es donde entra en juego <a href="http://www.mapeditor.org/">Tiled Map Editor</a>.</p>
<p>El Tiled es un editor de mapas <strong>libre</strong> escrito en<strong> C++</strong> y con la biblioteca <strong>QT</strong>. El programa es <strong>multiplataforma</strong> y de propósito general. Como su propio nombre indica esta hecho para juegos que tienen sus mapas en forma de tiles (casillas) esto es la gran mayoría de los juegos 2D.</p>
<h2>Características</h2>
<ul>
<li>Mapas tanto ortogonales como isométricos.</li>
<li>Formato de archivo XML.</li>
<li>Soporte para múltiples capas tanto de tiles como de objetos.</li>
<li>Soporte para múltiples tilesets.</li>
<li>Muy personalizable todas las propiedades de mapas con parejas de clave valor.</li>
<li>Soporte de color clave y transparencias.</li>
<li>Tamaño de los tiles y mapas totalmente personalizable.</li>
</ul>
<h3>Mapas ortogonáles e isométricos</h3>
<p>Puedes crear mapas tanto en la vista clásica de los juegos 2D, como en la tan usada simulación del 3D a través de la vista isométrica. En la imagen inferior podemos ver la vista ortogonal.</p>
<p style="text-align: left;"><a href="http://razonartificial.com/wp-content/uploads/2010/12/pruebas.tmx-Tiled_001.png"><img class="size-large wp-image-1232 aligncenter" title="pruebas.tmx - Tiled_001" src="http://razonartificial.com/wp-content/uploads/2010/12/pruebas.tmx-Tiled_001-1024x732.png" alt="" width="574" height="410" /></a>Apreciamos como el editor cuanta con herramientas básicas en la parte superior para el dibujado de mapas como el tampón, el cubo de pintura para rellenar o la goma de borrar, con un par de usos se controlan todas estas herramienta. En la parte derecha nos encontramos con dos paneles, en la parte superior el panel de capas. Desde este panel podemos gestionar en que capa queremos pintar, cambiarles el nombre, ocultarlas o modificarlas. A parte de elegir su transparencia. Debajo de este panel nos encontramos con el panel de tilesets que se gestionan mediante pestañas. Ambos paneles son arrastables y se pueden poner como ventanas flotantes o acomodarlos en cualquier lugar del editor y con cualquier tamaño.</p>
<p style="text-align: left;"><a href="http://razonartificial.com/wp-content/uploads/2010/12/lost_mine.tmx-Tiled_002.png"><img class="aligncenter size-large wp-image-1233" title="lost_mine.tmx - Tiled_002" src="http://razonartificial.com/wp-content/uploads/2010/12/lost_mine.tmx-Tiled_002-1024x732.png" alt="" width="574" height="410" /></a>En la imagen superior podemos ver un mapa isométrico con dos tilesets abiertos.</p>
<h3>Tamaño de los tiles y mapas totalmente personalizable</h3>
<p><img class="aligncenter size-full wp-image-1234" title="Nuevo Mapa_003" src="http://razonartificial.com/wp-content/uploads/2010/12/Nuevo-Mapa_003.png" alt="" width="320" height="245" />Cuando creas un nuevo mapa te da a elegir si será ortogonal o isométrico. También te deja elegir el número de tiles de ancho y alto y el tamaño que tendrán los tiles. Como vemos totalmente configurable.</p>
<h3>Color clave y tilesets</h3>
<p><img class="aligncenter size-full wp-image-1235" title="Nuevo conjunto de Patrones_007" src="http://razonartificial.com/wp-content/uploads/2010/12/Nuevo-conjunto-de-Patrones_007.png" alt="" width="355" height="310" />Cuando se carga un nuevo tileset al mapa nos deja elegir el nombre, la imagen del tileset. El tamaño de los tiles y el margen y espacioado, esto es, la distancia visual en las que el editor debe separar los tilesets para un correcto mapeado. También nos deja elegir si usar color transparente. En el caso de marcarlo podemos escoger un color que representar como transparente, muy útil para si tienes tilesets con un fondo puesto.</p>
<h3>Capas de objetos</h3>
<p>Una característica muy interesante son las capas de objetos. Esto son capas especiales en las que se pueden colocar objetos rectangulares con la precisión a pixel y sin estar ligadas a los tiles.</p>
<p style="text-align: center;"><a href="http://razonartificial.com/wp-content/uploads/2010/12/goblin_warrens.tmx-Tiled_009.png"><img class="aligncenter size-large wp-image-1236" title="goblin_warrens.tmx* - Tiled_009" src="http://razonartificial.com/wp-content/uploads/2010/12/goblin_warrens.tmx-Tiled_009-1024x732.png" alt="" width="574" height="410" /></a></p>
<p style="text-align: left;">Como podemos ver en la imagen superior podemos crear tantas capas de estas como queramos y asignarles diferentes colores y propiedades. Cada objeto que creemos tiene un cuadro de propiedades accesibles desde el boton derecho.<img class="aligncenter size-full wp-image-1237" title="Objeto Propiedades_008" src="http://razonartificial.com/wp-content/uploads/2010/12/Objeto-Propiedades_008.png" alt="" width="345" height="440" /></p>
<p style="text-align: left;">En este cuadro de diálogo podemos configurar diferentes datos del objeto como el nombre, el tipo, la posición, tamaño. Debajo tambiñen tenemos una lista con dos campos nombre y valor. Estas listas nos permitan definir propiedades propias y definir un valor. Como ves muy personalizable tu creas tus propias propiedades y sus valores para tu propio juego.</p>
<p style="text-align: left;">Estos cuadros de propiedades valor no solo estan disponibles en los objetos. También los poseen los tilesets, las capas, los mapas y en realidad casi todos los elementos para que puedas definir propiedades clave valor de casi todo. Debajo podemos ver un ejemplo de las propiedades del mapa y posibles usos. Pare definir una música de fondo, los enemigos, etc. Todo depende de tu proyecto.</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-1238" title="Mapa Propiedades_006" src="http://razonartificial.com/wp-content/uploads/2010/12/Mapa-Propiedades_006.png" alt="" width="306" height="283" /></p>
<h2>El formato TMX</h2>
<p>Una vez tengas tu mapa listo querrás guardarlo para poder usarlo en tu juego, pero ¿Como uso los datos del mapa? Cuando guardas un mapa el programa crea un fichero con extensión <strong>.tmx</strong> esto fichero en realidad no es más que un archivo XML que contiene todo los datos de nuestro mapa. Solo deberemos leer el archivo XML desde nuestro juego (casi todos los lenguajes tienen bibliotecas para trabajar con XML) y usar los datos como creamos convenientes. Veamos un ejemplo.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;map version=&quot;1.0&quot; orientation=&quot;isometric&quot; width=&quot;40&quot; height=&quot;40&quot; tilewidth=&quot;64&quot; tileheight=&quot;32&quot;&gt;
 &lt;properties&gt;
  &lt;property name=&quot;prop_map&quot; value=&quot;25&quot;/&gt;
 &lt;/properties&gt;
 &lt;tileset firstgid=&quot;1&quot; name=&quot;tiled_dungeon&quot; tilewidth=&quot;64&quot; tileheight=&quot;128&quot;&gt;
  &lt;image source=&quot;../graphics/tilesets/tiled_dungeon.png&quot; width=&quot;1024&quot; height=&quot;1920&quot;/&gt;
 &lt;/tileset&gt;
 &lt;layer name=&quot;Capa de Patrones 1&quot; width=&quot;40&quot; height=&quot;40&quot;&gt;
  &lt;properties&gt;
   &lt;property name=&quot;tipo&quot; value=&quot;base&quot;/&gt;
  &lt;/properties&gt;
  &lt;data encoding=&quot;base64&quot; compression=&quot;gzip&quot;&gt;
   H4sIAAAAAAAAA+3SUQoAIQgAUa9Q9z9sN0jMFJUZ8K9dHpYI/WopU8G0L1Pdp+03Yu8W36u9q8+69+z7ffF5zlub5vv9f+/gw2fxeb+f5ou+L3y57x0fPnz48PXwERERUUwH5o9HhQAZAAA=
  &lt;/data&gt;
 &lt;/layer&gt;
 &lt;layer name=&quot;Capa de patrones 2&quot; width=&quot;40&quot; height=&quot;40&quot; visible=&quot;0&quot;&gt;
  &lt;data encoding=&quot;base64&quot; compression=&quot;gzip&quot;&gt;
   H4sIAAAAAAAAA+2V3QrCMAyF8066+f+H3ggK3ikivv9jWGGwWGNYllS9OB8cKGvWnaVNSgQimCfVTPdG/NnqB76q5tvTDrGDwl4kKkNs/UFXZc6bc4u/Poyc7x+Tdo32fjtvbJW5JdnyvlHWetbPmNp/GSZNmIcDm+NaK2tqeyf9lxYv7ROP71M7Vn8Les0R10mIP3/ZnxXub0bt2bkIY+mZ1tMi/JWs/ej8RROdP+nMauL1X8qfN3+l68N7/rz+eH+/CeO8/rQ7WboPvP4i61Pq79Z+mxPpL+I85cCfD/jzAX8+4M+H1t+t6nIfAAAAAOA/eACNJESSABkAAA==
  &lt;/data&gt;
 &lt;/layer&gt;
 &lt;layer name=&quot;Capa de patrones 3&quot; width=&quot;40&quot; height=&quot;40&quot; visible=&quot;0&quot;&gt;
  &lt;data encoding=&quot;base64&quot; compression=&quot;gzip&quot;&gt;
   H4sIAAAAAAAAA+3QMQrAIAxGYa+cpeBcsL1TPZwdHBzE0KGJ4vvgB4cMD0PAbpJ3ALb1vMveEQCA5UnzPupGzrqZzd5nKXoHfHB5B3Ro/3ebVOAvop8AAACgUQAv8zdRABkAAA==
  &lt;/data&gt;
 &lt;/layer&gt;
 &lt;objectgroup name=&quot;Capa de Objetos 1&quot; width=&quot;40&quot; height=&quot;40&quot;&gt;
  &lt;object type=&quot;start&quot; x=&quot;556&quot; y=&quot;650&quot;/&gt;
  &lt;object x=&quot;266&quot; y=&quot;692&quot; width=&quot;149&quot; height=&quot;135&quot;/&gt;
 &lt;/objectgroup&gt;
 &lt;objectgroup color=&quot;#ffaaff&quot; name=&quot;Capa de Objetos 2&quot; width=&quot;40&quot; height=&quot;40&quot;&gt;
  &lt;object x=&quot;188&quot; y=&quot;193&quot; width=&quot;110&quot; height=&quot;92&quot;/&gt;
 &lt;/objectgroup&gt;
&lt;/map&gt;
</pre>
<p>Como puedes ver si te fijas un poco, contiene todo los datos que hemos configurado en nuestro mapa por un sistema de etiquetas XML, nada del otro mundo. Quizás la única parte inquietante sería esta.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;layer name=&quot;Capa de patrones 3&quot; width=&quot;40&quot; height=&quot;40&quot; visible=&quot;0&quot;&gt;
  &lt;data encoding=&quot;base64&quot; compression=&quot;gzip&quot;&gt;
   H4sIAAAAAAAAA+3QMQrAIAxGYa+cpeBcsL1TPZwdHBzE0KGJ4vvgB4cMD0PAbpJ3ALb1vMveEQCA5UnzPupGzrqZzd5nKXoHfHB5B3Ro/3ebVOAvop8AAACgUQAv8zdRABkAAA==
  &lt;/data&gt;
 &lt;/layer&gt;
</pre>
<p>Esta parte como vemos guarda la información de las capas de tiles, pero los datos vienen codificados en <strong>base64</strong> y comprimidos con <strong>gzip</strong>. ¿Por que esto? Por eficiencia, son la parte que más ocupa del archivo ya que contienen la lista de etiquetas de la grilla, algo como esto es lo que pone una vez descomprimido y decodificado.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;tile gid=&quot;17&quot;/&gt;
&lt;tile gid=&quot;17&quot;/&gt;
&lt;tile gid=&quot;5&quot;/&gt;
&lt;tile gid=&quot;8&quot;/&gt;
&lt;tile gid=&quot;0&quot;/&gt;
</pre>
<p>Como ves contiene en orden de arriba a abajo y de izquierda a derecha el tile que tiene la capa empezando por el uno. Es decir si la capa en el primer tile arriba a la izquierda la segunda imagen del tileset entonces contendrá un 2. Es importante resaltar que se empieza a contar en 1 y se deja el 0 para los casillas que no tienen ningún tile.</p>
<p>Los mapas sin comprimir y codificar ocupan entre 40 y 50 veces más, por lo que es altamente recomendable, luego desde el juego y el lenguaje de programación es fácil programar un algoritmo que descomprima y decodifique el mapa.</p>
<p><strong>Página oficial: </strong><a href="http://www.mapeditor.org/">http://www.mapeditor.org/</a></p>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" title="Tileset isometrico &#8211; Grassland">Tileset isometrico &#8211; Grassland</a></li><li><a href="http://razonartificial.com/2011/03/sfml-juego-de-ejemplo/" title="SFML &#8211; Juego de ejemplo">SFML &#8211; Juego de ejemplo</a></li><li><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" title="Iberogre &#8211; Documentación de Ogre en español">Iberogre &#8211; Documentación de Ogre en español</a></li><li><a href="http://razonartificial.com/2011/03/gfxplace-graficos-para-juegos-gratuitos/" title="GfxPlace &#8211; Gráficos para juegos gratuitos">GfxPlace &#8211; Gráficos para juegos gratuitos</a></li><li><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" title="Gran Pack de desarrollo de videojuegos">Gran Pack de desarrollo de videojuegos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/7nxxdBAzVgNRlcQlN4tUokiLCh0/0/da"><img src="http://feedads.g.doubleclick.net/~a/7nxxdBAzVgNRlcQlN4tUokiLCh0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7nxxdBAzVgNRlcQlN4tUokiLCh0/1/da"><img src="http://feedads.g.doubleclick.net/~a/7nxxdBAzVgNRlcQlN4tUokiLCh0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/UnriMncO6G4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/12/tiled-map-editor-el-editor-de-mapas-libre/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/12/tiled-map-editor-el-editor-de-mapas-libre/</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é [...]]]></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>
<ul class="related_post"><li>No hay entradas relacionadas.</li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/Q-EUFkGiMCqk_6-1qwRw-DZALyM/0/da"><img src="http://feedads.g.doubleclick.net/~a/Q-EUFkGiMCqk_6-1qwRw-DZALyM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Q-EUFkGiMCqk_6-1qwRw-DZALyM/1/da"><img src="http://feedads.g.doubleclick.net/~a/Q-EUFkGiMCqk_6-1qwRw-DZALyM/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" title="Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS">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/" title="Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia">Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo II">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo I">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li><a href="http://razonartificial.com/2010/08/arboles-e-inteligencia-artificial/" title="Arboles e inteligencia Artificial">Arboles e inteligencia Artificial</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/OhvUa4UK_LcdwxbmtPf2HWi8KUY/0/da"><img src="http://feedads.g.doubleclick.net/~a/OhvUa4UK_LcdwxbmtPf2HWi8KUY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/OhvUa4UK_LcdwxbmtPf2HWi8KUY/1/da"><img src="http://feedads.g.doubleclick.net/~a/OhvUa4UK_LcdwxbmtPf2HWi8KUY/1/di" border="0" ismap="true"></img></a></p><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 isometrico &#8211; GrasslandTileset isométrico de gran calidadCrear tiles isométricos 2D con BlenderGráficos para prototipos de juegosPack de gráficos para juegos]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" title="Tileset isometrico &#8211; Grassland">Tileset isometrico &#8211; Grassland</a></li><li><a href="http://razonartificial.com/2010/12/tileset-isometrico-de-gran-calidad/" title="Tileset isométrico de gran calidad">Tileset isométrico de gran calidad</a></li><li><a href="http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/" title="Crear tiles isométricos 2D con Blender">Crear tiles isométricos 2D con Blender</a></li><li><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" title="Gráficos para prototipos de juegos">Gráficos para prototipos de juegos</a></li><li><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" title="Pack de gráficos para juegos">Pack de gráficos para juegos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/7KrgMyzxEfI13KFkic89L0QYM74/0/da"><img src="http://feedads.g.doubleclick.net/~a/7KrgMyzxEfI13KFkic89L0QYM74/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7KrgMyzxEfI13KFkic89L0QYM74/1/da"><img src="http://feedads.g.doubleclick.net/~a/7KrgMyzxEfI13KFkic89L0QYM74/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/08/gamedevlesson-crear-videojuegos/" title="GameDevLesson – Crear videojuegos">GameDevLesson – Crear videojuegos</a></li><li><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" title="Gran Pack de desarrollo de videojuegos">Gran Pack de desarrollo de videojuegos</a></li><li><a href="http://razonartificial.com/2010/08/conceptos-de-diseno-de-videojuegos/" title="Conceptos de Diseño de Videojuegos">Conceptos de Diseño de Videojuegos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/V5xRcqpx-YKoAkrBwGm0mW_cJkg/0/da"><img src="http://feedads.g.doubleclick.net/~a/V5xRcqpx-YKoAkrBwGm0mW_cJkg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/V5xRcqpx-YKoAkrBwGm0mW_cJkg/1/da"><img src="http://feedads.g.doubleclick.net/~a/V5xRcqpx-YKoAkrBwGm0mW_cJkg/1/di" border="0" ismap="true"></img></a></p><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; [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/02/tileset-isometrico-grassland/" title="Tileset isometrico &#8211; Grassland">Tileset isometrico &#8211; Grassland</a></li><li><a href="http://razonartificial.com/2010/12/otro-tileset-isometrico-muy-bueno-cavernas/" title="Otro tileset isométrico muy bueno &#8211; Cavernas">Otro tileset isométrico muy bueno &#8211; Cavernas</a></li><li><a href="http://razonartificial.com/2011/03/crear-tiles-isometricos-2d-con-blender/" title="Crear tiles isométricos 2D con Blender">Crear tiles isométricos 2D con Blender</a></li><li><a href="http://razonartificial.com/2010/08/graficos-para-prototipos-de-juegos/" title="Gráficos para prototipos de juegos">Gráficos para prototipos de juegos</a></li><li><a href="http://razonartificial.com/2010/07/pack-de-graficos-libres/" title="Pack de gráficos para juegos">Pack de gráficos para juegos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/TA2EMaWXocjku1niezdUDET26HU/0/da"><img src="http://feedads.g.doubleclick.net/~a/TA2EMaWXocjku1niezdUDET26HU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/TA2EMaWXocjku1niezdUDET26HU/1/da"><img src="http://feedads.g.doubleclick.net/~a/TA2EMaWXocjku1niezdUDET26HU/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/11/tutorial-xna-1-preparandonos-para-trabajar/" title="Tutorial XNA 1 – Preparándonos para trabajar">Tutorial XNA 1 – Preparándonos para trabajar</a></li><li><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" title="Una introducción a la STL I &#8211; Introducción a los contenedores">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/rcLLFylfA6inrLImQ-zR7NFQ-OI/0/da"><img src="http://feedads.g.doubleclick.net/~a/rcLLFylfA6inrLImQ-zR7NFQ-OI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rcLLFylfA6inrLImQ-zR7NFQ-OI/1/da"><img src="http://feedads.g.doubleclick.net/~a/rcLLFylfA6inrLImQ-zR7NFQ-OI/1/di" border="0" ismap="true"></img></a></p><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>1</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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectore/" title="Geometría espacial. Vectores">Geometría espacial. Vectores</a></li><li><a href="http://razonartificial.com/2010/10/funcion-matematica/" title="Función matemática">Función matemática</a></li><li><a href="http://razonartificial.com/2010/10/eje-cartesiano-y-punto/" title="El eje cartesiano y el punto">El eje cartesiano y el punto</a></li><li><a href="http://razonartificial.com/2010/10/funciones-de-segundo-grado/" title="Funciones de segundo Grado">Funciones de segundo Grado</a></li><li><a href="http://razonartificial.com/2010/10/hablemos-de-fisica-y-matematicas/" title="Hablemos de física y matemáticas">Hablemos de física y matemáticas</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/8FFUXweTt9qwkI7A3de4neKhmuE/0/da"><img src="http://feedads.g.doubleclick.net/~a/8FFUXweTt9qwkI7A3de4neKhmuE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8FFUXweTt9qwkI7A3de4neKhmuE/1/da"><img src="http://feedads.g.doubleclick.net/~a/8FFUXweTt9qwkI7A3de4neKhmuE/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/11/tutorial-xna-2-entendiendo-el-codigo/" title="Tutorial XNA 2 &#8211; Entendiendo el código">Tutorial XNA 2 &#8211; Entendiendo el código</a></li><li><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" title="Una introducción a la STL I &#8211; Introducción a los contenedores">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/03/sfml-manejando-eventos/" title="SFML &#8211; Manejando eventos">SFML &#8211; Manejando eventos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/lQHB_kivGvnM36NYfto4hrLNjus/0/da"><img src="http://feedads.g.doubleclick.net/~a/lQHB_kivGvnM36NYfto4hrLNjus/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/lQHB_kivGvnM36NYfto4hrLNjus/1/da"><img src="http://feedads.g.doubleclick.net/~a/lQHB_kivGvnM36NYfto4hrLNjus/1/di" border="0" ismap="true"></img></a></p><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é [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/02/guia-aprender-programar-videojuegos-con-cpp/" title="Guía aprender programar videojuegos con C++">Guía aprender programar videojuegos con C++</a></li><li><a href="http://razonartificial.com/2012/01/curso-cpp-primer-juego-game-over/" title="[Curso C++] &#8211; Primer Juego &#8211; Game Over!">[Curso C++] &#8211; Primer Juego &#8211; Game Over!</a></li><li><a href="http://razonartificial.com/2012/01/curso-de-videojuegos-en-cpp-presentacion/" title="Curso de Videojuegos en C++ &#8211; Presentación">Curso de Videojuegos en C++ &#8211; Presentación</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scenemanager/" title="[BGE] La clase SceneManager">[BGE] La clase SceneManager</a></li><li><a href="http://razonartificial.com/2011/09/bge-la-clase-scene/" title="[BGE] La clase Scene">[BGE] La clase Scene</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/jSerUJxBogiDka-mkXRax0OMJ4U/0/da"><img src="http://feedads.g.doubleclick.net/~a/jSerUJxBogiDka-mkXRax0OMJ4U/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/jSerUJxBogiDka-mkXRax0OMJ4U/1/da"><img src="http://feedads.g.doubleclick.net/~a/jSerUJxBogiDka-mkXRax0OMJ4U/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/" title="Geometría espacial. Vectores II">Geometría espacial. Vectores II</a></li><li><a href="http://razonartificial.com/2011/03/iberogre-documentacion-de-ogre-en-espanol/" title="Iberogre &#8211; Documentación de Ogre en español">Iberogre &#8211; Documentación de Ogre en español</a></li><li><a href="http://razonartificial.com/2010/12/gran-pack-de-desarrollo-de-videojuegos/" title="Gran Pack de desarrollo de videojuegos">Gran Pack de desarrollo de videojuegos</a></li><li><a href="http://razonartificial.com/2010/10/funciones-de-segundo-grado/" title="Funciones de segundo Grado">Funciones de segundo Grado</a></li><li><a href="http://razonartificial.com/2010/10/funcion-matematica/" title="Función matemática">Función matemática</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/KtjExWZ7RHUFcYFQ8LSZnRScaXg/0/da"><img src="http://feedads.g.doubleclick.net/~a/KtjExWZ7RHUFcYFQ8LSZnRScaXg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/KtjExWZ7RHUFcYFQ8LSZnRScaXg/1/da"><img src="http://feedads.g.doubleclick.net/~a/KtjExWZ7RHUFcYFQ8LSZnRScaXg/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2012/03/una-introduccion-a-la-stl-i-introduccion-a-los-contenedores/" title="Una introducción a la STL I &#8211; Introducción a los contenedores">Una introducción a la STL I &#8211; Introducción a los contenedores</a></li><li><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" title="Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS">Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo I">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li><a href="http://razonartificial.com/2010/08/arboles-e-inteligencia-artificial/" title="Arboles e inteligencia Artificial">Arboles e inteligencia Artificial</a></li><li><a href="http://razonartificial.com/2010/08/algoritmo-minimax-un-jugador-incansable/" title="Algoritmo Minimax, un jugador incansable">Algoritmo Minimax, un jugador incansable</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/DGLpOWXnxPg0mkz11mPnE7aCoaA/0/da"><img src="http://feedads.g.doubleclick.net/~a/DGLpOWXnxPg0mkz11mPnE7aCoaA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/DGLpOWXnxPg0mkz11mPnE7aCoaA/1/da"><img src="http://feedads.g.doubleclick.net/~a/DGLpOWXnxPg0mkz11mPnE7aCoaA/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" title="Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS">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/" title="Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia">Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo II">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li><a href="http://razonartificial.com/2010/10/introduccion-a-la-ia-en-los-juegos/" title="Introducción a la IA en los juegos">Introducción a la IA en los juegos</a></li><li><a href="http://razonartificial.com/2010/08/orts-estrategia-en-tiempo-real-opensource/" title="ORTS. Estrategia en tiempo real OpenSource">ORTS. Estrategia en tiempo real OpenSource</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/QVYHy9334jkMjZ7RaWk6vz63SFE/0/da"><img src="http://feedads.g.doubleclick.net/~a/QVYHy9334jkMjZ7RaWk6vz63SFE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/QVYHy9334jkMjZ7RaWk6vz63SFE/1/da"><img src="http://feedads.g.doubleclick.net/~a/QVYHy9334jkMjZ7RaWk6vz63SFE/1/di" border="0" ismap="true"></img></a></p><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 [...]]]></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>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo II">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo I">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/" title="Introducción a la IA en los juegos">Introducción a la IA en los juegos</a></li><li><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" title="Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS">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/" title="Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia">Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/SGwvjTYzrs1q3ZJZB5-S6CoRcgo/0/da"><img src="http://feedads.g.doubleclick.net/~a/SGwvjTYzrs1q3ZJZB5-S6CoRcgo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SGwvjTYzrs1q3ZJZB5-S6CoRcgo/1/da"><img src="http://feedads.g.doubleclick.net/~a/SGwvjTYzrs1q3ZJZB5-S6CoRcgo/1/di" border="0" ismap="true"></img></a></p><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>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/tecnicas-de-ia-en-los-videojuegos/</feedburner:origLink></item>
		<item>
		<title>Introducción a la IA en los juegos</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/hUktZh9JUX4/</link>
		<comments>http://razonartificial.com/2010/10/introduccion-a-la-ia-en-los-juegos/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 02:50:46 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Teoría]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=950</guid>
		<description><![CDATA[En el sentido más amplio la mayoría de los juegos incorporan algún tipo de inteligencia artificial (IA). Los desarrolladores han usado durante años la IA para dar vida a personajes aparentemente inteligentes en innumerables juegos. Desde los los fantasmas del clásico Pacman, los bots del juego en primera persona Unreal y muchos más de diferentes estilos. La gran variedad de géneros y personajes distintos requiere una interpretación bastante amplia de lo que se considera [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		H3 { margin-bottom: 0.21cm } 		H3.western { font-family: "Arial", sans-serif } 		H3.ctl { font-family: "Lohit Hindi" } 		H2 { margin-bottom: 0.21cm } 		H2.western { font-family: "Arial", sans-serif; font-size: 14pt; font-style: italic } 		H2.cjk { font-size: 14pt; font-style: italic } 		H2.ctl { font-family: "Lohit Hindi"; font-size: 14pt; font-style: italic } 		A:link { so-language: zxx } --><img class="size-full wp-image-13 alignright imageborder" title="ia-150x150" src="http://razonartificial.com/wp-content/uploads/2010/01/ia-150x150.jpg" alt="" width="150" height="150" /></p>
<p>En el sentido más amplio la mayoría de los juegos incorporan algún tipo de inteligencia artificial (IA). Los desarrolladores han usado durante años la IA para dar vida a personajes aparentemente inteligentes en innumerables juegos. Desde los los fantasmas del clásico Pacman, los bots del juego en primera persona Unreal y muchos más de diferentes estilos. La gran variedad de géneros y personajes distintos requiere una interpretación bastante amplia de lo que se considera IA en un juego. De hecho, es uno de los debates de la IA, que se considera realmente inteligencia artificial.</p>
<p>Algunos desarrolladores consideran tareas como la búsqueda de caminos como parte de la IA del juego. Steven Woodcock dijo en en la “Game Developer&#8217;s Conference” de 2003 que algunos desarrolladores aún consideran la detección de colisiones como parte de la IA. Claramente existen muchas interpretaciones de lo que se considera IA.</p>
<p>Nosotros vamos a tener una interpretación amplia de la IA y vamos a incluirlo todo como parte de la misma, desde la simple persecución y evasión para patrones de movimientos hasta las redes neuronales y algorítmos genéticos. La IA de videojuegos probablemente se adapte de mejor a la IA débil (ver más abajo). Sin embargo, se puede pensar en en la IA de juegos en términos aún más amplios.</p>
<p>En los juegos no siempre estamos interesados en dar a los personajes no jugadores inteligencia de nivel humano. Tal vez estamos escribiendo código para controlar las criaturas no humanas, tales como dragones, robots, o incluso roedores. Además, ¿Quién dice que siempre tenemos que hacer a los jugadores no-humanos inteligentes? Hacer algunos personajes no inteligentes puede agregar al juego variedad y riqueza. Aunque es cierto que a menudo la IA de los juegos esta llamada a resolver problemas bastante complejos, podemos emplear la IA para cosas mas simples como tener personajes con diferentes personalidades o que actúen según nuestras acciones.</p>
<h3>Definición de IA</h3>
<p>La pregunta ¿Qué es la inteligencia artificial? No es fácil de responder. Si usted busca inteligencia artificial en un diccionario probablemente encuentre algo parecido a lo siguiente: “La capacidad de un ordenador u otra máquina para llevar a cabo tareas que normalmente se considera que requieren inteligencia”. Esta definición proviene de The American Heritage Dictionary del Idioma Inglés, Cuarta Edición (Houghton Mifflin Company). Sin embargo otras fuentes definen la inteligencia artificial como el proceso o la ciencia de la creación de máquinas inteligentes.</p>
<p>Desde otra perspectiva, es apropiado pensar en la IA como el comportamiento inteligente exhibido por el equipo que ha sido creado, o tal vez los cerebros artificiales detrás de ese comportamiento inteligente. Pero incluso esta interpretación no es completa. Para algunas personas, el estudio de la IA no es necesariamente para el propósito de crear máquinas inteligentes, sino con el propósito de obtener un mejor conocimiento de la naturaleza de la inteligencia humana. Y otros métodos de estudio de inteligencia artificial para crear máquinas que presentan una forma limitada de la inteligencia.</p>
<p>Esto plantea la pregunta: &#8220;¿qué es la inteligencia?&#8221; Para algunos, la prueba de fuego para la IA es lo cerca que está a la inteligencia humana. Otros sostienen que los requisitos adicionales deben cumplirse para que una máquina para ser considerado inteligente. Algunas personas dicen que la inteligencia requiere una conciencia y de que las emociones se encuentran estrechamente ligados a la inteligencia, mientras que otros dicen que la capacidad de resolver un problema que requiere de inteligencia si llegara a resolverse por un ser humano no es suficiente, también debe aprender y adaptarse para ser considerado inteligente.</p>
<p>LA IA que cumple todos estos requisitos se considera IA Fuerte. A diferencia de la IA Fuerte, existe la IA a débil que incluye una gama más amplia de propósitos y tecnologías. Los juegos entran en la categoría de la IA débil.</p>
<p>La conclusión es que la definición de IA es bastante amplia y flexible. Todo lo que da la ilusión de inteligencia a un nivel adecuado hace los juegos mas inmersivos, desafiantes y, lo más importante, más divertidos.</p>
<h2>IA determinista vs no determinista</h2>
<p>La IA de los juegos se puede considerar de dos tipos, determinista y no determinista.</p>
<h3>Determinista</h3>
<p>El comportamiento es especificado y predecible, no hay ninguna incertidumbre. Un ejemplo de IA determinista es un algoritmo de persecución simple. Usted puede explícitamente designar un personaje no jugador para moverse hacia algún punto objetivo. El algoritmo consistirá en moverse por los ejes x e y hasta alcanzar el punto objetivo.</p>
<h3>No determinista</h3>
<p>Es lo contrario al determinismo. El comportamiento tiene un grado de incertidumbre y es algo imprevisible (el grado de incertidumbre depende de el método de IA empleado y lo bien aplicado que esté). Un ejemplo de comportamiento no determinismo es un personaje no jugador que aprende a adaptarse a las tácticas bélicas de un jugador. Tal estudio podría ser una red neuronal o un algoritmo genético.</p>
<p>Las técnicas deterministas son el pan y la mantequilla de la IA de videojuegos. Estas técnicas son predecibles, rápidas y fáciles de implementar, entender, probar y depurar. A pesar de que tienen mucho a su favor. Las conductas deterministas hacen que todo tenga que programarse de manera explícita por los desarrolladores. Además, los métodos deterministas no facilitan el aprendizaje o la evolución y después de un rato de juego los comportamientos deterministas tienden a volverse predecibles.</p>
<p>En los métodos no deterministas se facilita el aprendizaje y el juego se vuelve más impredecible. Además los desarrolladores no tienen en el código explícitamente todas las conductas posibles en todos los escenarios posibles. Los métodos no deterministas pueden explorar y aprender por su cuenta, y pueden promover un comportamiento emergente o que no siga instrucciones explícitas. Las redes neuronales son buenos ejemplos de esto.</p>
<p>Los desarrolladores tradicionalmente han usado poco la IA no determinista, aunque esto está cambiando poco a poco. La imprevisibilidad es difícil de probar y depurar, ¿Cómo se puede probar todas las posibles variaciones de la acción del jugador para asegurarse de que el juego no hace cosas estúpidas en algunos casos?</p>
<p>Al menos hasta hace poco, otro factor que ha limitado el desarrollo de juegos de IA es el hecho de que los desarrolladores se han centrado la mayor parte de su atención en la calidad de los gráficos. Como resultado, el enfoque como en el desarrollo de mejores y más rápidas técnicas gráficas, incluyendo la aceleración de hardware, ahora puede permitirse más recursos que deben asignarse hacia el desarrollo de mejores y más sofisticada IA. Este hecho, junto con la presión para producir el exitoso juego que viene, está animando a los desarrolladores de juegos para explorar más a fondo las técnicas no deterministas.</p>
<h2>Estableciendo técnicas de ia en juegos</h2>
<p>Tal vez la técnica más utilizada sea hacer trampa. Por ejemplo, en un juego de simulación de guerra, el ordenador puede tener acceso a toda la información sobre sus oponentes humanos de ubicación de su base, el tipo, número y ubicación de las unidades, etc, sin tener que enviar exploradores para reunir información de inteligencia como debe hacer el jugador humano. Hacer trampa de esta manera es común y ayuda a dar al ordenador una ventaja frente a los jugadores humanos inteligentes. Sin embargo, el engaño puede ser malo. Si es obvio para el jugador que el equipo está haciendo trampa, el jugador es probable que asuma sus esfuerzos son inútiles y perder interés en el juego. Además, el engaño no balanceado puede dar a la computadora demasiado poder, lo que hace imposible que el jugador pueda vencer a la computadora. Una vez más, el jugador puede perder interés si ve que sus esfuerzos son inútiles. Hacer trampa debe ser equilibrado para crear un suficiente de un desafío para el jugador para mantener el juego interesante y divertido.</p>
<p>Por supuesto, el engaño no es la única técnica de IA bien establecida. máquinas de estados finitos son una técnica de IA muy usada en todas partes. En otros artículos las veremos en detalle, pero básicamente la idea es enumerar un montón de acciones o estados de personajes controlados por computadora y ejecutarlos o de transición entre ellos utilizando condicionales que comprueban varias condiciones y criterios.</p>
<p>Otras técnicas usadas habitualmente es la lógica difusa, una máquina de lógica difusa mejora la maquina de estado finito y hace el juego menos predecible. Por ejemplo, podemos tener la condición de que si distancia=10 y vida=100 entonces atacar, pero esto es muy predecible. Mejor hacer algo como si distancia=cerca y vida &gt; 75% entonces atacar. Esto hace que el juego sea menos predecible ya que cerca puede variar según el enemigo y su capacidad de ataque y la vida puede ser diferente de uno a otro. En otro artículo lo veremos más a fondo.</p>
<p>Por último no podemos olvidarnos te algo elemental en casi todo los juegos como es la búsqueda de caminos por parte de los no-jugadores, caminos que sean rápidos y eficientes. Hemos visto variso artículos de pathfinding.</p>
<p>Este artículo es una introducción a la programación de inteligencia artificial para videojuegos, en artículos posteriores empezaremos a explicar algunas de las técnicas aquí nombradas y otra muchas.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo I">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li><a href="http://razonartificial.com/2011/04/modelado-del-daimyo-artificial-optimizando-la-extraccion-de-recursos-en-juegos-rts/" title="Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS">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/" title="Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia">Sun Tzu 2.0 &#8211; El Arte de la guerra en los juegos de Estrategia</a></li><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-ii/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo II">IA en videojuegos &#8211; Persiguiendo y evadiendo II</a></li><li><a href="http://razonartificial.com/2010/10/tecnicas-de-ia-en-los-videojuegos/" title="Técnicas de IA en los videojuegos">Técnicas de IA en los videojuegos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/hCTT07UQ17fC0N0rAt8a10r6mak/0/da"><img src="http://feedads.g.doubleclick.net/~a/hCTT07UQ17fC0N0rAt8a10r6mak/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/hCTT07UQ17fC0N0rAt8a10r6mak/1/da"><img src="http://feedads.g.doubleclick.net/~a/hCTT07UQ17fC0N0rAt8a10r6mak/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/hUktZh9JUX4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/introduccion-a-la-ia-en-los-juegos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/introduccion-a-la-ia-en-los-juegos/</feedburner:origLink></item>
		<item>
		<title>Funciones de segundo Grado</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/YpMAMUushso/</link>
		<comments>http://razonartificial.com/2010/10/funciones-de-segundo-grado/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 14:38:28 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Matemáticas]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=936</guid>
		<description><![CDATA[Las funciones de segundo grado o parabólicas tienen mucho uso dentro del mundo de los videojuegos, piensa en Super Mario o en cualquier juego de plataformas 2D que hayas jugado. Cuando saltas el movimiento que describe el personaje es un movimiento parabólico que se puede obtener con una función de segundo grado. Tienen el siguiente aspecto. Donde a, b y c son números. Si a vale 0 nos quedaría. Que ya no sería una [...]]]></description>
			<content:encoded><![CDATA[<p>Las funciones de segundo grado o parabólicas tienen mucho uso dentro del mundo de los videojuegos, piensa en Super Mario o en cualquier juego de plataformas 2D que hayas jugado. Cuando saltas el movimiento que describe el personaje es un movimiento parabólico que se puede obtener con una función de segundo grado. Tienen el siguiente aspecto.</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3D%20%7Bax%7D%5E%7B2%7D%2Bbx%2Bc&#038;bg=T&#038;fg=000000&#038;s=0' alt='y= {ax}^{2}+bx+c' title='y= {ax}^{2}+bx+c' class='latex' />
<p>Donde a, b y c son números. Si a vale 0 nos quedaría.</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3Dbx%2Bc&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=bx+c' title='y=bx+c' class='latex' />
<p>Que ya no sería una parábola sino una recta como vimos en el artículo anterior. La gráfica de la parábola es la siguiente.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2010/10/parabola.png" alt="" title="parabola" width="500" height="300" class="aligncenter size-full wp-image-937" /></p>
<p>Esta sería la parábola más básica, la del tipo:</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3D%7Bx%7D%5E%7B2%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='y={x}^{2}' title='y={x}^{2}' class='latex' />
<p>Para dibujar su gráfica podríamos usar el método de ir dándole valores a la x y obtener sus respectivas y, pero necesitaríamos muchos puntos para poder dibujar bien, lo mejor es buscar los puntos claves. Los puntos de corte con los ejes y el vértice.</p>
<p>Veamos un ejemplo, representar la siguiente parábola:</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3D%7B2x%7D%5E%7B2%7D%2B5x%2B2&#038;bg=T&#038;fg=000000&#038;s=0' alt='y={2x}^{2}+5x+2' title='y={2x}^{2}+5x+2' class='latex' />
<p>Para saber en que punto corta al eje y debemos darle a la x el valor 0, así sabremos cuanto vale la y en el eje.</p>
<p><img src='http://s.wordpress.com/latex.php?latex=y%3D%7B2%280%29%7D%5E%7B2%7D%2B5%280%29%2B2&#038;bg=T&#038;fg=000000&#038;s=0' alt='y={2(0)}^{2}+5(0)+2' title='y={2(0)}^{2}+5(0)+2' class='latex' /><br />
<img src='http://s.wordpress.com/latex.php?latex=y%3D2&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=2' title='y=2' class='latex' /></p>
<p>Bien ya tenemos un punto de nuestra parábola.<br />
<img src='http://s.wordpress.com/latex.php?latex=P%5Cleft%28%200%2C2%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='P\left( 0,2\right)' title='P\left( 0,2\right)' class='latex' /></p>
<p>Ahora calculemos los puntos de corte con el eje x, esto lo hacemos dando a la y el valor 0. Nos daría la siguiente ecuación.</p>
<img src='http://s.wordpress.com/latex.php?latex=%7B2%280%29%7D%5E%7B2%7D%2B5%280%29%2B2%3D0&#038;bg=T&#038;fg=000000&#038;s=0' alt='{2(0)}^{2}+5(0)+2=0' title='{2(0)}^{2}+5(0)+2=0' class='latex' />
<p>Que es una ecuación de segundo grado que se resuelve con la siguiente fórmula.</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3D%20%5Cfrac%7B-b%5Cpm%5Csqrt%7B%7Bb%7D%5E%7B2%7D-4ac%7D%7D%7B2a%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='y= \frac{-b\pm\sqrt{{b}^{2}-4ac}}{2a}' title='y= \frac{-b\pm\sqrt{{b}^{2}-4ac}}{2a}' class='latex' />
<p>Sustituimos valores y obtenemos dos puntos (recuerda que una raiz devuelve dos valores uno con signo más y otro con signo menos).</p>
<p><img src='http://s.wordpress.com/latex.php?latex=Q%5Cleft%28%20-%5Cfrac%7B1%7D%7B2%7D%2C0%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='Q\left( -\frac{1}{2},0\right)' title='Q\left( -\frac{1}{2},0\right)' class='latex' /><br />
<img src='http://s.wordpress.com/latex.php?latex=R%5Cleft%28%20-2%2C0%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='R\left( -2,0\right)' title='R\left( -2,0\right)' class='latex' /></p>
<p>Por último calculamos el vértice de la parábola que viene dado por la siguiente fórmula.</p>
<img src='http://s.wordpress.com/latex.php?latex=v%3D%5Cfrac%7B-b%7D%7B2a%7D%20%3D%20%5Cfrac%7B-5%7D%7B4%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='v=\frac{-b}{2a} = \frac{-5}{4}' title='v=\frac{-b}{2a} = \frac{-5}{4}' class='latex' />
<p>Este es el valor de la x del vértice, para hallar su y simplemente sustituimos el valor en la función.</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3D%7B2%28%5Cfrac%7B-5%7D%7B4%7D%29%7D%5E%7B2%7D%2B5%28%5Cfrac%7B-5%7D%7B4%7D%29%2B2&#038;bg=T&#038;fg=000000&#038;s=0' alt='y={2(\frac{-5}{4})}^{2}+5(\frac{-5}{4})+2' title='y={2(\frac{-5}{4})}^{2}+5(\frac{-5}{4})+2' class='latex' />
<p>Resolvemos y tenemos que el vértice es el punto.</p>
<img src='http://s.wordpress.com/latex.php?latex=V%5Cleft%28%20-%5Cfrac%7B5%7D%7B4%7D%2C-%5Cfrac%7B9%7D%7B8%7D%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='V\left( -\frac{5}{4},-\frac{9}{8}\right)' title='V\left( -\frac{5}{4},-\frac{9}{8}\right)' class='latex' />
<p>Ahora solo nos queda marcar los puntos en el eje de coordenadas y obtener la gráfica.</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2010/10/parabola2.png" alt="" title="parabola2" width="500" height="300" class="aligncenter size-full wp-image-939" /></p>
<h2>En los videojuegos</h2>
<p>Como dijimos al principio, los videojuegos de plataforma 2D utilizan la parábola para realizar saltos. La siguiente parábola.</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3D-%7Bx%7D%5E%7B2%7D&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=-{x}^{2}' title='y=-{x}^{2}' class='latex' />
<p>Tiene la siguiente gráfica.<br />
<img src="http://razonartificial.com/wp-content/uploads/2010/10/parabola_salto.png" alt="" title="parabola_salto" width="500" height="300" class="aligncenter size-full wp-image-940" /></p>
<p>Por lo que es fácil ver como simula los saltos de los videojuegos de plataforma 2D, perfectamente. En realidad es una parábola, pero esta se calcula con cinemática, concretamente con el tiro parabólico, que algún día veremos en un artículo de física.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/" title="Geometría espacial. Vectores II">Geometría espacial. Vectores II</a></li><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectore/" title="Geometría espacial. Vectores">Geometría espacial. Vectores</a></li><li><a href="http://razonartificial.com/2010/10/funcion-matematica/" title="Función matemática">Función matemática</a></li><li><a href="http://razonartificial.com/2010/10/eje-cartesiano-y-punto/" title="El eje cartesiano y el punto">El eje cartesiano y el punto</a></li><li><a href="http://razonartificial.com/2010/10/hablemos-de-fisica-y-matematicas/" title="Hablemos de física y matemáticas">Hablemos de física y matemáticas</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/1ctnjtSNtzwwWyJaCdwVAZv6YhM/0/da"><img src="http://feedads.g.doubleclick.net/~a/1ctnjtSNtzwwWyJaCdwVAZv6YhM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/1ctnjtSNtzwwWyJaCdwVAZv6YhM/1/da"><img src="http://feedads.g.doubleclick.net/~a/1ctnjtSNtzwwWyJaCdwVAZv6YhM/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/YpMAMUushso" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/funciones-de-segundo-grado/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/funciones-de-segundo-grado/</feedburner:origLink></item>
		<item>
		<title>Función matemática</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/ZQl2MbtOHJ8/</link>
		<comments>http://razonartificial.com/2010/10/funcion-matematica/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 00:32:48 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Matemáticas]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Análisis]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=930</guid>
		<description><![CDATA[Una función es una ley que asigna a cada elemento de un conjunto un único elemento de otro. Con esto una función hace que estos dos elementos estén relacionados. En el caso de ambos conjuntos sean los números reales se llamará función real de variable real. Habitualmente lo expresamos Se lee: &#8220;y es igual a f de x&#8221; ó &#8220;y es función de x&#8221;, asimismo la &#8220;x&#8221; se llama variable independiente y la &#8220;y&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Una función es una ley que asigna a cada elemento de un conjunto un único elemento de otro. Con esto una función hace que estos dos elementos estén relacionados. En el caso de ambos conjuntos sean los números reales se llamará función real de variable real. Habitualmente lo expresamos</p>
<img src='http://s.wordpress.com/latex.php?latex=y%20%3D%20f%28x%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='y = f(x)' title='y = f(x)' class='latex' />
<p>Se lee: &#8220;y es igual a f de x&#8221; ó &#8220;y es función de x&#8221;, asimismo la &#8220;x&#8221; se llama variable independiente y la &#8220;y&#8221; variable dependiente. Esto es así porque a la x podremos darle el valor que queramos, pero la y dependerá de este valor que le demos a esta x. Es por eso que en una función a cada valor de de x le corresponde un único valor de y. Y solamente uno, es decir, en toda función solo existen un par de valores.</p>
<h2>Funciones polinómicas</h2>
<p>Son las más básicas y representan una recta. son del tipo:</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3Dax%2Bb&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=ax+b' title='y=ax+b' class='latex' />
<p>Por ejemplo, si te encuentras con la siguiente funciones:</p>
<p><img src='http://s.wordpress.com/latex.php?latex=y%3D4x%2B5&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=4x+5' title='y=4x+5' class='latex' /><br />
<img src='http://s.wordpress.com/latex.php?latex=y%3D3x&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=3x' title='y=3x' class='latex' /><br />
<img src='http://s.wordpress.com/latex.php?latex=y%3D3&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=3' title='y=3' class='latex' /></p>
<p>Tienes que saber de ante mano que representan una recta, podemos comprobarlo, creando una table de valores. Elegimos un par de valores de x y calculamos los valores de y.</p>
<p class="consejo">Una recta tiene infinitos puntos, pero con solo calcular dos podemos dibujarla</p>
<p class="consejo">Puedes usar los valores que quieras para calcular dos puntos de la recta, pero se práctico y usa valores sencillos como 0, 1, -1, 2. Según el caso es conveniente usar unos números u otros.</p>
<p>Por ejemplo representemos la siguiente recta:</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3D4x%2B5&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=4x+5' title='y=4x+5' class='latex' />
<p>Tomaremos los valores 0 y 1 para la x y calcular sus respectivas y.</p>
<p><img src='http://s.wordpress.com/latex.php?latex=y%3D4%280%29%2B5%20%3D%205&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=4(0)+5 = 5' title='y=4(0)+5 = 5' class='latex' /><br />
<img src='http://s.wordpress.com/latex.php?latex=y%3D4%281%29%2B5%20%3D%209&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=4(1)+5 = 9' title='y=4(1)+5 = 9' class='latex' /></p>
<p>Por lo que obtenemos dos puntos que pasan por nuestra recta:</p>
<p><img src='http://s.wordpress.com/latex.php?latex=P%5Cleft%28%200%2C5%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='P\left( 0,5\right)' title='P\left( 0,5\right)' class='latex' /><br />
<img src='http://s.wordpress.com/latex.php?latex=Q%5Cleft%28%201%2C9%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='Q\left( 1,9\right)' title='Q\left( 1,9\right)' class='latex' /></p>
<p>Uniéndolos ya tenemos la recta:</p>
<p><img src="http://razonartificial.com/wp-content/uploads/2010/10/grafica_recta-300x180.png" alt="" title="grafica_recta" width="300" height="180" class="aligncenter size-medium wp-image-932" /></p>
<p>La tabla de valores está bastante bien para casos simples, pero cuando se trata con funciones más complejas calcular los valores de y no es tan sencillo y no todas las funciones se pueden dibujar con dos puntos.</p>
<p>Si nos fijamos en la ecuación veremos que cuando la x vale 0, es decir, cuando corta al eje y. nos queda</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3Da%280%29%2Bb&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=a(0)+b' title='y=a(0)+b' class='latex' />
<p>Cualquier número multiplicado por 0 es 0. Así que nos queda.</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3Db&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=b' title='y=b' class='latex' />
<p>Por lo que a <strong>b</strong> se le conoce como ordenada del origen y es donde corta la recta al eje y. Cuando <strong>b</strong> vale 0, por ejemplo:</p>
<img src='http://s.wordpress.com/latex.php?latex=y%3D3x&#038;bg=T&#038;fg=000000&#038;s=0' alt='y=3x' title='y=3x' class='latex' />
<p>Significa que la recta pasa por el centro del eje de coordenadas (0, 0).</p>
<p>La <strong>a</strong> es conocida como la pendiente de la recta y coincide con la tangente del ángulo que forma con el eje x, pero ya lo veremos cuando veamos trigonometría.</p>
<p>Bueno ya hemos introducido el concepto de función y hemos visto las funciones polinómicas y de primer grado, en el siguiente artículo introduciremos la funciones de segundo grado o parabólicas.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/" title="Geometría espacial. Vectores II">Geometría espacial. Vectores II</a></li><li><a href="http://razonartificial.com/2010/10/eje-cartesiano-y-punto/" title="El eje cartesiano y el punto">El eje cartesiano y el punto</a></li><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectore/" title="Geometría espacial. Vectores">Geometría espacial. Vectores</a></li><li><a href="http://razonartificial.com/2010/10/funciones-de-segundo-grado/" title="Funciones de segundo Grado">Funciones de segundo Grado</a></li><li><a href="http://razonartificial.com/2010/10/hablemos-de-fisica-y-matematicas/" title="Hablemos de física y matemáticas">Hablemos de física y matemáticas</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/ykHsFK3LnTAsuqIP3hDbIhbgoGA/0/da"><img src="http://feedads.g.doubleclick.net/~a/ykHsFK3LnTAsuqIP3hDbIhbgoGA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ykHsFK3LnTAsuqIP3hDbIhbgoGA/1/da"><img src="http://feedads.g.doubleclick.net/~a/ykHsFK3LnTAsuqIP3hDbIhbgoGA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/ZQl2MbtOHJ8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/funcion-matematica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/funcion-matematica/</feedburner:origLink></item>
		<item>
		<title>El eje cartesiano y el punto</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/YhdHL7l6xos/</link>
		<comments>http://razonartificial.com/2010/10/eje-cartesiano-y-punto/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 23:42:15 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Matemáticas]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Análisis]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=922</guid>
		<description><![CDATA[Vamos a empezar a hablar sobre matemáticas. Matemáticas que queremos aplicar a la creación de videojuegos e inteligencia artificial así que nos enfocaremos en estas matemáticas, aunque en un principio trataremos cosas generales que no se aplican a este campo únicamente. Es imposible partir desde 0, pues se han de presuponer unos conocimientos básicos. No estamos aquí para enseñar a sumar o a dividir. Como tenía que tener un punto de corte por el que [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a empezar a hablar sobre matemáticas. Matemáticas que queremos aplicar a la creación de videojuegos e inteligencia artificial así que nos enfocaremos en estas matemáticas, aunque en un principio trataremos cosas generales que no se aplican a este campo únicamente.</p>
<p>Es imposible partir desde 0, pues se han de presuponer unos conocimientos básicos. No estamos aquí para enseñar a sumar o a dividir. Como tenía que tener un punto de corte por el que empezar a explicar el tema, lo que voy a presuponer por parte del lector es un nivel de matemáticas de nivel ESO, quizás un poco menos.</p>
<p>Asumiré que se sabe trabajar con ecuaciones tanto de primer como de segundo grado, que se saben representar, algo de geometría básica y operaciones elementales como el desarrollo de cuadrados, simplificaciones, factorización, etc. No voy a asumir ningún conocimiento trigonométrico aunque entra en el temario de la ESO ya que la trigonometría es bastente importante en el desarrollo de videojuegos.</p>
<p>Si no dominas los temas que se asumen es mejor que primero aprendas algo de  matemáticas básicas antes de meterte en el mundo de la programación o tienes el futuro en esto bastante oscuro.</p>
<h2>El plano real</h2>
<p>El mundo real puede ser complicado y encontrar un sitio exacto del espacio puede ser algo no trivial. Para hacerlo más fácil en matemáticas se simplifica usando un sistema de coordenadas. Hay varios sistemas, pero el mas utilizado es el sistema de coordenadas cartesianas.</p>
<p>Este consiste en dos ejes que se cortan y el punto de corte entre estos dos ejes es el origen.</p>
<p><img class="aligncenter size-full wp-image-923" title="Cartesian-coordinate-system" src="http://razonartificial.com/wp-content/uploads/2010/10/Cartesian-coordinate-system.png" alt="" width="300" height="300" /></p>
<h3>El punto</h3>
<p>Como vemos introducimos el concepto de punto. Un punto matemático es una coordenada única del espacio que viene dada por dos valores <strong>(x, y)</strong> donde x es las unidades de separación que hay con respecto al centro en dirección derecha o izquierda e y es la distancia de separación arriba o abajo.</p>
<p>Se puede ver claramente en el gráfico superior la representación de varios puntos matemáticos. Creo que el concepto queda claro.</p>
<p class="advertencia">Para simplificar estamos usando un plano 2D en el que nos movemos en dos ejes. El mundo real tiene 3 dimensiones y habría un tercer eje (z). Inclusos se puede hablar de una cuarta dimensión, el tiempo.</p>
<h4>Operaciones con puntos</h4>
<p>Sobre los puntos se pueden aplicar operaciones elementales como sumarlos, restarlos o multiplicarlos. La suma y la resta no tienen ninguna complicación es simplemente sumar la coordenada x con la x y la coordenada y con la y.</p>
<img src='http://s.wordpress.com/latex.php?latex=P%5Cleft%28%205%2C2%5Cright%29%20%2BQ%5Cleft%28%203%2C4%5Cright%29%20%3DR%5Cleft%28%208%2C6%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='P\left( 5,2\right) +Q\left( 3,4\right) =R\left( 8,6\right)' title='P\left( 5,2\right) +Q\left( 3,4\right) =R\left( 8,6\right)' class='latex' />
<p>La multiplicación y la división igual cada coordenada por la suya.</p>
<img src='http://s.wordpress.com/latex.php?latex=Q%5Cleft%28%203%2C4%5Cright%29%5Ctimes%5C%2CP%5Cleft%28%205%2C2%5Cright%29%20%3DR%5Cleft%28%2015%2C8%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='Q\left( 3,4\right)\times\,P\left( 5,2\right) =R\left( 15,8\right)' title='Q\left( 3,4\right)\times\,P\left( 5,2\right) =R\left( 15,8\right)' class='latex' />
<p>También se puede multiplicar un punto por un escalar, en cuyo caso ambas coordenadas se multiplican por el número.</p>
<img src='http://s.wordpress.com/latex.php?latex=5%5Ctimes%5C%2CP%5Cleft%28%204%2C2%5Cright%29%20%3DQ%5Cleft%28%2020%2C10%5Cright%29&#038;bg=T&#038;fg=000000&#038;s=0' alt='5\times\,P\left( 4,2\right) =Q\left( 20,10\right)' title='5\times\,P\left( 4,2\right) =Q\left( 20,10\right)' class='latex' />
<p>Esto ha sido una pequeña introducción y espero que los conceptos expuestos aquí se manejen de ante mano con soltura pues en el próximo artículo entraremos verdaderamente en materia introduciendo el concepto de función matemática.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/" title="Geometría espacial. Vectores II">Geometría espacial. Vectores II</a></li><li><a href="http://razonartificial.com/2010/10/funcion-matematica/" title="Función matemática">Función matemática</a></li><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectore/" title="Geometría espacial. Vectores">Geometría espacial. Vectores</a></li><li><a href="http://razonartificial.com/2010/10/funciones-de-segundo-grado/" title="Funciones de segundo Grado">Funciones de segundo Grado</a></li><li><a href="http://razonartificial.com/2010/10/hablemos-de-fisica-y-matematicas/" title="Hablemos de física y matemáticas">Hablemos de física y matemáticas</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/_zqLC_EKDY4Ot6OwCwskl97QrEk/0/da"><img src="http://feedads.g.doubleclick.net/~a/_zqLC_EKDY4Ot6OwCwskl97QrEk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_zqLC_EKDY4Ot6OwCwskl97QrEk/1/da"><img src="http://feedads.g.doubleclick.net/~a/_zqLC_EKDY4Ot6OwCwskl97QrEk/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/YhdHL7l6xos" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/eje-cartesiano-y-punto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/eje-cartesiano-y-punto/</feedburner:origLink></item>
		<item>
		<title>Hablemos de física y matemáticas</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/lTMZvT8LmBY/</link>
		<comments>http://razonartificial.com/2010/10/hablemos-de-fisica-y-matematicas/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 19:00:36 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Física]]></category>
		<category><![CDATA[Matemáticas]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=893</guid>
		<description><![CDATA[Este blog como habréis notado se centra en publicar artículos, principalmente, sobre inteligencia artificial y videojuegos. Son dos temas que requieren de una cierta habilidad matemática y física para trabajar con ellos y como en todo cada vez que queremos hacer cosas más complejas estas matemáticas y esta física se complicada. Por eso me ha surgido la idea de tratar en el blog temas de matemáticas y física que tengan relación con la programación [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-894 imageborder" title="matematicas-y-sexo" src="http://razonartificial.com/wp-content/uploads/2010/10/matematicas-y-sexo-300x300.jpg" alt="" width="240" height="240" /></p>
<p>Este blog como habréis notado se centra en publicar artículos, principalmente, sobre inteligencia artificial y videojuegos. Son dos temas que requieren de una cierta habilidad matemática y física para trabajar con ellos y como en todo cada vez que queremos hacer cosas más complejas estas matemáticas y esta física se complicada.</p>
<p>Por eso me ha surgido la idea de tratar en el blog temas de matemáticas y física que tengan relación con la programación de inteligencia artificial y videojuegos. Muchos llegarán al blog buscando como crear videojuegos o hacer IA. Pensando que la parte más difícil puede ser la programación. Cuando en realidad lo complicado de un desarrollo se encuentra en las matemáticas. Programar es para mí el arte de expresar con reglas matemáticas la realidad.</p>
<p>Es por eso que, aunque se que tengo ya varios frentes abiertos en el blog, voy a empezar a publicar sobre matemáticas y física orientada a videojuegos. Muchos pensaréis, vaya rollo, pero el que quiera de verdad aprender sobre estos temas, que sepa que sin las matemáticas no va a hacer nada nunca.</p>
<p>Si alguien está interesado en ayudarme con este tipo de artículos que me lo comente, así podremos enriquecer el blog.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectores-ii/" title="Geometría espacial. Vectores II">Geometría espacial. Vectores II</a></li><li><a href="http://razonartificial.com/2010/11/geometria-espacial-vectore/" title="Geometría espacial. Vectores">Geometría espacial. Vectores</a></li><li><a href="http://razonartificial.com/2010/10/funciones-de-segundo-grado/" title="Funciones de segundo Grado">Funciones de segundo Grado</a></li><li><a href="http://razonartificial.com/2010/10/funcion-matematica/" title="Función matemática">Función matemática</a></li><li><a href="http://razonartificial.com/2010/10/eje-cartesiano-y-punto/" title="El eje cartesiano y el punto">El eje cartesiano y el punto</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/X4kSyHl-YBbybSpdhLe3mypg30U/0/da"><img src="http://feedads.g.doubleclick.net/~a/X4kSyHl-YBbybSpdhLe3mypg30U/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/X4kSyHl-YBbybSpdhLe3mypg30U/1/da"><img src="http://feedads.g.doubleclick.net/~a/X4kSyHl-YBbybSpdhLe3mypg30U/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/lTMZvT8LmBY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/hablemos-de-fisica-y-matematicas/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/hablemos-de-fisica-y-matematicas/</feedburner:origLink></item>
		<item>
		<title>Algoritmos genéticos, parte 2</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/0JP7IP7YJ9A/</link>
		<comments>http://razonartificial.com/2010/10/algoritmos-geneticos-parte-2/#comments</comments>
		<pubDate>Sun, 03 Oct 2010 16:58:12 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Algoritmos genéticos]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=808</guid>
		<description><![CDATA[Bueno, vamos a continuar con más cosas teóricas antes de la implementación del AG, que por cierto, se hará en python. Vamos a detallar más lo que vamos a hacer. Pediremos las coordenadas de inicio y las de llegada, el AG empezará y en cuanto encuentre un camino nos dirá cual es el camino que ha encontrado Primero necesitamos saber como vamos a codificar los genes en el cromosoma. Para esto tenemos que saber cuales son [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, vamos a continuar con más cosas teóricas antes de la implementación del AG, que por cierto, se hará en python. Vamos a detallar más lo que vamos a hacer. Pediremos las coordenadas de inicio y las de llegada, el AG empezará y en cuanto encuentre un camino nos dirá cual es el camino que ha encontrado</p>
<p>Primero necesitamos saber como vamos a codificar los genes en el cromosoma. Para esto tenemos que saber cuales son las posibilidades, que en este caso son ir al norte, al sur, al este o al oeste. La manera más sencilla de codificarlos es en formato binario, es decir,  con unos y ceros, dado que luego tiene varias ventajas añadidas, como por ejemplo que a la hora de mutar solo hay que cambiarlo de 0 a 1 o de 1 a 0, no hay que tratar con mas posibilidades que complicarían más la cosa. Una vez considerado esto, dado que las posibilidades son 4, cada gen del cromosoma será una pareja de estos números, así las combinaciones serán exactamente 4: <strong>00</strong> &#8211;&gt; <strong>norte</strong>,<strong> 01</strong> &#8211;&gt; <strong>sur</strong>, <strong>10</strong> &#8211;&gt;  <strong>este</strong>, <strong>11 </strong>&#8211;&gt; <strong>oeste</strong>. En otras ocasiones no tendremos tanta suerte, y nos acabarán sobrando posibilidades, por lo tanto habrá que realizar el tratamiento de errores que corresponda. Es importante que tengáis claro como lo habéis codificado dado que lo necesitareis recordar durante todo el desarrollo. Una cosa a tener en cuenta es que no hay ningún obstáculo en todo el recorrido</p>
<p>La estructura del código es sencilla. Una clase Cromosoma que contendrá los atributos &#8220;cromosoma&#8221;, una cadena, y  &#8220;aptitud&#8221;, un número en coma flotante, y con prácticamente todas las funciones que necesitaremos. El resto serán un par de funciones sueltas que no encajan el la clase y el programa en si. Como módulos externos solo usaremos &#8220;random&#8221; para los números aleatorios que necesitaremos.</p>
<p>Poco más queda por decir antes de empezar con el código, quizás aclarar que sera en modo consola, pero pondré al día mis conocimientos de pygame para próximos tutoriales, que si no hay cosas que se pueden hacer muy pesadas. Así que nos vemos en el siguiente artículo.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/10/ia-en-videojuegos-persiguiendo-y-evadiendo-i/" title="IA en videojuegos &#8211; Persiguiendo y evadiendo I">IA en videojuegos &#8211; Persiguiendo y evadiendo I</a></li><li><a href="http://razonartificial.com/2010/09/algoritmos-geneticos/" title="Algoritmos genéticos">Algoritmos genéticos</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/HR0z-vIlKueovTIdIeKCpbNhddw/0/da"><img src="http://feedads.g.doubleclick.net/~a/HR0z-vIlKueovTIdIeKCpbNhddw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HR0z-vIlKueovTIdIeKCpbNhddw/1/da"><img src="http://feedads.g.doubleclick.net/~a/HR0z-vIlKueovTIdIeKCpbNhddw/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/0JP7IP7YJ9A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/10/algoritmos-geneticos-parte-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/10/algoritmos-geneticos-parte-2/</feedburner:origLink></item>
		<item>
		<title>Arkanoid V – Creando la bola</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/UI-BTL6V0bo/</link>
		<comments>http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 20:38:37 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Arkanoid]]></category>
		<category><![CDATA[Pygame]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=861</guid>
		<description><![CDATA[Después de la pala llega el turno de la bolita, esa bolita con la que tendremos que destruir todos los ladrillos y evitar que se nos cuele debajo de la raqueta. Nosotros la programamos y ellas no putea, así es la vida. Primero necesitamos una imagen que haga de bola, yo dejo la que uso a continuación, pero si no os gusta os hacéis una. Descargar ball.png La clase Ball() Antes que nada y [...]]]></description>
			<content:encoded><![CDATA[<p>Después de la pala llega el turno de la bolita, esa bolita con la que tendremos que destruir todos los ladrillos y evitar que se nos cuele debajo de la raqueta. Nosotros la programamos y ellas no putea, así es la vida.</p>
<p>Primero necesitamos una imagen que haga de bola, yo dejo la que uso a continuación, pero si no os gusta os hacéis una.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/09/ball.png">Descargar ball.png</a></li>
</ul>
<h2>La clase Ball()</h2>
<p>Antes que nada y como siempre creamos el archivo sp_ball.py y en el metemos los siguientes import que nos harán falta.</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

import pygame
import config
import graphics
import math
</pre>
<h3>El constructor</h3>
<p>A continuación, pasamos a crear la clase y su constructor.</p>
<pre class="brush: python; title: ; notranslate">
class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = graphics.load_image(config.sprites+&amp;amp;quot;ball.png&amp;amp;quot;, True)
        self.rect = self.image.get_rect()
        self.rect.centery = config.height/2
        self.rect.centerx = (config.width-140)/2
        self.speed = [0.4, 0.4]
</pre>
<p>Muy parecido a la pala las diferencias, obviamente la imagen será la de la pelota y esta vez self.rect.centery vale <strong>config.height/2</strong> o lo que es lo mismo que está justo en medio de la ventana.</p>
<p>como nuevo tenemos que self.speed es ahora una lista de dos valores, esto es así porque la bola al contrario que la pala se mueve tanto en el eje x como en el eje y.</p>
<h3>El método update</h3>
<p>En este método trabajaremos durante el juego bastante, pues será el encargado de detectar las colisiones de la bola con todos los elementos y actuar en consecuencia. De momento vamos a programarlo para que rebote contra las paredes y contra la pala que son los elementos que tenemos.</p>
<p>Dejo el método entero y lo explicamos paso a paso.</p>
<pre class="brush: python; title: ; notranslate">
def update(self, time, pallet):
    self.rect.centerx += self.speed[0] * time
    self.rect.centery += self.speed[1] * time

    # Colisiones con las paredes.
    if self.rect.left &amp;amp;lt;= 10:
        self.rect.left = 10
        self.speed[0] = -self.speed[0]
    if self.rect.right &amp;amp;gt;= 490:
        self.rect.right = 490
        self.speed[0] = -self.speed[0]
    if self.rect.top &amp;amp;lt;= 10:
        self.rect.top = 10
        self.speed[1] = -self.speed[1]
    if self.rect.bottom &amp;amp;gt;= 470:
        self.rect.bottom = 470
        self.speed[1] = -self.speed[1]

    # Colisiones con la pala.
    if pygame.sprite.collide_rect(self, pallet):
        if self.rect.centerx &amp;amp;lt;= pallet.rect.centerx:
            dist = pallet.rect.centerx - self.rect.centerx
            self.speed[0] = -math.sin(math.radians(dist))/1.25
        elif self.rect.centerx &amp;amp;gt; pallet.rect.centerx:
            dist = self.rect.centerx - pallet.rect.centerx
            self.speed[0] = math.sin(math.radians(dist))/1.25
        self.speed[1] = -self.speed[1]
</pre>
<p>Como diría Jack el Destripador, vamos por partes. Lo primero es calcular la posición de la pelota con respecto a la velocidad y el tiempo como hacíamos con la pala solo que esta vez en dos ejes son las <strong>líneas 2</strong> y <strong>línea 3</strong> respectivamente.</p>
<h4>Colisiones con las paredes</h4>
<p>Solo con lo de arriba ya tendría movimiento nuestra pelota, pero ahora hay que hacer que  rebote contra los bordes y contra la pala. Esto lo conseguimos jugando con los valores de la velocidad. Por ejemplo, si la pelota se mueve a la velocidad de 0.4 en el eje y significa que va hacia abajo ya que pongamos que la pelota tienen su posición y en el pixel 300 si transcurridos 20 milésimas de segundo calculamos cuando se ha movido sería 0.4*20 que daría 8 por lo que estaría en el pixel 308, por tanto se estaría moviendo hacia abajo (recuerda que la coordenada (0, 0) está en la esquina superior izquierda). Entonces cambiar el sentido de la velocidad bastaría con ponerle un signo menos delante, entonces tendríamos -8 y la posición sería 300-8=292 por lo que habría subido.</p>
<p>Esta explicación que parece obvia y es una cosa básica es buena tenerla en cuenta para los que anden despistados. Jugando con esto vamos a programar los rebotes contra la pared.</p>
<pre class="brush: python; title: ; notranslate">
# Colisiones con las paredes.
    if self.rect.left &amp;amp;lt;= 10:
        self.rect.left = 10
        self.speed[0] = -self.speed[0]
    if self.rect.right &amp;amp;gt;= 490:
        self.rect.right = 490
        self.speed[0] = -self.speed[0]
    if self.rect.top &amp;amp;lt;= 10:
        self.rect.top = 10
        self.speed[1] = -self.speed[1]
    if self.rect.bottom &amp;amp;gt;= 470:
        self.rect.bottom = 470
        self.speed[1] = -self.speed[1]
</pre>
<p>Primero comprobamos si ha chocado con la parte izquieda, para ello comprobamos si la parte izquieda de la pelota (self.rect.left) es menor que 10 que es donde se encuentra el borde izquierdo. En caso de que así sea primero establecemos la parte izquieda de la pelota justo en 10. Esto lo hacemos por si llegara a vale 9 u 8 no se vea encima de la pered, recuerda que no dibujamos hasta el final. a continuación cambiamos la dirección de la velocidad del eje x.</p>
<p>Exactamente lo mismo se aplica a la parte derecha, la parte superior y la inferior. Solo que para la superior e inferior lo que variamos es la velocidad en el eje y. Como vemos la velocidad al chocar contra las paredes permanece constante y solo cambia la dirección de la misma.</p>
<h4>Colisiones con la pala</h4>
<p>Para la pala no nos vamos a limitar a cambiar simplemente la dirección de la bola, sino que vamos a darle más juego y según con la parte que golpeemos consigamos un efecto u otro. Lo que he hecho es que entre más con el extremo de la pala golpees más inclinada salga la pelota hacia el lado con el que le das y si le das con el centro justo de la raqueta salga vertical hacia arriba. Así el jugador tendrá control para decidir a que parte de la pantalla mandar la pelota.</p>
<p>La pala mide de ancho 60px, por lo que del centro a los extremos hay 30px exactos. Lo que vamos a hacer es calcular la diferencia que hay entre el centro de la pelota y el centro de la pala a la hora de golpear. La distancia podra ir desde 0 (cuando le da en el centro justo) hasta 30 (cuando le da con el extremo de la pala). Para obtener la velocidad nos basta con obtener el seno de la distancia resultante ya que el seno de 30 es 0.5 y el seno de 0 es 0 nos da que si le damos con el extemo de la pala saldria a una velocidad de 0.5 en el eje x y si le damos con el centro la velocidad en el eje x sería 0 por lo que saldría hacia arriba sin cambiar de dirección (recuerda que estamos variando el eje x, el eje parmanece intacto). 0.5 por las pruebas que he hecho es algo rápido para jugar bien por lo que es mejor que la velocidad máxima sea 0.4, esto lo conseguimos dicidiendo entre 1.25.</p>
<p>Así explicado puede que maree un poco, veamos el código.</p>
<pre class="brush: python; title: ; notranslate">
# Colisiones con la pala.
    if pygame.sprite.collide_rect(self, pallet):
        if self.rect.centerx &amp;amp;lt;= pallet.rect.centerx:
            dist = pallet.rect.centerx - self.rect.centerx
            self.speed[0] = -math.sin(math.radians(dist))/1.25
        elif self.rect.centerx &amp;amp;gt; pallet.rect.centerx:
            dist = self.rect.centerx - pallet.rect.centerx
            self.speed[0] = math.sin(math.radians(dist))/1.25
        self.speed[1] = -self.speed[1]
</pre>
<p>Lo primero de todo es detectar si la pelota está colisionando con la pala. Para ello usamos las funciones que nos provee pygame.</p>
<pre class="brush: python; title: ; notranslate">
if pygame.sprite.collide_rect(self, pallet):
</pre>
<p>Recibe dos sprites y devuelve verdadero si están colisionando en nuestro caso le pasamos la bola misma (self) y la pala (pallet) fijaos que la pala se la pasamos como parámetro el metodo <strong>update </strong>junto con time. Lamentablemente esta función solo comprueban si están colisionando y no en que punto esta colisionando, por lo que tendremos que hacerlo a mano.</p>
<p>Primero detectamos si está colisionando a la izquierda o a la derecha de la pala. Esto es importante para saber en que dirección mandamos la pelota, si la golpeamos con la parte izquierda de la pala la mandaremos hacia la izquierda y si la golpeamos con la derecha la mandaremos a la derecha. Comprobarlo es tan fácil como:</p>
<pre class="brush: python; title: ; notranslate">
if self.rect.centerx &amp;amp;lt;= pallet.rect.centerx:
</pre>
<p>Es decir, si el centro de la bola es menor o igual (el igual puede ir tanto a la derecha como a la izquieda ya que la velocidad en x valdrá 0 y da igual si es positiva o negativa) que el centro de la pala. En cuyo caso calculamos la distancia que separa el centro de la pala con el centro de la bola (nos dará un valor entre 0 y 30)</p>
<pre class="brush: python; title: ; notranslate">
dist = pallet.rect.centerx - self.rect.centerx
</pre>
<p>Por último le damos el nuevo valor a la velocidad en el eje y que explicamos arriba.</p>
<pre class="brush: python; title: ; notranslate">
self.speed[0] = -math.sin(math.radians(dist))/1.25
</pre>
<p>dist tiene un valor entre 0 y 30. La función seno de la biblioteca math recibe los parámetros en radianes así que convertimos dist a radianes con math.radians(dist). Luego atención a la división entre 1.25 que limita la velocidad un 25 por ciento para que no vaya tan rápido. También atención al signo &#8211; (menos) que hace que la dirección sea hacia la izquierda.</p>
<p>Para la derecha es exactamente lo mismo, pero sin el signo menos, haciendo que la pelota vaya hacia la derecha.</p>
<p>Por último y como final, también después de colisionar debemos cambiar la velocidad del eje y para que vaya en sentido contrario, lo hacemos con:</p>
<pre class="brush: python; title: ; notranslate">
self.speed[1] = -self.speed[1]
</pre>
<h3>El método draw</h3>
<p>Como en todos los sprites no nos olvidemos de un método para dibujarlo, en este caso es idéntico al de la clase de la pala.</p>
<pre class="brush: python; title: ; notranslate">
def draw(self, screen):
        screen.blit(self.image, self.rect)
</pre>
<p>Dejo el archivo entero, para el que se haya perdido.</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

import pygame
import config
import graphics
import math

class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = graphics.load_image(config.sprites+&amp;amp;quot;ball.png&amp;amp;quot;, True)
        self.rect = self.image.get_rect()
        self.rect.centery = config.height/2
        self.rect.centerx = (config.width-140)/2
        self.speed = [0.4, 0.4]

    def update(self, time, pallet):
        self.rect.centerx += self.speed[0] * time
        self.rect.centery += self.speed[1] * time

        # Colisiones con las paredes.
        if self.rect.left &amp;amp;lt;= 10:
            self.rect.left = 10
            self.speed[0] = -self.speed[0]
        if self.rect.right &amp;amp;gt;= 490:
            self.rect.right = 490
            self.speed[0] = -self.speed[0]
        if self.rect.top &amp;amp;lt;= 10:
            self.rect.top = 10
            self.speed[1] = -self.speed[1]
        if self.rect.bottom &amp;amp;gt;= 470:
            self.rect.bottom = 470
            self.speed[1] = -self.speed[1]

        # Colisiones con la pala.
        if pygame.sprite.collide_rect(self, pallet):
            if self.rect.centerx &amp;amp;lt;= pallet.rect.centerx:
                dist = pallet.rect.centerx - self.rect.centerx
                self.speed[0] = -math.sin(math.radians(dist))/1.25
            elif self.rect.centerx &amp;amp;gt; pallet.rect.centerx:
                dist = self.rect.centerx - pallet.rect.centerx
                self.speed[0] = math.sin(math.radians(dist))/1.25
            self.speed[1] = -self.speed[1]

    def draw(self, screen):
        screen.blit(self.image, self.rect)
</pre>
<h2>Poniendo una bola en nuestro juego</h2>
<p>Una vez creada, vamos a darle vida. Lo primero es crear una instancia en el constructor de <strong>SceneGame</strong>, como siempre.</p>
<pre class="brush: python; title: ; notranslate">
self.ball = Ball()
</pre>
<p>A continuación solo debemos añadir el método update de la bola al método on_update de la escena, ya que al contrario que la pala, la bola no precisa de ningún evento para moverse.</p>
<pre class="brush: python; title: ; notranslate">
self.ball.update(self.time, self.pallet)
</pre>
<p>Y por último en el método on_draw le decimos que se dibuje.</p>
<pre class="brush: python; title: ; notranslate">
self.ball.draw(screen)
</pre>
<p>Con esto ya tenemos una pelota que rebota contra las paredes y la pala y con esta podemos dirigir hacia donde queremos mandarla. Dejo scene_game.py completo por si no lo véis.</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

import pygame
import scene
import config
import graphics
import load_levels

from sp_pallet import Pallet
from sp_ball import Ball

class SceneGame(scene.Scene):
    &amp;amp;quot;&amp;amp;quot;&amp;amp;quot;Escena inicial del juego, esta es la primera que se carga cuando inicia&amp;amp;quot;&amp;amp;quot;&amp;amp;quot;

    def __init__(self, director):
        scene.Scene.__init__(self, director)
        self.back = graphics.load_image(config.menus+&amp;amp;quot;back_game.png&amp;amp;quot;)
        self.pallet = Pallet()
        self.ball = Ball()

    def on_update(self):
         self.time = self.director.time
         self.ball.update(self.time, self.pallet)

    def on_event(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.pallet.update(1, self.time)
        if keys[pygame.K_RIGHT]:
            self.pallet.update(2, self.time)

    def on_draw(self, screen):
        screen.blit(self.back, (0,0))
        self.pallet.draw(screen)
        self.ball.draw(screen)
</pre>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/" title="Arkanoid IV &#8211; Creando la pala">Arkanoid IV &#8211; Creando la pala</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iii-disenando-la-pantalla-de-juego/" title="Arkanoid III &#8211; Diseñando la pantalla de juego">Arkanoid III &#8211; Diseñando la pantalla de juego</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-ii-gestionando-escenas/" title="Arkanoid II &#8211; Gestionando escenas">Arkanoid II &#8211; Gestionando escenas</a></li><li><a href="http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/" title="Arkanoid I &#8211; Empezando y configurando">Arkanoid I &#8211; Empezando y configurando</a></li><li><a href="http://razonartificial.com/2010/07/juego-de-la-serpiente-paso-a-paso-parte-2/" title="Juego de la serpiente paso a paso. Parte 2">Juego de la serpiente paso a paso. Parte 2</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/yEjxKVOONJ2z5X0fC2A8wFLkK6k/0/da"><img src="http://feedads.g.doubleclick.net/~a/yEjxKVOONJ2z5X0fC2A8wFLkK6k/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/yEjxKVOONJ2z5X0fC2A8wFLkK6k/1/da"><img src="http://feedads.g.doubleclick.net/~a/yEjxKVOONJ2z5X0fC2A8wFLkK6k/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/UI-BTL6V0bo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/</feedburner:origLink></item>
		<item>
		<title>Arkanoid IV – Creando la pala</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/xnSR5-szzLQ/</link>
		<comments>http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 13:27:10 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Arkanoid]]></category>
		<category><![CDATA[Pygame]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=857</guid>
		<description><![CDATA[Es el momento de que nuestro juego empiece a coger algo de movimiento. En esta entrega vamos a empezar a bocetar los primeros sprites que son el alma de los juegos 2D. El sprite pala La pala del juego Arkanoid es el sprite que maneja el usuario, se encuentra en la parte inferior de la pantalla y el jugador debe moverla de izquierda a derecha para evitar que la bola caiga. En un principio [...]]]></description>
			<content:encoded><![CDATA[<p>Es el momento de que nuestro juego empiece a coger algo de movimiento. En esta entrega vamos a empezar a bocetar los primeros sprites que son el alma de los juegos 2D.</p>
<h2>El sprite pala</h2>
<p>La pala del juego Arkanoid es el sprite que maneja el usuario, se encuentra en la parte inferior de la pantalla y el jugador debe moverla de izquierda a derecha para evitar que la bola caiga. En un principio vamos a hacer que la pala se mueva con el teclado, pero cuando empecemos añadirle extras daremos la opción de manejarla con el ratón.</p>
<p>Bien lo que vamos a hacer es crear un sprite parecido a los que creamos para el pong. Así que creamos un nuevo script de Python llamado <strong>sp_pallet.py </strong>he decidido poner el prefijo sp_ a los scripts de sprites para diferenciarlos.</p>
<p>Como casi todo sobre la creación de sprites se vio en el tutorial del Pong, pongo aquí el sprite entero que es pequeño y lo comentamos.</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

import pygame
import config
import graphics

class Pallet(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = graphics.load_image(config.sprites+&quot;pala.png&quot;, True)
        self.rect = self.image.get_rect()
        self.rect.top = 420
        self.rect.centerx = (config.width-140)/2
        self.speed = 0.5

    def update(self, dir, time):
        if dir == 1:
            if self.rect.left &gt;= 15:
                self.rect.x -= self.speed*time
        elif dir == 2:
            if self.rect.right &lt;= 485:
                self.rect.x += self.speed*time

    def draw(self, screen):
        screen.blit(self.image, self.rect)
</pre>
<p>Lo primero que vemos es la importación de los módulos necesarios, como casi siempre la biblioteca pygame, el archivo config y las funciones de graphics. Luego tenemos la clase <strong>Pallet</strong>, que hereda de la clase Sprite como ya explicamos en el tutorial de Pong. Cargamos, la imagen de la pala y el rect.</p>
<p>Por cierto, en el artículo anterior puse una pala con el fondo transparente, a veces suelen dar porblemas porque la función de cargar imágenes tiene definido que tome como color transparente el pixel (0,0) de la imagen y al ser este ya transparente pues Pygame a veces se lía. Por eso yo siempre prefiero ponerles un color que haga de colorkey así que resubo la pala con el nuevo fondo.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/09/pala1.png">Descargar pala1.png</a></li>
</ul>
<p>Recuerda renombrarla a pala.png antes de ponerla en la carpeta o dará error al cargar.</p>
<p>Bien siguiendo con el código obtenemos el rect, si no sabes lo que es por enésima vez te remito al tutorial del Pong. A continuación con self.rect.top modificamos a que altura de la ventana del juego esté la parte superior de nuestra pala. En nuestro caso en la posición 420 que es casi pegada a la parte inferior, pero dejando un espacio.</p>
<p>con <strong>self.rect.centerx</strong> más o menos lo mismo, pero la situamos en el centro del área de juego, para calcularla cogemos el ancho de la ventana (<strong>config.width </strong>que es 640) le restamos la parte del menú (que mide 140px) y lo dividimos entre 2 por lo que tendremos el centro de la pala del eje x (<strong>rect.centerx</strong>) en el centro del área de juego.</p>
<p>Por último con <strong>self.speed</strong> establecemos una velocidad de movimiento para la pala hemos elegido provisionalmente 0.5, pera ya veremos si es adecuada o no cuando el juego tenga todos sus elementos.</p>
<h3>El método update</h3>
<p>El método update como siempre se encarga de actualizar la posición de la pala. Recibe dos parámetros: dir que puede tener los valores 1 y 2. El valor 1 representa el movimiento a la izquierda y el valor 2 representa el movimiento a la derecha, según que valor le pasemos se moverá en una dirección u otra como vemos con el <strong>if dir == 1</strong> y el <strong>elif dir == 2</strong>, nada complicado. Luego tenemos dos if más que limitan el movimiento, veamoslos.</p>
<p><strong>if self.rect.left &lt;= 15</strong> nos dice que solo se ejecute las sentencias de su cuerpo si la parte izquierda del rect es mayor o igual que 15 esto es así porque si nos fijamos en el fondo que hemos puesto tiene un borde derecho de 10px más 5px que dejamos de margen. Lo mismo se aplica a <strong>self.rect.right &lt;= 485</strong> esto nos da el límite de la parte derecha del área del juego, sería un poco absurdo tener la pala sobre la barra lateral.</p>
<p>por ultimo usamos física básica para hacer el movimiento de la pala, todos sabemos que <strong>E = v*t</strong> o lo que es lo mismo espacio es igual a la velocidad por el tiempo. Pues bien cogemos la posición que tiene la pala (<strong>self.rect.x</strong>) y le añadimos el movimiento que viene dado por la ecuación, la verlocidad (<strong>self.speed</strong>) por el tiempo (<strong>time</strong>).</p>
<p>El parámetro time es el otro que teníamos y que no hemos explicado, viene del objeto director y el reloj que allí creamos y ahora veremos como se lo pasamos a la pala.</p>
<p>Por último tenemos el método draw que se encarga de dibujar el sprite, como vemos solo recibe el parámetro screen y hace un blit de la imagen tomando su rect como referencia, nada que ya no hayamos visto.</p>
<h2>Poniendo la pala en la escena</h2>
<p>Ya tenemos nuestra pala creada, es hora de colocarla en nuestro juego. Para ello vamos al archivo <strong>scene_game.py</strong>. Lo primero es crear la pala en el constroctor de la clase.</p>
<pre class="brush: python; title: ; notranslate">
self.pallet = Pallet()
</pre>
<p>A continuación vamos a obtener el tiempo transcurrido desde la última actualización de pantalla, esto lo hacemos en el método <strong>on_update</strong> con la siguiente línea.</p>
<pre class="brush: python; title: ; notranslate">
self.time = self.director.time
</pre>
<p>como vemos obtenemos el tiempo desde el objeto director y lo almacenamos en <strong>self.time</strong> para tener disponible en todo la escena, es importante que esté en on_update y no en el constructor porque es una variable que tiene que obtener su valor en cada paso del bucle para saber cuanto tiempo ha pasado.</p>
<p>Por último solo nos queda mover nuestra pala que lo haremos, en principio, con el teclado, con las flechas de dirección izquierda y derecha. Pulsar una tecla se considera un evento por lo que irá en el método <strong>on_event</strong>. En realidad da igual colocar las cosas en on_event o en <strong>on_update</strong>, pero mejor ser ordenados y cada cosa en su lugar.</p>
<p>Por lo que el método on_event nos quedaría así.</p>
<pre class="brush: python; title: ; notranslate">
def on_event(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.pallet.update(1, self.time)
        if keys[pygame.K_RIGHT]:
            self.pallet.update(2, self.time)
</pre>
<p>Obtenemos las teclas pulsadas y las almacenamos en keys. Luego comprobamos si está pulsada las flechas de dirección izquierda o derecha. Según la que esté pulsada llamamos al parametro update de pallet con el valor de dir en 1 o en 2. También le pasamos el valor del tiempo transcurrido.</p>
<p>Por último solo nos queda dibujar la pala en pantalla. Para ello añadimos la siguiente línea al metodo <strong>on_draw</strong>.</p>
<pre class="brush: python; title: ; notranslate">
self.pallet.draw(screen)
</pre>
<p>Y listo, podemos ejecutar nuestro juego y ver nuestra pala en acción.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/" title="Arkanoid V &#8211; Creando la bola">Arkanoid V &#8211; Creando la bola</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iii-disenando-la-pantalla-de-juego/" title="Arkanoid III &#8211; Diseñando la pantalla de juego">Arkanoid III &#8211; Diseñando la pantalla de juego</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-ii-gestionando-escenas/" title="Arkanoid II &#8211; Gestionando escenas">Arkanoid II &#8211; Gestionando escenas</a></li><li><a href="http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/" title="Arkanoid I &#8211; Empezando y configurando">Arkanoid I &#8211; Empezando y configurando</a></li><li><a href="http://razonartificial.com/2010/07/juego-de-la-serpiente-paso-a-paso-parte-2/" title="Juego de la serpiente paso a paso. Parte 2">Juego de la serpiente paso a paso. Parte 2</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/PrR5HTfmheRWCXeNBxd2wBXsbdE/0/da"><img src="http://feedads.g.doubleclick.net/~a/PrR5HTfmheRWCXeNBxd2wBXsbdE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/PrR5HTfmheRWCXeNBxd2wBXsbdE/1/da"><img src="http://feedads.g.doubleclick.net/~a/PrR5HTfmheRWCXeNBxd2wBXsbdE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/xnSR5-szzLQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/</feedburner:origLink></item>
		<item>
		<title>Arkanoid III – Diseñando la pantalla de juego</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/OYZ2qRiLo3w/</link>
		<comments>http://razonartificial.com/2010/09/arkanoid-iii-disenando-la-pantalla-de-juego/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 14:31:18 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Arkanoid]]></category>
		<category><![CDATA[Pygame]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=847</guid>
		<description><![CDATA[Un videojuego como bien sabemos no es solo programación, sino que conlleva diseño, gráficos, música, sonidos, etc. En esta parte del tutorial vamos a hablar sobre el diseño de nuestro juego y las partes que va a tener antes de empezar a programar a lo loco. La pantalla de juego La pantalla más importante de nuestro juego va a ser la del juego en sí, otras como los menús, puntaciones y demás son pantallas [...]]]></description>
			<content:encoded><![CDATA[<p>Un videojuego como bien sabemos no es solo programación, sino que conlleva diseño, gráficos, música, sonidos, etc. En esta parte del tutorial vamos a hablar sobre el diseño de nuestro juego y las partes que va a tener antes de empezar a programar a lo loco.</p>
<h2>La pantalla de juego</h2>
<p>La pantalla más importante de nuestro juego va a ser la del juego en sí, otras como los menús, puntaciones y demás son pantallas del juego, pero no son tan importantes ya que el jugador se pasará la mayor parte del tiempo en la pantalla de juego. Es por eso que es la primera que vamos a diseñar.</p>
<p>En un principio vamos a diseñar algo básico que marque la ubicación y estructura de los elementos, más adelante se puede cambiar por gráficos más elaborados. Bueno abrimos nuestro programa de diseño gráfico ya sea GIMP, Photoshop o el que queráis.</p>
<p>Mi idea del juego es que tenga una resolución de 640x 480 con una barra lateral donde poner datos como la puntuación, el nivel, las vidas y más información útil.</p>
<p><a href="http://razonartificial.com/wp-content/uploads/2010/09/screen_game.png"><img class="aligncenter size-full wp-image-850" title="screen_game" src="http://razonartificial.com/wp-content/uploads/2010/09/screen_game.png" alt="" width="640" height="480" /></a>Como vemos nada del otro mundo, pero que nos ayudará a tener claro a la hora de programar donde esta definida el área de juego, los puntos, los bloques, la pala, etcétera. Luego ya nos curraremos una estadísticas mejores y unos gráficos molones.</p>
<p>La estrategia que vamos a seguir es conseguir un juego funcional y luego poco a poco ir añadiendole extras. Me explico, en principio el objetivo es conseguir con la pala destruir todos los ladrillos, pero más adelante podremos hacer que ciertos ladrillos dejen caer ciertas bonificaciones al romperse o extras como hacer crecer y encoger la pala o darte más vidas.</p>
<p>Vamos a desglosar esta imagen que tenemos como referencia, para usarlas en nuestro juego. Cogemos es el fondo y lo guardamos en formato png en la carpeta de menús ya que todos los elementos de la interfaz irán a esta carpeta.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/09/back_game.png">Descargar back_game.png</a></li>
</ul>
<p>Luego la pala, los ladrillos, la pelota y demás elementos interactivos irán a la carpeta sprites, pues son los que van a poseer propiedades físicas o de movimiento.</p>
<ul>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/09/brick_green.png">Descargar brick_green.png</a></li>
<li><a href="http://razonartificial.com/wp-content/uploads/2010/09/pala.png">Descargar pala.png</a></li>
</ul>
<h2>El archivo graphics.py</h2>
<p>Antes de seguir vamos a crear un archivo auxiliar con algunas funciones útiles como <strong>load_image</strong> o <strong>text </strong>que ya vimos en el tutorial del Pong y sirven para cargar imágenes y texto. A este archivo lo llamaremos <strong>graphics.py</strong> y en el colocaremos funciones que se encarguen de manipular y crear gráficos.</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-

&quot;&quot;&quot;Módulo para implementar el manejo de gráficos y superficies&quot;&quot;&quot;

# Módulos
import pygame

# Carga una imagen transparencia y color tranasparente opcionales.
def load_image(filename, transparent=False, pixel=(0,0)):
    &quot;Carga una imagen al formato interno de pygame&quot;
    try: image = pygame.image.load(filename)
    except pygame.error, message:
            raise SystemExit, message
    image = image.convert()
    if transparent:
            color = image.get_at(pixel)
            image.set_colorkey(color, pygame.RLEACCEL)
    return image

def text(texto, posx, posy, color=(0, 0, 0), tam=25):
    &quot;Crea una imagen con texto pasado y su rect&quot;
    fuente = pygame.font.Font(&quot;../images/DroidSans.ttf&quot;, tam)
    salida = pygame.font.Font.render(fuente, texto, 1, color)
    salida_rect = salida.get_rect()
    salida_rect.centerx = posx
    salida_rect.centery = posy
    return salida, salida_rect
</pre>
<p>Si no entiendes estas funciones revisa el tutorial del Pong básico.</p>
<h2>Colocando el fondo</h2>
<p>Ya podemos colocar el fondo de nuestro SceneGame ya que este no variará y será lo primero que se dibuje siempre.</p>
<p>Cargamos la imagen en el constructor de la escena.</p>
<pre class="brush: python; title: ; notranslate">
self.back = graphics.load_image(config.menus+&quot;back_game.png&quot;)
</pre>
<p>Previamente debemos hacer los imports tanto de config como de graphics para usar las funciones que contienen. Podéis ver como <strong>config.menus</strong> en realidad equivale a <strong>&#8220;data/graphics/menus/&#8221;</strong> por lo que si algún día decidimos cambiar la ruta solo con cambiar esta variable bastará.</p>
<p>Una vez carga solo debemos hacer que se dibuje en método on_draw de la escena con la siguiente línea.</p>
<pre class="brush: python; title: ; notranslate">
screen.blit(self.back, (0,0))
</pre>
<p>Debe ser siempre la primera cosa a dibujar ya que es el fondo que va debajo y todo lo demás tiene que dibujarse encima si queremos que sea visible. Por si os habéis perdido dejo el archivo <strong>scene_home.py</strong> completo.</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

import scene
import config
import graphics

class SceneGame(scene.Scene):
    &quot;&quot;&quot;Escena inicial del juego, esta es la primera que se carga cuando inicia&quot;&quot;&quot;

    def __init__(self, director):
        scene.Scene.__init__(self, director)
        self.back = graphics.load_image(config.menus+&quot;back_game.png&quot;)

    def on_update(self):
        pass

    def on_event(self):
        pass

    def on_draw(self, screen):
        screen.blit(self.back, (0,0))
</pre>
<p>Por favor dejad vuestra opinión sobre si está bien explicado o no, si debería dar mas detalles o cualquier sugerencia para futuras entregas.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/" title="Arkanoid V &#8211; Creando la bola">Arkanoid V &#8211; Creando la bola</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/" title="Arkanoid IV &#8211; Creando la pala">Arkanoid IV &#8211; Creando la pala</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-ii-gestionando-escenas/" title="Arkanoid II &#8211; Gestionando escenas">Arkanoid II &#8211; Gestionando escenas</a></li><li><a href="http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/" title="Arkanoid I &#8211; Empezando y configurando">Arkanoid I &#8211; Empezando y configurando</a></li><li><a href="http://razonartificial.com/2010/07/juego-de-la-serpiente-paso-a-paso-parte-2/" title="Juego de la serpiente paso a paso. Parte 2">Juego de la serpiente paso a paso. Parte 2</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/K_ZXf9ldYVBpr7lhQPhtafjP7bw/0/da"><img src="http://feedads.g.doubleclick.net/~a/K_ZXf9ldYVBpr7lhQPhtafjP7bw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/K_ZXf9ldYVBpr7lhQPhtafjP7bw/1/da"><img src="http://feedads.g.doubleclick.net/~a/K_ZXf9ldYVBpr7lhQPhtafjP7bw/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/OYZ2qRiLo3w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/09/arkanoid-iii-disenando-la-pantalla-de-juego/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/09/arkanoid-iii-disenando-la-pantalla-de-juego/</feedburner:origLink></item>
		<item>
		<title>Arkanoid II – Gestionando escenas</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/jBshfUBNfOU/</link>
		<comments>http://razonartificial.com/2010/09/arkanoid-ii-gestionando-escenas/#comments</comments>
		<pubDate>Tue, 28 Sep 2010 22:50:21 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Arkanoid]]></category>
		<category><![CDATA[Pygame]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=832</guid>
		<description><![CDATA[Una vez listo nuestro directorio de trabajo y nuestro archivo de configuración es hora de implementar el sistema de escenas que ya mencionamos en el artículo anterior. Vuelvo a recomendar encarecidamente leer y entender el artículo de gestión de escenas, pues no voy a volver a explicarlo. El archivo director.py Es el archivo que contiene el objeto director que es en última estancia el que llevará el bucle de nuestro juego y que gestionará [...]]]></description>
			<content:encoded><![CDATA[<p>Una vez listo nuestro directorio de trabajo y nuestro archivo de configuración es hora de implementar el sistema de escenas que ya mencionamos en el artículo anterior. Vuelvo a recomendar encarecidamente leer y entender el artículo de <a href="http://razonartificial.com/2010/08/gestionando-escenas-con-pygame/">gestión de escenas</a>, pues no voy a volver a explicarlo.</p>
<h2>El archivo director.py</h2>
<p>Es el archivo que contiene el objeto director que es en última estancia el que llevará el bucle de nuestro juego y que gestionará las diferentes escenas.</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

# Módulos
import pygame
import config

class Director:
    &quot;&quot;&quot;Representa el objeto principal del juego.

    El objeto Director mantiene en funcionamiento el juego, se
    encarga de actualizar, dibuja y propagar eventos.

    Tiene que utilizar este objeto en conjunto con objetos
    derivados de Scene.&quot;&quot;&quot;

    def __init__(self):
        self.screen = pygame.display.set_mode((config.width, config.height))
        pygame.display.set_caption(config.name)
        self.scene = None
        self.quit_flag = False
        self.clock = pygame.time.Clock()

    def loop(self):
        &quot;Pone en funcionamiento el juego.&quot;

        while not self.quit_flag:
            self.time = self.clock.tick(60)

            # Eventos de Salida
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.quit()

            # detecta eventos
            self.scene.on_event()

            # actualiza la escena
            self.scene.on_update()

            # dibuja la pantalla
            self.scene.on_draw(self.screen)
            pygame.display.flip()

    def change_scene(self, scene):
        &quot;Altera la escena actual.&quot;
        self.scene = scene

    def quit(self):
        self.quit_flag = True
</pre>
<p>A destacar ver como importamos el archivo config y lo usamos para cargar la resolución o el nombre del juego. Lo demás viene explicado en el artículo de la gestión de escenas.</p>
<h2>El archivo scene.py</h2>
<p>Representará una escena abstracta del juego y será heredada por las escenas de nuestro juego.</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

class Scene:
    &quot;&quot;&quot;Representa un escena abstracta del videojuego.

    Una escena es una parte visible del juego, como una pantalla
    de presentación o menú de opciones. Tiene que crear un objeto
    derivado de esta clase para crear una escena utilizable.&quot;&quot;&quot;

    def __init__(self, director):
        self.director = director

    def on_update(self):
        &quot;Actualización lógica que se llama automáticamente desde el director.&quot;
        raise NotImplemented(&quot;Tiene que implementar el método on_update.&quot;)

    def on_event(self, event):
        &quot;Se llama cuando llega un evento especifico al bucle.&quot;
        raise NotImplemented(&quot;Tiene que implementar el método on_event.&quot;)

    def on_draw(self, screen):
        &quot;Se llama cuando se quiere dibujar la pantalla.&quot;
        raise NotImplemented(&quot;Tiene que implementar el método on_draw.&quot;)
</pre>
<h2>SceneGame</h2>
<p>Aunque cuando nuestro juego esté acabado la escena inicial será SceneHome en un principio vamos a crear y a cargar SceneGame mientras desarrollamos el juego ya que el menú principal lo desarrollaremos más adelante. Esto solo afecta a la escena que cargaremos en primer lugar y luego cambiar a SceneHome será tan fácil como sustituirla en el archivo main.</p>
<p>La clase que representan a las escena he decidido llamarlas SceneName donde Name es el nombre de la escena y el archivo que las contiene se llamará scene_name donde otra vez name es el nombre de la escena.</p>
<p>Por tanto creamos un archivo llamado <strong>scene_game.py</strong> y dentro creamos nuestra escena <strong>SceneGame</strong>:</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

import scene
import config

class SceneGame(scene.Scene):
    &quot;&quot;&quot;Escena inicial del juego, esta es la primera que se carga cuando inicia&quot;&quot;&quot;

    def __init__(self, director):
        scene.Scene.__init__(self, director)

    def on_update(self):
        pass

    def on_event(self):
        pass

    def on_draw(self, screen):
        pass
</pre>
<p>Como vemos creamos la clase SceneGame como se explica en el tutorial, con el método init llamando al init de Scene y creando los tres métodos de actualizar, eventos y dibuhar de rigor. Que, de momento, estñan vacíos.</p>
<h2>El archivo principal</h2>
<p>Por último debemos crear el archivo <strong>main.py</strong> que será el encargado de ejecutar el juego. Por ahora <strong>main.py</strong> cargará <strong>SceneGame</strong>, pero cuando nuestro juego este listo pasará a cargar <strong>SceneHome</strong>.</p>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Módulos
import pygame
import director
import scene_game

def main():
    dir = director.Director()
    scene = scene_game.SceneGame(dir)
    dir.change_scene(scene)
    dir.loop()

if __name__ == '__main__':
    pygame.init()
    main()
</pre>
<p>Con esto ya debemos poder ejecutar nuestro juego y tener una ventana en negro que en realidad es más que eso, pues está lista para ejecutar las ordenes dadas en <strong>SceneGame</strong>.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/" title="Arkanoid V &#8211; Creando la bola">Arkanoid V &#8211; Creando la bola</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/" title="Arkanoid IV &#8211; Creando la pala">Arkanoid IV &#8211; Creando la pala</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iii-disenando-la-pantalla-de-juego/" title="Arkanoid III &#8211; Diseñando la pantalla de juego">Arkanoid III &#8211; Diseñando la pantalla de juego</a></li><li><a href="http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/" title="Arkanoid I &#8211; Empezando y configurando">Arkanoid I &#8211; Empezando y configurando</a></li><li><a href="http://razonartificial.com/2010/07/juego-de-la-serpiente-paso-a-paso-parte-2/" title="Juego de la serpiente paso a paso. Parte 2">Juego de la serpiente paso a paso. Parte 2</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/GBMGij3lCRK7LTBVvR8K7pbTGLo/0/da"><img src="http://feedads.g.doubleclick.net/~a/GBMGij3lCRK7LTBVvR8K7pbTGLo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/GBMGij3lCRK7LTBVvR8K7pbTGLo/1/da"><img src="http://feedads.g.doubleclick.net/~a/GBMGij3lCRK7LTBVvR8K7pbTGLo/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/jBshfUBNfOU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/09/arkanoid-ii-gestionando-escenas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/09/arkanoid-ii-gestionando-escenas/</feedburner:origLink></item>
		<item>
		<title>Arkanoid I – Empezando y configurando</title>
		<link>http://feedproxy.google.com/~r/RazonArtificial/~3/IzZi_jGxLNc/</link>
		<comments>http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/#comments</comments>
		<pubDate>Tue, 28 Sep 2010 22:01:22 +0000</pubDate>
		<dc:creator>adrigm</dc:creator>
				<category><![CDATA[Desarrollo Videojuegos]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Arkanoid]]></category>
		<category><![CDATA[Pygame]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://razonartificial.com/?p=826</guid>
		<description><![CDATA[En esta ocasión vamos a crear el clásico juego Arkanoid desde 0. La idea del proyecto es servir de continuación al tutorial del Pong, este será un juego más elaborado con gestión de escenas, niveles, mejor sistema de colisiones, puntaciones, etc. El juego, como viene siendo habitual en el blog será desarrollado sobre Python y Pygame ya que nos permite centrarnos en los conceptos del juego sin tener que pelearnos con el lenguaje de [...]]]></description>
			<content:encoded><![CDATA[<p>En esta ocasión vamos a crear el clásico juego Arkanoid desde 0. La idea del proyecto es servir de continuación al tutorial del Pong, este será un juego más elaborado con gestión de escenas, niveles, mejor sistema de colisiones, puntaciones, etc.</p>
<p>El juego, como viene siendo habitual en el blog será desarrollado sobre Python y Pygame ya que nos permite centrarnos en los conceptos del juego sin tener que pelearnos con el lenguaje de programación.</p>
<h2>Requisitos previos</h2>
<ul>
<li>Nivel aceptable de Python y control de la programación orientada a objetos.</li>
<li>Manejarse con los conceptos básicos de Pygame. Si no tienes esta base, primero haz el <a href="http://razonartificial.com/tutoriales-pygame/">tutorial del Pong</a>.</li>
<li>Controlar los conceptos básicos de la programación de juegos 2D. <a href="http://razonartificial.com/2010/08/introduccion-a-la-programacion-grafica-2d-i/">Parte 1</a>, <a href="http://razonartificial.com/2010/08/introduccion-a-la-programacion-grafica-2d-ii/">Parte 2</a> y <a href="http://razonartificial.com/2010/08/introduccion-a-la-programacion-grafica-2d-iii/">Parte 3</a>.</li>
<li>Leer el tutorial de la <a href="http://razonartificial.com/2010/08/gestionando-escenas-con-pygame/">gestión de escenas</a> con pygame, pues lo usaremos.</li>
</ul>
<p>Bueno esta vez no es un simple Pong, sino que queremos hacer algo más elaborado y completo. Crear un juego que conste de varios menús, puntaciones, niveles, dificultad, etc. Esto ya conlleva no hacer las cosas a la ligera y planificar mucho más que es lo que se va a hacer y como se va a abordar.</p>
<p>Es muy importante cumplir los requesitos previos, sino estarás algo perdido y te desmotivarás. No voy a volver a explicar conceptos de los ya mencionados arriba, porque están explicados de manera extensa en los artículos mencionados, nos vamos a centrar en utilizar lo ya aprendido y en algunas cosas nuevas para hacer un proyecto de más envergadura.</p>
<h2>Preparándonos para trabajar</h2>
<p>Lo primero como siempre es tener un directorio de trabajo donde irán los archivos de nuestro proyecto. Dentro de este yo lo tengo organizado de la siguiente manera:</p>
<ul>
<li>Directorio principal/
<ul>
<li>archivos .py</li>
<li>Data/
<ul>
<li>graphics/
<ul>
<li>backgrounds/</li>
<li>menus/</li>
<li>sprites/</li>
</ul>
</li>
<li>audio/
<ul>
<li>music/</li>
<li>sounds/</li>
</ul>
</li>
<li>fonts/</li>
</ul>
</li>
<li>levels/</li>
</ul>
</li>
</ul>
<p>A grandes rasgos la estructura es los <strong>scripts de python</strong> van en la carpeta principal, luego hay un directorio <strong>Data </strong>que contiene 3 directorios <strong>graphics</strong>, <strong>audio </strong>y <strong>fonts </strong>y a su vez estos tienen varios subdirectorios para según el contenido. Luego hay otra carpeta llamada <strong>levels </strong>que contendrá los niveles del juego. Esta es la estructura inicial que yo tengo puede que necesitemos algún directorio más en el proceso de creación, lo añadiríamos sin problemas.</p>
<h2>Estructura del juego</h2>
<p>Bien montado el chiringuito, antes de ponernos a escribir código vamos a ver de que partes consta nuestro juego. Es un juego clásico del Arkanoid, pero es nuestro Arkanoid y lo podemos hacer tan parecido o tan diferente como queramos. Lo primero es definir las escenas. Las escenas del juego son las diferentes pantallas que nos podemos encontrar. El menú principal, la pantalla de puntuaciones, un nivel del juego&#8230; Son diferentes escenas dentro del juego. Lee <a href="http://razonartificial.com/2010/08/gestionando-escenas-con-pygame/">este tutorial</a> para saber más sobre las escenas y saber como gestionarlas con Python y Pygame.</p>
<p>En principio nuestro juego va a constar de 3 escenas diferentes.</p>
<ul>
<li><strong>SceneHome</strong>: Será el menú de inicio de nuestro juego y desde este podremos empezar una nueva partida, continuar, mirar las puntuaciones o salir.</li>
<li><strong>SceneGame</strong>: Será la escena de nuestro juego, donde se carguen los niveles y donde jugaremos. Será la escena más importante pues contiene el juego en sí.</li>
<li><strong>ScenePoints</strong>. Será una escena que contendrá las mejores puntuaciones de nuestro juego.</li>
</ul>
<p>Veamos un esquema de nuestas escenas:</p>
<p><a href="http://razonartificial.com/wp-content/uploads/2010/09/escenas.png"><img class="aligncenter size-full wp-image-827" title="escenas" src="http://razonartificial.com/wp-content/uploads/2010/09/escenas.png" alt="" width="355" height="215" /></a></p>
<p>La escena principal (<strong>SceneHome</strong>) será la primera que se cargará al ejecutar el juego y desde la que podremos acceder a las otras dos como indica el diagrama. Como véis las flechas indican de que escena se puede ir a cual, por ejemplo desde <strong>SceneHome </strong>se puede acceder a <strong>SceneGame </strong>y <strong>ScenePoints </strong>y desde estas a <strong>SceneHome</strong>, pero desde <strong>SceneGame </strong>no se puede acceder a <strong>ScenePoints</strong>. Es decir, es <strong>SceneHome </strong>la encargada de comunicar a las escenas.</p>
<h2>El archivo confi.py</h2>
<p>El primer archivo de nuestro proyecto no va a ser el <strong>main.py</strong> que sería lo típico, sino un archivo llamado <strong>config.py</strong>, Este archivo contendrá información global del juego y parámetros de configuración globales que podrán ser accedidos desde todo el proyecto. Variables tales como la resolución, el nombre del juego o rutas de directorio los iremos poniendo aquí, de momento vamos a definir unas variables bases.</p>
<pre class="brush: python; title: ; notranslate">
# -*- encoding: utf-8 -*-

&quot;&quot;&quot; Configuración general del proyecto &quot;&quot;&quot;

# Nombre
name = &quot;Arkanoid&quot;

# Resolución
width = 640
height = 480

# Directorios
sprites = &quot;data/graphics/sprites/&quot;
backs = &quot;data/graphics/backgrounds/&quot;
menus = &quot;data/graphics/menus/&quot;
fonts = &quot;data/fonts/&quot;
music = &quot;data/audio/music/&quot;
sounds = &quot;data/audio/sounds/&quot;
levels = &quot;levels/&quot;
</pre>
<p>Hemos definido una variables básicas para la resolución y los directorios. La ventaja de tenerlos aquí es que si en algún momento deseamos cambiar el nombre de un directorio, la resolución o cualquier otro parámetro global, no hay que estar buscando donde lo hemos usado, sino que directamente editamos nuestro <strong>config.py</strong>.</p>
<ul class="related_post"><li><a href="http://razonartificial.com/2010/09/arkanoid-v-creando-la-bola/" title="Arkanoid V &#8211; Creando la bola">Arkanoid V &#8211; Creando la bola</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iv-creando-la-pala/" title="Arkanoid IV &#8211; Creando la pala">Arkanoid IV &#8211; Creando la pala</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-iii-disenando-la-pantalla-de-juego/" title="Arkanoid III &#8211; Diseñando la pantalla de juego">Arkanoid III &#8211; Diseñando la pantalla de juego</a></li><li><a href="http://razonartificial.com/2010/09/arkanoid-ii-gestionando-escenas/" title="Arkanoid II &#8211; Gestionando escenas">Arkanoid II &#8211; Gestionando escenas</a></li><li><a href="http://razonartificial.com/2010/07/juego-de-la-serpiente-paso-a-paso-parte-2/" title="Juego de la serpiente paso a paso. Parte 2">Juego de la serpiente paso a paso. Parte 2</a></li></ul>
<p><a href="http://feedads.g.doubleclick.net/~a/EWn03PX0g4FdR4DGStxgmvGrbmA/0/da"><img src="http://feedads.g.doubleclick.net/~a/EWn03PX0g4FdR4DGStxgmvGrbmA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/EWn03PX0g4FdR4DGStxgmvGrbmA/1/da"><img src="http://feedads.g.doubleclick.net/~a/EWn03PX0g4FdR4DGStxgmvGrbmA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/RazonArtificial/~4/IzZi_jGxLNc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://razonartificial.com/2010/09/creando-un-arkanoid-parte-1/</feedburner:origLink></item>
	</channel>
</rss>

