<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lobo_tuerto &#187; game development</title>
	<atom:link href="http://lobotuerto.com/blog/category/game-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://lobotuerto.com/blog</link>
	<description>Zen hunting — Hacking at life &#38; Ruby development</description>
	<lastBuildDate>Fri, 23 Jul 2010 18:07:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>lotu &#8212; Un framework para desarrollo de juegos en Ruby</title>
		<link>http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/</link>
		<comments>http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 03:25:40 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[game architecture]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[game framework]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[lotu]]></category>
		<category><![CDATA[programación de juegos]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubytris]]></category>
		<category><![CDATA[steering]]></category>
		<category><![CDATA[tetris]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=3715</guid>
		<description><![CDATA[Pues aquí estoy con un nuevo proyecto. Un framework para desarrollar juegos en Ruby. Los antecedentes Después de terminar mi clon de Tetris llamado rubytris, decidí darme a la tarea de implementar otro clon de los juegos de antaño &#8212;¡y uno de mis favoritos!: Missile Command. Debo comentar que a medio camino se me ocurrió [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/ruby/ruby.jpg" title="" class="thickbox" rel="singlepic484" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=484&amp;width=60&amp;height=&amp;mode=" alt="ruby.jpg" title="ruby.jpg" />
</a>
Pues aquí estoy con un nuevo proyecto. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Un <em>framework</em> para desarrollar juegos en <strong><a href="http://www.ruby-lang.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby Programming Language"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Ruby</a></strong>.</p>
<h2>Los antecedentes</h2>
<p>Después de terminar mi clon de <a href="http://es.wikipedia.org/wiki/Tetris">Tetris</a> llamado <a href="http://github.com/lobo-tuerto/rubytris"><strong>rubytris</strong></a>, decidí darme a la tarea de implementar otro clon de los juegos de antaño &#8212;¡y uno de mis favoritos!: <a href="http://es.wikipedia.org/wiki/Missile_Command">Missile Command</a>.</p>
<p>Debo comentar que a medio camino se me ocurrió utilizar <strong>comportamientos de direccíón</strong> (<a href="http://www.red3d.com/cwr/steer/">steering behaviors</a>) para modelar el movimiento de los misiles &#8212;y algunos otras entidades&#8212; para una experiencia más envolvente.</p>
<p>Así, le puse pausa al <strong>Missile Command</strong> y comencé a desarrollar otro proyecto llamado <a href="http://github.com/lobo-tuerto/ruby_steering_behaviors"><strong>ruby_steering_behaviors</strong></a> que cuenta ya con los <em>comportamientos</em> necesarios para utilizarlo en mi juego nuevo).</p>
<p>Durante la implementación de esos dos proyectos comencé a desarrollar abstracciones y clases útiles que no tenía en <strong>rubytris</strong> (mi primer juego):</p>
<ul>
<li><strong>Estados de juego</strong><br />
Auxiliado por una máquina de estados es mucho más sencillo implementar las diversas pantallas de juego, entradas (splash screens) y menús.</li>
<li><strong>Manejador de recursos</strong><br />
Para un fácil acceso a las imágenes, fuentes y sonidos.</li>
<li><strong>Manejador de eventos</strong><br />
Un sistema de disparo y captación de eventos.</li>
<li><strong>Funciones auxiliares</strong><br />
Para facilitar el despliegue de texto, imágenes, sonidos.</li>
<li><strong>Clases útiles</strong><br />
Un contador de cuadros por segundo (FPS counter).<br />
Un visor (viewport) para poder tener espacios virtuales de tamaños arbitrarios, con acercamientos, alejamientos y control de entrada.</li>
</ul>
<p>Desgraciadamente el trabajo y otras actividades de mi vida cotidiana me absorbieron demasiado y dejé ambos proyectos abandonados por un rato.</p>
<p>Pero, ahora que logré hacerme de un tiempecito decidí retomarlos y me pregunté:<br />
¿por qué no desarrollar un <em>framework</em> que incluya todo eso (más lo que salga)? ¿podría ser provechoso para alguien más? Creo que sí.</p>
<p>Y así nació <a href="http://github.com/lobo-tuerto/lotu"><strong>lotu</strong></a>.</p>
<h2><strong>lotu</strong></h2>
<p><strong>lotu</strong> es un <em>framework</em> naciente que está basado en <a href="http://code.google.com/p/gosu/">gosu</a>, una biblioteca para creación de juegos en 2D.</p>
<p>Siendo <strong>gosu</strong> una biblioteca, te provee únicamente con las funciones básicas para crear un juego y nada más.</p>
<p><strong>lotu</strong>, por otro lado se encargará de hacer el proceso de creación de juegos simple e intuitivo. <strong>gosu</strong> provee las herramientas y <strong>lotu</strong> los medios. <strong>gosu</strong> da el <em>con qué</em> y <strong>lotu</strong> provee el <em>cómo</em>.</p>
<p>Sin un marco de trabajo (<em>framework</em>), eres totalmente libre de organizar tu código de la forma que más te plazca, pero corres el riesgo de caer en el caos completo.</p>
<p>Un <em>framework</em> impone ciertas convenciones, te enseña un estilo de trabajo. Si las convenciones ayudan a desarrollar de una manera más rápida y menos compleja tu proyecto, entonces podemos decir que el <em>framework</em> es exitoso.</p>
<p>Como experimento he decidido desarrollar a la par mi juego nuevo y <strong>lotu</strong>. Espero que de esta manera ambos se retroalimenten y así obtener un mejor resultado.</p>
<h3>lotu gem</h3>
<p>Nunca antes había hecho una gema en <strong>Ruby</strong>. Se me hacía un proceso esotérico y extraño (<strong>lotu</strong> es mi primera gema ¡que emoción!). <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Pero <a href="http://github.com/technicalpickles/jeweler">jeweler</a> realmente te la pone fácil, demasiado diría yo jeje. Si no me crees, checa este video:<br />
<a href="http://railscasts.com/episodes/183-gemcutter-jeweler">Gemcutter &#038; Jeweler</a></p>
<p>La gema la puedes instalar con:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> lotu</pre></td></tr></table></div>

<p>Sin embargo si quieres ir al día con el desarrollo te aconsejo que lo cheques en <a href="http://github.com">github</a>.</p>
<h2>Otros <em>frameworks</em></h2>
<p>¿Por qué no usar un <em>framework</em> existente como <a href="http://ippa.se/chingu">chingu</a>?</p>
<p>La razón principal es <em>aprendizaje</em>. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>¡Es hora de programar!</strong> <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/' title='Metris &#8212; Mi clón de Tetris en Ruby y Gosu'>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/' title='Rubytris en GitHub'>Rubytris en GitHub</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/' title='Programación de videojuegos con Gosu en Ruby'>Programación de videojuegos con Gosu en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/11/17/programando-un-pbbg-en-ruby-rails/' title='Programando un PBBG en Ruby &amp; Rails'>Programando un PBBG en Ruby &#038; Rails</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programando un PBBG en Ruby &amp; Rails</title>
		<link>http://lobotuerto.com/blog/2009/11/17/programando-un-pbbg-en-ruby-rails/</link>
		<comments>http://lobotuerto.com/blog/2009/11/17/programando-un-pbbg-en-ruby-rails/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 19:16:27 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[pbbg]]></category>
		<category><![CDATA[program]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=3519</guid>
		<description><![CDATA[Después de mi corto regreso a la programación de videojuegos, y de haber visto por ahí y leído acerca de algunos PBBGs, finalmente he decido darme a la tarea de desarrollar uno. PBBGs Seguramente se preguntarán ¿qué es y cómo se juega un PBBG? PBBG == Persistent Browser Based Game Eso básicamente quiere decir: juego [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/avatares/lobo_tuerto.jpg" title="" class="thickbox" rel="singlepic610" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=610&amp;width=90&amp;height=&amp;mode=" alt="lobo_tuerto" title="lobo_tuerto" />
</a>

<p align="justify">Después de mi corto regreso a la programación de videojuegos, y de haber visto por ahí y leído acerca de algunos <a href="http://en.wikipedia.org/wiki/Pbbg"><strong>PBBGs</strong></a>, finalmente he decido darme a la tarea de desarrollar uno.
</p>
<div style="clear: both;"></div>
<p align="justify">
<h3>PBBGs</h3>
<p>Seguramente se preguntarán ¿qué es y cómo se juega un <strong>PBBG</strong>?</p>
<p><strong>PBBG == Persistent Browser Based Game</strong><br />
Eso básicamente quiere decir: <em>juego persistente para navegador</em>.</p>
<p>La infraestructura y herramientas necesarias para desarrollar videojuegos en el ámbito del desarrollo web no son ni remotamente cercanas a las que existen para el desarrollo de escritorio.</p>
<p>Así, esto se convierte básicamente en un arte, hay que diseñar y desarrollar un videojuego alrededor de una estructura de operación ya establecida como lo es el protocolo <strong>HTTP</strong>, el modelo cliente-servidor y los tiempos de respuesta acostumbrados de una página web.</p>
<p>Por esta razón, la gran mayoría de los <strong>PBBGs</strong> se inclinan por uno de estos dos géneros:</p>
<ul>
<li>Juegos de rol</li>
<li>Juegos de estrategia</li>
</ul>
<p>O alguna mezcla rara entre ellos.</p>
<p>El modelo de participación preferido y más fácil de implementar es por <em>turnos</em>, aunque algunos de los PBBGs más modernos están incorporando un modelo de participación en <em>tiempo real</em>.</p>
<p>Si no conoces aún algún <strong>PBBG</strong>, aquí te dejo unos enlaces para que te des una idea de cómo son y cómo se juegan:</p>
<ul>
<li><a href="http://forumwarz.com/">Forumwarz</a></li>
<li><a href="http://www.playnileonline.com/">Nile Online</a></li>
<li><a href="http://bitefight.es/">BiteFight</a></li>
<li><a href="http://www.neopets.com/">Neopets</a></li>
<li><a href="http://www.cthulhunation.co.uk/">Cthulhu Nation MORPG</a></li>
<li><a href="http://www.travian.com.mx/">Travian</a></li>
</ul>
<p>Los juegos de estrategia tradicionalmente se dividen en: <strong>por turno</strong> (TBS) [turn based strategy] y <strong>en tiempo real</strong> (RTS) [real time strategy]. En los <strong>PBBG</strong> he visto mucho el uso de <strong>tiempo instantáneo</strong> (ITS) [instant time strategy].</p>
<h4>Instant Time Strategy (ITS)</h4>
<p>Por lo que he visto la estrategia en tiempo instantáneo es muy popular entre los desarrolladores de <strong>PBBGs</strong>. </p>
<p>Modelan combates enteros con ecuaciones y obtienen de manera inmediata el resultado de las peleas.</p>
<p>Aunque adecuado a la situación, este nivel de abstracción se me antoja demasiado alto para mi proyecto. Me llama la atención el implementar algo más cercano al tiempo real (o una mezcla de tiempo real y turnos).</p>
<p>Ahora con tecnologías como Ajax, lenguajes como <a href="http://www.ruby-lang.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby Programming Language"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Ruby</a> y frameworks como <a href="http://www.rubyonrails.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby on Rails"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Rails</a>, no es tan complicado hacer un <strong>PBBG</strong>.</p>
<p>Ya que andamos hablando de tecnologías, les presento mi <em>stack</em> de desarrollo.</p>
<h3>Mi <em>development stack</em></h3>
<p>Aquí pongo la lista de las herramientas que estoy utilizando para llevar a cabo este proyecto:</p>
<ul>
<li><a href="http://www.ubuntu.com/">Linux</a> (nada mejor para el desarrollo en general)</li>
<li><a href="http://www.postgresql.org/">PostgreSQL</a> (una robusta base de datos)</li>
<li><a href="http://www.ruby-lang.org/">Ruby</a> (sigo enamorado de este lenguaje)</li>
<li><a href="http://rubyonrails.org/">Rails</a> (web development framework)</li>
<li><a href="http://jquery.com/">jQuery</a> (javascript framework)</li>
<li><a href="http://github.com/justinfrench/formtastic">Formtastic</a> (excelente para lidiar con formas)</li>
<li><a href="http://github.com/binarylogic/authlogic">Authlogic</a> (para implementar la autenticación de usuarios)</li>
<li><a href="http://haml-lang.com/">Haml</a> (lenguaje para escribir las vistas HTML de la aplicación)</li>
<li><a href="http://sass-lang.com/">Sass</a> (lenguaje para escribir el CSS de la aplicación)</li>
<li><a href="http://compass-style.org/">Compass</a> (framework CSS para hacer el layout de la aplicación)</li>
<li><a href="http://git-scm.com/">git</a> (version control system)</li>
<li><a href="http://www.gnu.org/software/emacs/">emacs</a> (editor de código)</li>
</ul>
<p>Tengo grandes planes para este <strong>PBBG</strong>: misiones, peleas entre clanes,  clases variadas, habilidades especiales, mercado, subastas y una vibrante comunidad a su alrededor.</p>
<p>Pero como todo: debe empezar por algún lado.</p>
<h3>Modelando los combates</h3>
<p>Veamos un elemento que considero <em>fundamental</em> para este PBBG: <strong>El sistema de batallas</strong>.</p>
<p>En mi caso particular, si algo deseo ver funcionando primero son los combates.</p>
<p>Había comentado antes que quiero mis batallas en tiempo real (o algo que se le acerque). El <em>tiempo real</em> que puedes conseguir en una aplicación web no es el común de 60 <a href="http://es.wikipedia.org/wiki/Im%C3%A1genes_por_segundo">fps</a> de los videojuegos tradicionales.</p>
<p>Aquí tienes que pensar en término de peticiones por segundo a tu servidor web. GET, POST, params, sesiones, etc.</p>
<p>A continuación pongo una lista con algunas de las características que me gustaría ver en el sistema de batallas:</p>
<p><strong>Representar y llevar a cabo un combate entre varios participantes</strong></p>
<ul>
<li>Duelos entre jugadores</li>
<li>Duelos entre NPC y jugadores</li>
<li>Duelos entre grupos de jugadores</li>
</ul>
<p><strong>Durante el combate los personajes podrán hacer uso de habilidades especiales, objetos y armas</strong></p>
<ul>
<li>Un guerrero puede dar un golpe especial con su arma</li>
<li>Un brujo puede hacer uso de alguna magia</li>
<li>Un guerrero puede hacer uso de una poción para curarse</li>
</ul>
<p><strong>En la pelea, los jugadores podrán seleccionar un objetivo para atacar</strong></p>
<ul>
<li>Un guerrero puede seleccionar al enemigo de su preferencia para recibir sus ataques</li>
</ul>
<p>En el próximo artículo pondré algo de código del sistema de batallas, las decisiones de diseño que se tomaron y una breve explicación de cómo funciona.</p>
<p>Suena bien para comenzar, ¿no?</p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/10/ruby-steering-behaviors/' title='Ruby steering behaviors'>Ruby steering behaviors</a></li>
<li><a href='http://lobotuerto.com/blog/2009/11/17/como-mostrar-las-sentencias-sql-en-la-consola-de-rails/' title='Cómo mostrar las sentencias SQL en la consola de Rails'>Cómo mostrar las sentencias SQL en la consola de Rails</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/' title='Rubytris en GitHub'>Rubytris en GitHub</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/31/una-manita-de-gato-al-clon-de-tetris/' title='Una manita de gato al clon de Tetris'>Una manita de gato al clon de Tetris</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/11/17/programando-un-pbbg-en-ruby-rails/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ruby steering behaviors</title>
		<link>http://lobotuerto.com/blog/2009/08/10/ruby-steering-behaviors/</link>
		<comments>http://lobotuerto.com/blog/2009/08/10/ruby-steering-behaviors/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 14:39:23 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[artificial]]></category>
		<category><![CDATA[behaviors]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[ia]]></category>
		<category><![CDATA[inteligencia]]></category>
		<category><![CDATA[intelligence]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[steering]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=3187</guid>
		<description><![CDATA[O, como dirían en español: Comportamientos de dirección en Ruby. Estos sirven para crear agentes autónomos que navegan un ambiente. Un agente armado con estos comportamientos puede ir tras otro, huir de él, esconderse, ser parte de una formación, etc. Unos de los más interesantes de observar son los comportamientos en manada (flocking behaviors), pero [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/steering_b1.jpg" title="" class="thickbox" rel="singlepic676" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=676&amp;width=120&amp;height=&amp;mode=" alt="steering_b1" title="steering_b1" />
</a>

<p align="justify">O, como dirían en español:<br />
<a href="http://www.red3d.com/cwr/steer/"><strong>Comportamientos de dirección</strong></a> en <a href="http://www.ruby-lang.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby Programming Language"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Ruby</a>.</p>
<p>Estos sirven para crear agentes autónomos que <em>navegan</em> un ambiente. Un agente armado con estos comportamientos puede ir tras otro, huir de él, esconderse, ser parte de una formación, etc.</p>
<p>Unos de los más interesantes de observar son los comportamientos en manada (<em>flocking behaviors</em>), pero sobre eso ya vendrá otro artículo. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>En este fin de semana programé estos cuatro:</p>
<ul>
<li><strong>Seek</strong> (búsqueda)</li>
<li><strong>Flee</strong> (huir)</li>
<li><strong>Arrive</strong> (llegar)</li>
<li><strong>Pursuit</strong> (persecusión)</li>
</ul>
<p>Espero poder incluir los demás pronto, aunque creo que refactorizaré un poco antes de implementar más cosas.</p>
<p>Estoy planeando usarlos en mi siguiente juego, que como les había comentado es un clon del <strong>Missile Commander</strong> (ese donde tenías que derribar los misiles enemigos con los propios antes de que tocaran el suelo y destruyeran tu base).</p>
<h3>El código</h3>
<p>No está comentado por el momento y seguramente se puede mejorar en muchas partes, ya lo iré limpiando y ajustando en las próximas semanas.</p>
<p>Entre las cosas que contiene hay una clase llamada <strong>Viewport</strong> que creé para poder jugar con mis agentes en un espacio más grande sin que el tamaño de la pantalla fuera una limitante. Velo como un <em>sandbox</em> que puedes configurar con un tamaño arbitrario.</p>
<p>Por ejemplo, puedes tener un espacio virtual de 4000&#215;3000 pixeles dentro de un <em>viewport</em> que mide 800&#215;600 pixeles (reales) dentro de tu pantalla configurada a 1024&#215;768.</p>
<p> Además se comporta como un toroide, es decir, los agentes pasan de un lado al otro, no pueden salirse de él.</p>
<p>Esto lo implementé porque estoy pensando mostrar cada comportamiento en un <em>viewport</em> diferente, pero todos en la misma pantalla.<br />
Creo que también se podría usar para implementar un mini mapa, ¿no?</p>
<h3>El demo</h3>
<p>Hay tres agentes de diferentes colores en el demo.</p>
<p>Usa tu ratón. Al dar clic en algún lugar de la pantalla se pondrá una marca verde y sucederán 3 cosas:</p>
<ul>
<li>El agente verde huirá de ella.</li>
<li>El agente blanco llegará a ella.</li>
<li>El agente rojo perseguirá al blanco, prediciendo su posición futura, ésta se muestra como una marca blanca enfrente del agente blanco.</li>
</ul>
<p>Presiona <strong>D</strong> para ocultar el texto informativo.<br />
Presiona <strong>Esc</strong> para salir del demo.</p>
<p>Pueden bajar la aplicación demo de <a href="http://github.com/"  class="alinks_links" onclick="return alinks_click(this);" title="Secure source code hosting and collaborative development"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">GitHub</a>: <a href="http://github.com/lobo-tuerto/ruby_steering_behaviors/tree/master"><strong>ruby_steering_behaviors</strong></a></p>
<p>Estoy usando como referencia el excelente libro: <strong>Programming AI by Example</strong>.</p>
<h3>Implementación en C++</h3>
<p>Para los que anden buscando una implementación en C++ existe <a href="http://sourceforge.net/projects/opensteer/"><strong>OpenSteer</strong></a>.</p>
<blockquote><p>OpenSteer is a C++ library to help build steering behaviors for autonomous characters in games and animation. OpenSteer provides an app which displays predefined demos of steering behaviors. You can prototype, visualize and debug your own as a plug-in.<br />
License: MIT License</p></blockquote>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/11/17/programando-un-pbbg-en-ruby-rails/' title='Programando un PBBG en Ruby &amp; Rails'>Programando un PBBG en Ruby &#038; Rails</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/' title='Rubytris en GitHub'>Rubytris en GitHub</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/31/una-manita-de-gato-al-clon-de-tetris/' title='Una manita de gato al clon de Tetris'>Una manita de gato al clon de Tetris</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/08/10/ruby-steering-behaviors/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rubytris en GitHub</title>
		<link>http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/</link>
		<comments>http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 00:13:35 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[clón]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[metris]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubytris]]></category>
		<category><![CDATA[tetris]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=3109</guid>
		<description><![CDATA[Sólo para informarles que mi proyecto ya tiene un hogar en GitHub Rubytris (¡con nuevo nombre!) &#160; Este fin de semana refactoricé un buen de código, aunque visualmente no cambió mucho, por dentro es básicamente otro. Si usan git y lo quieren probar, solo deben hacer un: 1 git clone git://github.com/lobo-tuerto/rubytris.git El siguiente fin de [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/rubytris.png" title="" class="thickbox" rel="singlepic675" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=675&amp;width=&amp;height=&amp;mode=" alt="rubytris" title="rubytris" />
</a>

<p align="justify">Sólo para informarles que mi proyecto ya tiene un <a href="http://github.com/lobo-tuerto/rubytris/tree/master">hogar</a> en <strong><a href="http://github.com/"  class="alinks_links" onclick="return alinks_click(this);" title="Secure source code hosting and collaborative development"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">GitHub</a></strong> <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h4><a href="http://github.com/lobo-tuerto/rubytris/tree/master"><strong>Rubytris</strong></a> (¡con nuevo nombre!)</h4>
<p>&nbsp;<br />
Este fin de semana refactoricé un buen de código, aunque visualmente no cambió mucho, por dentro es básicamente otro. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Si usan <a href="http://git.or.cz/"  class="alinks_links" onclick="return alinks_click(this);" title="Git&#8194;&#8211;&#8194;Fast Version Control System"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">git</a> y lo quieren probar, solo deben hacer un:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">git clone git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>lobo-tuerto<span style="color: #000000; font-weight: bold;">/</span>rubytris.git</pre></td></tr></table></div>

<p>El siguiente fin de semana le volveré a meter mano, creo que es una buena idea terminar bien este proyecto antes de saltarme a otro. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
</p>
<div style="clear: both;"></div>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/' title='Metris &#8212; Mi clón de Tetris en Ruby y Gosu'>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/31/una-manita-de-gato-al-clon-de-tetris/' title='Una manita de gato al clon de Tetris'>Una manita de gato al clon de Tetris</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
<li><a href='http://lobotuerto.com/blog/2009/11/17/programando-un-pbbg-en-ruby-rails/' title='Programando un PBBG en Ruby &amp; Rails'>Programando un PBBG en Ruby &#038; Rails</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Una manita de gato al clon de Tetris</title>
		<link>http://lobotuerto.com/blog/2009/07/31/una-manita-de-gato-al-clon-de-tetris/</link>
		<comments>http://lobotuerto.com/blog/2009/07/31/una-manita-de-gato-al-clon-de-tetris/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 02:47:09 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[juegos]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tetris]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=3098</guid>
		<description><![CDATA[Al parecer el proyecto de los steering behaviors va para largo. Por mientras, este fin de semana le daré una manita de gato a mi clon de Tetris, incluso le cambiaré el nombre y lo subiré a GitHub. Entre otras cosas quiero convertirlo en gema y separar el único archivo que contiene todas las clases [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/avatares/lobo_tuerto.jpg" title="" class="thickbox" rel="singlepic610" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=610&amp;width=60&amp;height=&amp;mode=" alt="lobo_tuerto" title="lobo_tuerto" />
</a>

<p align="justify">Al parecer el proyecto de los <a href="http://lobotuerto.com/blog/2009/07/29/optimizando-operaciones-sobre-vectores-en-ruby-con-memoization/">steering behaviors</a> va para largo.</p>
<p>Por mientras, este fin de semana le daré una manita de gato a mi clon de Tetris, incluso le cambiaré el nombre y lo subiré a <strong><a href="http://github.com/"  class="alinks_links" onclick="return alinks_click(this);" title="Secure source code hosting and collaborative development"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">GitHub</a></strong>. Entre otras cosas quiero convertirlo en <em>gema</em> y separar el único archivo que contiene todas las clases en varios ficheros.</p>
<p>También traduciré los comentarios al inglés, y será el juego que mantendré de manera oficial.<br />
El antiguo <strong>Metris</strong> se quedará en <a href="http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/">su artículo</a> como un programa didáctico en español para quien lo quiera usar.</p>
<p>Comenzaré <strong>ahora</strong> mismo. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Actualización 2009-08-01 03:29am</h4>
<p>La refactorización va viento en popa, también ya casi termino la traducción al inglés y la separación en varios archivos. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>De paso modifiqué el algoritmo que obtenía los colores al azar de las piezas &#8212; ¡ya no más piezas oscuras que apenas se ven en el tablero ni piezas con colores desabridos!</p>
<p>¡Ah! y ya tengo el nuevo nombre&#8230; jojojo. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
</p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/' title='Rubytris en GitHub'>Rubytris en GitHub</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/' title='Metris &#8212; Mi clón de Tetris en Ruby y Gosu'>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/' title='Programación de videojuegos con Gosu en Ruby'>Programación de videojuegos con Gosu en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/11/17/programando-un-pbbg-en-ruby-rails/' title='Programando un PBBG en Ruby &amp; Rails'>Programando un PBBG en Ruby &#038; Rails</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/07/31/una-manita-de-gato-al-clon-de-tetris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimizando operaciones sobre vectores en Ruby con memoization</title>
		<link>http://lobotuerto.com/blog/2009/07/29/optimizando-operaciones-sobre-vectores-en-ruby-con-memoization/</link>
		<comments>http://lobotuerto.com/blog/2009/07/29/optimizando-operaciones-sobre-vectores-en-ruby-con-memoization/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 05:49:59 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[2d]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[matemática]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[memoización]]></category>
		<category><![CDATA[memoization]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[pruebas]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[vector]]></category>
		<category><![CDATA[vectorial]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=3068</guid>
		<description><![CDATA[Ahora que estaba haciendo el clon del Missile Commander, me dieron ganas de implementar un movimiento más realista en los misiles. En lugar de que simplemente tuvieran una velocidad lineal desde que salen hasta que explotan al llegar a su destino, quería que aceleraran a la hora de hacer su despegue. Recordé que tengo un [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/ruby/ruby.jpg" title="" class="thickbox" rel="singlepic484" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=484&amp;width=60&amp;height=&amp;mode=" alt="ruby.jpg" title="ruby.jpg" />
</a>

<p align="justify">Ahora que estaba haciendo el clon del <a href="http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/">Missile Commander</a>, me dieron ganas de implementar un movimiento más realista en los misiles.</p>
<p>En lugar de que simplemente tuvieran una velocidad lineal desde que salen hasta que explotan al llegar a su destino, quería que aceleraran a la hora de hacer su despegue.</p>
<p>Recordé que tengo un muy buen libro que habla sobre <strong>steering behaviors</strong> (comportamientos de dirección), y decidí implementarlos en <strong><a href="http://www.ruby-lang.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby Programming Language"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Ruby</a></strong>.</p>
<p>Los <strong>steering behaviors</strong> usan mucha matemática de vectores, así que me puse a desarrollar una pequeña clase para realizar un par de cálculos comunes: <strong>longitud</strong> y <strong>normalización</strong> &#8212; conforme las necesite, le iré agregando otras operaciones útiles.</p>
<h3>La clase Vector2d</h3>
<p>Esta es la clasecita que me ayudará a darle vida a un sinnúmero de entidades virtuales en mis futuros proyectos. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'benchmark'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Vector2d
  attr_reader <span style="color:#ff3333; font-weight:bold;">:x</span>, <span style="color:#ff3333; font-weight:bold;">:y</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>x=<span style="color:#006666;">0</span>,y=<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    clear_length
    <span style="color:#0066ff; font-weight:bold;">@x</span> = x
    <span style="color:#0066ff; font-weight:bold;">@y</span> = y
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> clear_length
    <span style="color:#0066ff; font-weight:bold;">@length</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
    <span style="color:#0066ff; font-weight:bold;">@length_sq</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> length
    <span style="color:#CC00FF; font-weight:bold;">Math</span>.<span style="color:#9900CC;">sqrt</span><span style="color:#006600; font-weight:bold;">&#40;</span>length_sq<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> sub_memoized_length
    <span style="color:#CC00FF; font-weight:bold;">Math</span>.<span style="color:#9900CC;">sqrt</span><span style="color:#006600; font-weight:bold;">&#40;</span>memoized_length_sq<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> memoized_length
    <span style="color:#0066ff; font-weight:bold;">@length</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#CC00FF; font-weight:bold;">Math</span>.<span style="color:#9900CC;">sqrt</span><span style="color:#006600; font-weight:bold;">&#40;</span>length_sq<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> length_sq
    <span style="color:#0066ff; font-weight:bold;">@x</span><span style="color:#006600; font-weight:bold;">*</span>@x <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#0066ff; font-weight:bold;">@y</span><span style="color:#006600; font-weight:bold;">*</span>@y
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> memoized_length_sq
    <span style="color:#0066ff; font-weight:bold;">@length_sq</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#0066ff; font-weight:bold;">@x</span><span style="color:#006600; font-weight:bold;">*</span>@x <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#0066ff; font-weight:bold;">@y</span><span style="color:#006600; font-weight:bold;">*</span>@y
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> normalize
    Vector2d.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@x<span style="color:#006600; font-weight:bold;">/</span>length, <span style="color:#0066ff; font-weight:bold;">@y</span><span style="color:#006600; font-weight:bold;">/</span>length<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> normalize!
    <span style="color:#0066ff; font-weight:bold;">@x</span> = <span style="color:#0066ff; font-weight:bold;">@x</span><span style="color:#006600; font-weight:bold;">/</span>length
    <span style="color:#0066ff; font-weight:bold;">@y</span> = <span style="color:#0066ff; font-weight:bold;">@y</span><span style="color:#006600; font-weight:bold;">/</span>length
    clear_length
    <span style="color:#0000FF; font-weight:bold;">self</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> x=<span style="color:#006600; font-weight:bold;">&#40;</span>x<span style="color:#006600; font-weight:bold;">&#41;</span>
    clear_length
    <span style="color:#0066ff; font-weight:bold;">@x</span> = x
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> y=<span style="color:#006600; font-weight:bold;">&#40;</span>y<span style="color:#006600; font-weight:bold;">&#41;</span>
    clear_length
    <span style="color:#0066ff; font-weight:bold;">@y</span> = y
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">bm</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span>
  a = Vector2d.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">23</span>,<span style="color:#006666;">45</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
  x.<span style="color:#9900CC;">report</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1000000</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      a.<span style="color:#9900CC;">length</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  x.<span style="color:#9900CC;">report</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1000000</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      a.<span style="color:#9900CC;">sub_memoized_length</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  x.<span style="color:#9900CC;">report</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1000000</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      a.<span style="color:#9900CC;">memoized_length</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Conforme la programaba se me ocurrió hacer unas optimizaciones, lo que dio como resultado los métodos que incluyen la palabra <em>memoized</em> en su nombre.</p>
<p>Hice unas <em>benchmarks</em> (pruebas de tiempo) &#8212;¡mi primer <em>benchmark</em> en <strong>Ruby</strong>! <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> &#8212; para medir que tanto afectaban mis supuestas optimizaciones, y esto fue lo que descubrí:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">-<span style="color: #000000; font-weight: bold;">*</span>- mode: compilation; default-directory: <span style="color: #ff0000;">&quot;~/development/gamedev/steering/&quot;</span> -<span style="color: #000000; font-weight: bold;">*</span>-
Compilation started at Wed Jul <span style="color: #000000;">29</span> <span style="color: #000000;">23</span>:<span style="color: #000000;">52</span>:<span style="color: #000000;">19</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ruby <span style="color: #660033;">-w</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>lobo<span style="color: #000000; font-weight: bold;">/</span>development<span style="color: #000000; font-weight: bold;">/</span>gamedev<span style="color: #000000; font-weight: bold;">/</span>steering<span style="color: #000000; font-weight: bold;">/</span>vehicle.rb 
      user     system      total        real
  <span style="color: #000000;">1.460000</span>   <span style="color: #000000;">0.000000</span>   <span style="color: #000000;">1.460000</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>  <span style="color: #000000;">1.480273</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
  <span style="color: #000000;">1.310000</span>   <span style="color: #000000;">0.000000</span>   <span style="color: #000000;">1.310000</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>  <span style="color: #000000;">1.352205</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
  <span style="color: #000000;">0.270000</span>   <span style="color: #000000;">0.000000</span>   <span style="color: #000000;">0.270000</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>  <span style="color: #000000;">0.276391</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
Compilation finished at Wed Jul <span style="color: #000000;">29</span> <span style="color: #000000;">23</span>:<span style="color: #000000;">52</span>:<span style="color: #000000;">22</span></pre></td></tr></table></div>

<h3>Una breve explicación</h3>
<p>La prueba consistió en calcular la longitud de un vector determinado, un millón de veces.</p>
<p>La técnica de optimización usada se llama: <em>Memoization</em>.</p>
<p>En computación, <em>memoization</em> es una técnica de optimización que se usa principalmente para incrementar la velocidad de los programas de computadora al evitar que las llamadas repetidas a una función recalculen los resultados de entradas previamente procesadas.</p>
<p>El primer método medido:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> length
    <span style="color:#CC00FF; font-weight:bold;">Math</span>.<span style="color:#9900CC;">sqrt</span><span style="color:#006600; font-weight:bold;">&#40;</span>length_sq<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Calcula calcula la raíz cuadrada cada vez que es llamado, además calcula la suma de los cuadrados de X y Y.<br />
Tarda: 1.480273 segundos</p>
<p>El segundo método:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> sub_memoized_length
    <span style="color:#CC00FF; font-weight:bold;">Math</span>.<span style="color:#9900CC;">sqrt</span><span style="color:#006600; font-weight:bold;">&#40;</span>memoized_length_sq<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Se ahorra el cálculo de los cuadrados de X y Y al guardar en una variable de instancia el cálculo realizado previamente.<br />
Tarda: 1.352205 segundos</p>
<p>El tercer método:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> memoized_length
    <span style="color:#0066ff; font-weight:bold;">@length</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#CC00FF; font-weight:bold;">Math</span>.<span style="color:#9900CC;">sqrt</span><span style="color:#006600; font-weight:bold;">&#40;</span>length_sq<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Se ahorra el cálculo de la raíz cuadrada mientras X y Y no cambien.<br />
Tarda: 0.276391 segundos</p>
<p>¿Qué tal? <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>En los juegos es necesario hacer todas las optimizaciones posibles, ya que las operaciones se están realizando una y otra vez en cada ciclo del <em>game loop</em>.</p>
<p>Creo que estás me vendrán muy bien. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>P.D. Estas pruebas fueron hechas con <strong>Ruby 1.9</strong>.
</p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2010/04/09/problemas-con-rake-con-ruby-1-8-y-ruby-1-9-instalados/' title='Problemas con rake con Ruby 1.8 y Ruby 1.9 instalados'>Problemas con rake con Ruby 1.8 y Ruby 1.9 instalados</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/11/17/como-mostrar-las-sentencias-sql-en-la-consola-de-rails/' title='Cómo mostrar las sentencias SQL en la consola de Rails'>Cómo mostrar las sentencias SQL en la consola de Rails</a></li>
<li><a href='http://lobotuerto.com/blog/2009/11/17/programando-un-pbbg-en-ruby-rails/' title='Programando un PBBG en Ruby &amp; Rails'>Programando un PBBG en Ruby &#038; Rails</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/10/ruby-steering-behaviors/' title='Ruby steering behaviors'>Ruby steering behaviors</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/07/29/optimizando-operaciones-sobre-vectores-en-ruby-con-memoization/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mi próximo videojuego</title>
		<link>http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/</link>
		<comments>http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 05:34:43 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[clón]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[missile]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=2719</guid>
		<description><![CDATA[Que bien se siente cuando ves de manera palpable la evolución de un proyecto. Cuando éste pasa de un estado burdo a refinado. Por ejemplo compara las siguientes imágenes: &#160; A mi me agrada, ¿y a tí? Ahora me encuentro haciendo el clón de otro de mis juegos favoritos de antaño: Missile Command. El código [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/avatares/lobo_tuerto.jpg" title="" class="thickbox" rel="singlepic610" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=610&amp;width=60&amp;height=&amp;mode=" alt="lobo_tuerto" title="lobo_tuerto" />
</a>

<p align="justify">Que bien se siente cuando ves de manera palpable la evolución de un proyecto. Cuando éste pasa de un estado burdo a refinado. Por ejemplo compara las siguientes imágenes:</p>
<div style="clear: both;"></div>
<p>&nbsp;<br />

<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/mio-tetris.png" title="" class="thickbox" rel="singlepic633" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=633&amp;width=&amp;height=150&amp;mode=" alt="mio-tetris" title="mio-tetris" />
</a>
 
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/metris-4.png" title="" class="thickbox" rel="singlepic645" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=645&amp;width=&amp;height=150&amp;mode=" alt="metris-4" title="metris-4" />
</a>
</p>
<div style="clear: both;"></div>
<p>A mi me agrada, ¿y a tí? <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Ahora me encuentro haciendo el clón de otro de mis juegos favoritos de antaño: <strong>Missile Command</strong>.</p>
<p>El código que estoy usando cómo base, también ha evolucionado mucho.</p>
<p>Ya no tengo un solo archivo con todo el código ahí. No tendría chiste repetir <a href="http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/">el modo de programar que utilicé en el Tetris</a>. Ahora cuento con un manejador de pantallas, un menú de inicio y música. Todas las clases separadas  en sus respectivos archivos.</p>
<p>He estado completamente metido en ello, esa es la razón por la que no he podido publicar tanto como quisiera en el blog.</p>
<p>Tengo dos buenas noticias: Una es que ya comencé a darle a la lógica del videojuego, la otra es que si hay gente interesada, puedo escribir un artículo detallando el diseño que empleé para el administrador de pantallas.</p>
<p>El administrador que hice es bastante versátil; te permite hacer <em>splash screens</em> &#8212;este proyecto incluye dos, una de <a href="http://amenoske.googlepages.com/"><strong>Amenoské</strong></a> (los que hicieron la rola) y una mía (debo hacerme propaganda ¿no? ¿si no quién?)&#8212; de una manera muy sencilla e hilarlas con las otras pantallas del juego (menús y <em>gameplay</em>).</p>
<p>A lo mejor te preguntarás ¿y para que tanto diseño y archivos para un simple <strong>Missile Command</strong>?<br />
La respuesta es sencilla: no sólo voy a hacer un <strong>Missile Command</strong>. Me estoy preparando para lo que viene. Aún estoy ante la disyuntiva de hacer un <strong>Pac-Man</strong> (jejeje) o un <strong>Gauntlet</strong>. ¿Qué opinas?</p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/' title='Metris &#8212; Mi clón de Tetris en Ruby y Gosu'>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/' title='Rubytris en GitHub'>Rubytris en GitHub</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/' title='Programación de videojuegos con Gosu en Ruby'>Programación de videojuegos con Gosu en Ruby</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</title>
		<link>http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/</link>
		<comments>http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 16:33:54 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[gosu]]></category>
		<category><![CDATA[jaunty jackalope]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=2642</guid>
		<description><![CDATA[Gosu es un framework escrito en C++ para desarrollar juegos 2D. Cuenta con bindings para Ruby, y eso, es lo que nos interesa &#8212; tee-hee! Además lo necesitas, si quieres probar el clón de Tetris que escribí. Instalación de dependencias para Ruby 1.8 Para instalar la gema Gosu, necesitarás los siguientes paquetes: g++ libgl1-mesa-dev libpango1.0-dev [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/ruby/ruby.jpg" title="" class="thickbox" rel="singlepic484" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=484&amp;width=60&amp;height=&amp;mode=" alt="ruby.jpg" title="ruby.jpg" />
</a>

<p align="justify"><strong>Gosu</strong> es un framework escrito en C++ para desarrollar juegos 2D. Cuenta con <em>bindings</em> para <a href="http://www.ruby-lang.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby Programming Language"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Ruby</a>, y eso, es lo que nos interesa &#8212; tee-hee!<br />
Además lo necesitas, si quieres probar <a href="http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/">el clón de Tetris</a> que escribí. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div style="clear: both;"></div>
<h3>Instalación de dependencias para Ruby 1.8</h3>
<p>Para instalar la gema <strong>Gosu</strong>, necesitarás los siguientes paquetes:</p>
<ul>
<li>g++</li>
<li>libgl1-mesa-dev</li>
<li>libpango1.0-dev</li>
<li>libboost-dev</li>
<li>libsdl-mixer1.2-dev</li>
<li>ruby</li>
<li>ruby1.8</li>
<li>ruby1.8-dev</li>
</ul>
<p>Copia y pega el siguiente comando en tu terminal:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">g++</span> libgl1-mesa-dev libpango1.0-dev libboost-dev ruby ruby1.8 ruby1.8-dev libsdl-mixer1.2-dev</pre></td></tr></table></div>

<h3>Instalación de la gema</h3>
<p>Ahora instala <strong>Gosu</strong> como gema con el comando:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> gosu</pre></td></tr></table></div>

<p>Con los paquetes mencionados arriba ya instalados, la gema se compilará sin problemas.</p>
<h4>Instalación de dependencias adicionales para el soporte de OpenGL en algunos ejemplos</h4>
<p>En algunos ejemplos del framework <a href="http://github.com/ippa/chingu">Chingu</a> requieren que la gema <strong>ruby-opengl</strong> esté disponible. Instálala tecleando esto en tu terminal:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libgl1-mesa-dri libglu1-mesa freeglut3 libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev
<span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> ruby-opengl</pre></td></tr></table></div>

<h3>Soporte para Ruby 1.9</h3>
<p>Para usar <strong>Gosu</strong> con <strong>Ruby 1.9</strong>, sólo reemplaza todas las ocurrencias de <strong>1.8</strong> por <strong>1.9</strong>. El comando para instalar las dependencias, queda entonces como:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">g++</span> libgl1-mesa-dev libpango1.0-dev libboost-dev ruby1.9 ruby1.9-dev libsdl-mixer1.2-dev</pre></td></tr></table></div>

<p>Después de eso, <strong>sudo gem install gosu</strong> debería funcionar sin problemas.</p>
<h3>Recursos</h3>
<p>Para usar la versión C++ de <strong>Gosu</strong> y/o instalarlo en otras plataformas, checa:<br />
<a href="http://code.google.com/p/gosu/wiki/GettingStartedOnLinux">GettingStartedOnLinux</a><br />
<a href="http://code.google.com/p/gosu/wiki/GettingStartedOnOsx">GettingStartedOnOsx</a><br />
<a href="http://code.google.com/p/gosu/wiki/GettingStartedOnWindows">GettingStartedOnWindows</a>
</p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/' title='Metris &#8212; Mi clón de Tetris en Ruby y Gosu'>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/' title='Programación de videojuegos con Gosu en Ruby'>Programación de videojuegos con Gosu en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/20/como-instalar-postgresql-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar PostgreSQL en Ubuntu 9.04 y 9.10'>Cómo instalar PostgreSQL en Ubuntu 9.04 y 9.10</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</title>
		<link>http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/</link>
		<comments>http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 15:08:34 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[clone]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[gosu]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tetris]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=2499</guid>
		<description><![CDATA[El proyecto ahora se llama rubytris y lo puedes encontrar en github: http://github.com/lobo-tuerto/rubytris ¡Por fin terminé una versión presentable de mi clón de Tetris desarrollado en Ruby con ayuda del framework Gosu! Le puse Me-tris, nombrado así, para no tener problemas con la ley (sí, se que el nombre apesta&#8230; jeje). Es altamente configurable, puedes [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/metris-1.png" title="" class="thickbox" rel="singlepic642" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=642&amp;width=200&amp;height=&amp;mode=" alt="metris-1" title="metris-1" />
</a>

<div class="lobo-nota">El proyecto ahora se llama <strong>rubytris</strong> y lo puedes encontrar en <strong>github</strong>:<br />
<a href="http://github.com/lobo-tuerto/rubytris">http://github.com/lobo-tuerto/rubytris</a></div>
<p align="justify">¡Por fin terminé una versión presentable de mi clón de <strong>Tetris</strong> desarrollado en <strong><a href="http://www.ruby-lang.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby Programming Language"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Ruby</a></strong> con ayuda del <em>framework</em> <a href="http://code.google.com/p/gosu/">Gosu</a>!</p>
<p>Le puse <strong>Me-tris</strong>, nombrado así, para no tener problemas con la ley (sí, se que el nombre apesta&#8230; jeje). <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Es altamente configurable, puedes modificar cosas como el ancho y alto del tablero (en bloques), el tamaño de los bloques (en pixeles), el espaciado entre ellos, la velocidad de caída de las piezas (en milisegundos), la velocidad de repetición cuando un jugador deja presionada una tecla (para moverse a los lados, rotar, caer).</p>
<p>También puedes definir nuevas figuras fácilmente e indicar si tienen un pivote (un punto alrededor del cual giran las piezas). Ya no tienes que definir las piezas y cada una de sus rotaciones por separado, las figuras pueden tener un tamaño arbitrario.</p>
<p>El juego está (muy) básicamente completo. Lleva la puntuación del jugador y termina (tee-hee!).<br />
Fue escrito en 3 días, <a href="http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/">2 de ellos seguidos</a> y uno más un par de días después.</p>
<p>El código está muy comentado, pero si te surge alguna duda, puedes preguntar con confianza. Tiene también, mucho campo para mejorarse (por ejemplo una pantalla de entrada).</p>
<p>Aquí les dejo unos screenshots que muestran como luce el juego al modificar los parámetros de configuración:<br />

<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/metris-2.png" title="" class="thickbox" rel="singlepic643" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=643&amp;width=100&amp;height=&amp;mode=" alt="metris-2" title="metris-2" />
</a>
 
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/metris-3.png" title="" class="thickbox" rel="singlepic644" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=644&amp;width=100&amp;height=&amp;mode=" alt="metris-3" title="metris-3" />
</a>
 
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/metris-4.png" title="" class="thickbox" rel="singlepic645" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=645&amp;width=100&amp;height=&amp;mode=" alt="metris-4" title="metris-4" />
</a>
 
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/metris-5.png" title="" class="thickbox" rel="singlepic646" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=646&amp;width=100&amp;height=&amp;mode=" alt="metris-5" title="metris-5" />
</a>
</p>
<div style="clear: both;"></div>
<h3>Descargar</h3>
<p>Aquí tienen la descarga, es un archivo <strong>.rb</strong> y varios <strong>.ogg</strong> y <strong>.png</strong>.<br />
<a href='http://lobotuerto.com/blog/wp-content/uploads/2009/07/metris.zip'>Metris &#8211; Mi clon de tetris escrito en Ruby con Gosu <em>(68.7KiB)</em></a></p>
<p>A continuación pongo el código en su totalidad.</p>
<div class="lobo-nota">
Les recomiendo primero checar el <a href="http://code.google.com/p/gosu/wiki/RubyTutorial">RubyTutorial</a>, ahí explican las cuestiones básicas de Gosu.
</div>
<p><span id="more-2499"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># -*- coding: utf-8 -*-</span>
<span style="color:#9966CC; font-weight:bold;">begin</span>
  <span style="color:#008000; font-style:italic;"># En caso de que usemos Gosu via rubygems</span>
  <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">LoadError</span>
  <span style="color:#008000; font-style:italic;"># En caso de que no...</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'gosu'</span>
&nbsp;
&nbsp;
<span style="color:#008000; font-style:italic;"># Esto lo utilizamos para darle un orden a los elementos gráficos del</span>
<span style="color:#008000; font-style:italic;"># juego durante el dibujado en pantalla</span>
<span style="color:#9966CC; font-weight:bold;">module</span> ZOrder
  <span style="color:#008000; font-style:italic;"># El tablero se dibuja primero, después las piezas, y por último la</span>
  <span style="color:#008000; font-style:italic;"># interfaz de usuario (el texto, por ejemplo)</span>
  Board, Pieces, UI = <span style="color:#006600; font-weight:bold;">*</span>0..2
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
<span style="color:#008000; font-style:italic;"># Constantes para configurar nuestro juego</span>
<span style="color:#9966CC; font-weight:bold;">module</span> GameConstants
  <span style="color:#008000; font-style:italic;"># Textos</span>
  <span style="color:#9966CC; font-weight:bold;">module</span> Text
    Caption = <span style="color:#996600;">&quot;Me-tris&quot;</span>
    Score = <span style="color:#996600;">&quot;Puntos&quot;</span>
    GameOver = <span style="color:#996600;">&quot;Juego finalizado&quot;</span>
    NextPiece = <span style="color:#996600;">&quot;Pieza siguiente&quot;</span>
    Info = <span style="color:#996600;">&quot;Presiona &lt;Enter&gt; para reiniciar o &lt;Esc&gt; para terminar&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
  <span style="color:#008000; font-style:italic;"># Gráficos</span>
  <span style="color:#9966CC; font-weight:bold;">module</span> Graphics
    <span style="color:#008000; font-style:italic;"># Para los bloques</span>
    Tile = <span style="color:#996600;">&quot;media/square.png&quot;</span>
    <span style="color:#008000; font-style:italic;"># Para el pivote</span>
    Pivot = <span style="color:#996600;">&quot;media/circle.png&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;">#Sonidos</span>
  <span style="color:#9966CC; font-weight:bold;">module</span> Sounds
    <span style="color:#008000; font-style:italic;"># Para desaparecer un renglón</span>
    CompletedRow = <span style="color:#996600;">&quot;media/dialog-information.ogg&quot;</span>
    <span style="color:#008000; font-style:italic;"># Para cuando se deja caer una pieza</span>
    StorePiece = <span style="color:#996600;">&quot;media/dialog-warning.ogg&quot;</span>
    <span style="color:#008000; font-style:italic;"># Para cuando termina el juego</span>
    GameOver = <span style="color:#996600;">&quot;media/dialog-error.ogg&quot;</span>
    <span style="color:#008000; font-style:italic;"># Para cuando inicia el juego</span>
    GameStart = <span style="color:#996600;">&quot;media/desktop-logout.ogg&quot;</span>
    <span style="color:#008000; font-style:italic;"># Para cuando no se pueda rotar o mover la pieza</span>
    InvalidMove = <span style="color:#996600;">&quot;media/button-pressed.ogg&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
  <span style="color:#008000; font-style:italic;"># Configuración del juego</span>
  <span style="color:#008000; font-style:italic;"># Jugar en pantalla completa?</span>
  FullScreen = <span style="color:#0000FF; font-weight:bold;">false</span>
  <span style="color:#008000; font-style:italic;"># Ancho de la pantalla en pixeles</span>
  ScreenWidth = <span style="color:#006666;">800</span>
  <span style="color:#008000; font-style:italic;"># Alto de la pantalla en pixeles</span>
  ScreenHeight = <span style="color:#006666;">600</span>
  <span style="color:#008000; font-style:italic;"># Ancho del tablero (en bloques)</span>
  BoardWidth = <span style="color:#006666;">12</span>
  <span style="color:#008000; font-style:italic;"># Alto del tablero (en bloques)</span>
  BoardHeight = <span style="color:#006666;">17</span>
  <span style="color:#008000; font-style:italic;"># Longitud de los lados de un bloque (en pixeles)</span>
  BlockSize = <span style="color:#006666;">25.0</span>
  <span style="color:#008000; font-style:italic;"># Separación entre bloques (en pixeles)</span>
  BlockSeparation = <span style="color:#006666;">5.0</span>
  <span style="color:#008000; font-style:italic;"># Longitud de los lados de la imagen (en pixeles)</span>
  ImageSize = <span style="color:#006666;">30</span> <span style="color:#006600; font-weight:bold;">+</span> BlockSeparation
  <span style="color:#008000; font-style:italic;"># Factor para ajustar tamaño del texto y la imagen de los bloques en</span>
  <span style="color:#008000; font-style:italic;"># caso de que el tamaño de GameConstants::BlockSize no corresponda</span>
  <span style="color:#008000; font-style:italic;"># con el de GameConstants::ImageSize</span>
  Factor = BlockSize<span style="color:#006600; font-weight:bold;">/</span>ImageSize
&nbsp;
  <span style="color:#008000; font-style:italic;"># Jugabilidad</span>
  <span style="color:#008000; font-style:italic;"># Bajar la pieza cada X número de milisegundos</span>
  DescendTime = <span style="color:#006666;">1000</span>
  <span style="color:#008000; font-style:italic;"># Bajar la pieza rápido cada X número de milisegundos</span>
  BoostedDescendTime = <span style="color:#006666;">25</span>
  <span style="color:#008000; font-style:italic;"># Repetir el movimiento con la tecla presionada cada X número de</span>
  <span style="color:#008000; font-style:italic;"># milisegundos</span>
  RepeatTime = <span style="color:#006666;">200</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
<span style="color:#008000; font-style:italic;"># Clase para crear las diferentes figuras que puede tener una pieza en</span>
<span style="color:#008000; font-style:italic;"># el juego</span>
<span style="color:#9966CC; font-weight:bold;">class</span> ShapeFactory
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">shapes</span>
    <span style="color:#008000; font-style:italic;"># Aquí definimos las figuras que queremos que aparezcan en el</span>
    <span style="color:#008000; font-style:italic;"># juego, los 0s representan espacios en blanco, los 1s representan</span>
    <span style="color:#008000; font-style:italic;"># bloques sólidos y el 2 es para indicar el pivote (opcional)</span>
    <span style="color:#006600; font-weight:bold;">&#91;</span>
     <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
     <span style="color:#006600; font-weight:bold;">&#93;</span>,
     <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
     <span style="color:#006600; font-weight:bold;">&#93;</span>,
     <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">0</span>,<span style="color:#006666;">0</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
     <span style="color:#006600; font-weight:bold;">&#93;</span>,
     <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
     <span style="color:#006600; font-weight:bold;">&#93;</span>,
     <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
     <span style="color:#006600; font-weight:bold;">&#93;</span>,
     <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
     <span style="color:#006600; font-weight:bold;">&#93;</span>,
     <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">2</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">0</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
     <span style="color:#006600; font-weight:bold;">&#93;</span>,
     <span style="color:#006600; font-weight:bold;">&#91;</span>
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
     <span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método para obtener una figura al azar</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">shape</span>
    shapes<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span>shapes.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
<span style="color:#008000; font-style:italic;"># Esta clase nos servirá para dar seguimiento al estado de una pieza</span>
<span style="color:#008000; font-style:italic;"># (figura y posición)</span>
<span style="color:#9966CC; font-weight:bold;">class</span> PieceState
  <span style="color:#008000; font-style:italic;"># Deseamos tener acceso a la posición (x,y) y figura (shape)</span>
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:x</span>, <span style="color:#ff3333; font-weight:bold;">:y</span>, <span style="color:#ff3333; font-weight:bold;">:shape</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize
    <span style="color:#008000; font-style:italic;"># Seleccionamos una pieza al azar de nuestro repertorio</span>
    <span style="color:#0066ff; font-weight:bold;">@shape</span> = ShapeFactory.<span style="color:#9900CC;">shape</span>
    <span style="color:#008000; font-style:italic;"># Le metemos variedad a las piezas obteniendo la matriz</span>
    <span style="color:#008000; font-style:italic;"># transpuesta con 50% de probabilidad de que quede como estaba</span>
    <span style="color:#008000; font-style:italic;"># originalmente y 50% de que quede en espejo</span>
    <span style="color:#0066ff; font-weight:bold;">@shape</span> = <span style="color:#0066ff; font-weight:bold;">@shape</span>.<span style="color:#9900CC;">transpose</span> <span style="color:#9966CC; font-weight:bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método para obtener la anchura</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> w
    <span style="color:#0066ff; font-weight:bold;">@shape</span>.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">size</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método para obtener la altura</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> h
    <span style="color:#0066ff; font-weight:bold;">@shape</span>.<span style="color:#9900CC;">size</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
<span style="color:#008000; font-style:italic;"># Esta clase representa una pieza en el tablero</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Piece
  <span style="color:#008000; font-style:italic;"># Necesitamos tener acceso al color de la pieza para que el tablero</span>
  <span style="color:#008000; font-style:italic;"># pueda almacenar los bloques con el color correspondiente</span>
  attr_reader <span style="color:#ff3333; font-weight:bold;">:color</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>window, board<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Obtenemos una referencia a la ventana del juego uso interno</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span> = window
    <span style="color:#008000; font-style:italic;"># Obtenemos una referencia al tablero para uso interno</span>
    <span style="color:#0066ff; font-weight:bold;">@board</span> = board
&nbsp;
    <span style="color:#008000; font-style:italic;"># Creamos un color para los bloques sólidos de las piezas</span>
    <span style="color:#0066ff; font-weight:bold;">@color</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Color</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>0xff000000<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@color</span>.<span style="color:#9900CC;">red</span> = <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">255</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">20</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">20</span>
    <span style="color:#0066ff; font-weight:bold;">@color</span>.<span style="color:#9900CC;">green</span> = <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">255</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">20</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">20</span>
    <span style="color:#0066ff; font-weight:bold;">@color</span>.<span style="color:#9900CC;">blue</span> = <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">255</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">20</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">20</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Tomamos el color anterior y creamos un uno semitransparente para</span>
    <span style="color:#008000; font-style:italic;"># los representar los bloques vacíos de las piezas</span>
    <span style="color:#0066ff; font-weight:bold;">@colorb</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Color</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@color.<span style="color:#9900CC;">argb</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@colorb</span>.<span style="color:#9900CC;">alpha</span> = 0x66
&nbsp;
    <span style="color:#008000; font-style:italic;"># Tendremos dos estados, el actual (válido) y uno tentativo (puede</span>
    <span style="color:#008000; font-style:italic;"># quedar en estado inválido) que nos servirá para identificar si</span>
    <span style="color:#008000; font-style:italic;"># un movimiento es válido, por ejemplo:</span>
    <span style="color:#008000; font-style:italic;"># ¿Después de rotar tenemos una figura válida? ¿no colisiona con</span>
    <span style="color:#008000; font-style:italic;"># nada? ¿no se sale de la pantalla?</span>
    <span style="color:#0066ff; font-weight:bold;">@current_state</span> = PieceState.<span style="color:#9900CC;">new</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Al tener una pieza nueva, la centramos en el tablero y la</span>
    <span style="color:#008000; font-style:italic;"># ponemos por encima de él (además de crear el estado tentativo)</span>
    move_to_center
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Coloca la pieza al lado del tablero</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> move_to_side
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">x</span> = <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">w</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">2</span>
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">y</span> = <span style="color:#006666;">2</span>
    <span style="color:#0066ff; font-weight:bold;">@next_state</span> = <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">dup</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Poner la pieza lista para comenzar a descender</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> move_to_center
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">x</span> = <span style="color:#006600; font-weight:bold;">&#40;</span>@board.<span style="color:#9900CC;">w</span> <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">w</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">/</span><span style="color:#006666;">2</span>
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">y</span> = <span style="color:#006600; font-weight:bold;">-</span>@current_state.<span style="color:#9900CC;">h</span>
    <span style="color:#0066ff; font-weight:bold;">@next_state</span> = <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">dup</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método que nos genera un arreglo vacío con las dimensiones</span>
  <span style="color:#008000; font-style:italic;"># del estado actual transpuestas, nos sirve a la hora de tratar de</span>
  <span style="color:#008000; font-style:italic;"># hacer la rotación de una pieza</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> empty_rotated_shape
    <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@current_state.<span style="color:#9900CC;">w</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">map</span>!<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@current_state.<span style="color:#9900CC;">h</span>, <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Posición en x (en bloques)</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> x
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">x</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Posición en y (en bloques)</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> y
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">y</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Altura (en bloques)</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> h
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">h</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Anchura (en bloques)</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> w
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">w</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Figura de la pieza</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> shape
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">shape</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Si al hacer una rotación o mover la pieza, queda en una posición</span>
  <span style="color:#008000; font-style:italic;"># válida dentro del tablero, entonces llamamos a este método para</span>
  <span style="color:#008000; font-style:italic;"># que la pieza realmente tome esa posición</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> to_next_state
    <span style="color:#0066ff; font-weight:bold;">@current_state</span> = <span style="color:#0066ff; font-weight:bold;">@next_state</span>.<span style="color:#9900CC;">clone</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Si la pieza quedá en una posición no válida dentro del tablero,</span>
  <span style="color:#008000; font-style:italic;"># entonces restauramos su estado</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> restore_state
    <span style="color:#0066ff; font-weight:bold;">@next_state</span> = <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">clone</span>
    <span style="color:#008000; font-style:italic;"># Si este método es llamado es porque se trató de hacer algún</span>
    <span style="color:#008000; font-style:italic;"># movimiento no válido, tocamos ese sonido</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:invalid_move</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">play</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método para operar con el estado siguiente</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> with_next_state
    <span style="color:#9966CC; font-weight:bold;">yield</span> <span style="color:#0066ff; font-weight:bold;">@next_state</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método para operar con ambos estados</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> with_states
    <span style="color:#9966CC; font-weight:bold;">yield</span> <span style="color:#0066ff; font-weight:bold;">@current_state</span>, <span style="color:#0066ff; font-weight:bold;">@next_state</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método para operar con cada una de las celdas de nuestra pieza</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> for_every_cell
    <span style="color:#0066ff; font-weight:bold;">@current_state</span>.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row, i<span style="color:#006600; font-weight:bold;">|</span>
      row.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>cell, j<span style="color:#006600; font-weight:bold;">|</span>
        <span style="color:#9966CC; font-weight:bold;">yield</span><span style="color:#006600; font-weight:bold;">&#40;</span>cell, i, j<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método que dibuja nuestra pieza en pantalla</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> draw
    <span style="color:#008000; font-style:italic;"># Recorremos cada celda de nuestra pieza y la ponemos en pantalla</span>
    for_every_cell <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>c,i,j<span style="color:#006600; font-weight:bold;">|</span>
&nbsp;
      <span style="color:#008000; font-style:italic;"># Calculamos la posición de la pieza en la pantalla</span>
      pos_x = <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">offset_x</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006600; font-weight:bold;">&#40;</span>j<span style="color:#006600; font-weight:bold;">+</span>@current_state.<span style="color:#9900CC;">x</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">b_size</span>
      pos_y = <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">offset_y</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">+</span>@current_state.<span style="color:#9900CC;">y</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">b_size</span>
&nbsp;
      <span style="color:#008000; font-style:italic;"># El color depende de si es sólido o vacío</span>
      <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">graphics</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:square</span><span style="color:#006600; font-weight:bold;">&#93;</span>.
        <span style="color:#9900CC;">draw</span><span style="color:#006600; font-weight:bold;">&#40;</span>pos_x,
             pos_y,
             <span style="color:#6666ff; font-weight:bold;">ZOrder::Pieces</span>,
             <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span>,
             <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span>,
             c==<span style="color:#006666;">0</span> ? <span style="color:#0066ff; font-weight:bold;">@colorb</span> : <span style="color:#0066ff; font-weight:bold;">@color</span>,
             <span style="color:#ff3333; font-weight:bold;">:default</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
      <span style="color:#008000; font-style:italic;"># Remarcamos el pivote (si existe)</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> c==<span style="color:#006666;">2</span>
        <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">graphics</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:circle</span><span style="color:#006600; font-weight:bold;">&#93;</span>.
          <span style="color:#9900CC;">draw</span><span style="color:#006600; font-weight:bold;">&#40;</span>pos_x,
               pos_y,
               <span style="color:#6666ff; font-weight:bold;">ZOrder::Pieces</span>,
               <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span>,
               <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span>,
               <span style="color:#0066ff; font-weight:bold;">@colorb</span>,
               <span style="color:#ff3333; font-weight:bold;">:additive</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Esta clase representa el tablero de juego</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Board
  <span style="color:#008000; font-style:italic;"># Necesitamos acceso a los atributos: altura, anchura, tamaño del</span>
  <span style="color:#008000; font-style:italic;"># bloque, desplazamiento en x, desplazamiento en y, gráficas, si</span>
  <span style="color:#008000; font-style:italic;"># está lleno el tablero</span>
  attr_reader <span style="color:#ff3333; font-weight:bold;">:h</span>, <span style="color:#ff3333; font-weight:bold;">:w</span>, <span style="color:#ff3333; font-weight:bold;">:b_size</span>, <span style="color:#ff3333; font-weight:bold;">:offset_x</span>, <span style="color:#ff3333; font-weight:bold;">:offset_y</span>, <span style="color:#ff3333; font-weight:bold;">:graphics</span>, <span style="color:#ff3333; font-weight:bold;">:full</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>window<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Obtenemos una referencia a ventana para uso interno</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span> = window
&nbsp;
    <span style="color:#008000; font-style:italic;"># La altura del tablero (en bloques)</span>
    <span style="color:#0066ff; font-weight:bold;">@h</span> = <span style="color:#6666ff; font-weight:bold;">GameConstants::BoardHeight</span>
    <span style="color:#008000; font-style:italic;"># La anchura del tablero (en bloques)</span>
    <span style="color:#0066ff; font-weight:bold;">@w</span> = <span style="color:#6666ff; font-weight:bold;">GameConstants::BoardWidth</span>
    <span style="color:#008000; font-style:italic;"># El ancho/alto de los bloques (en pixeles)</span>
    <span style="color:#0066ff; font-weight:bold;">@b_size</span> = <span style="color:#6666ff; font-weight:bold;">GameConstants::BlockSize</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Centramos el tablero en la ventana</span>
    <span style="color:#0066ff; font-weight:bold;">@offset_x</span> = <span style="color:#006600; font-weight:bold;">&#40;</span>window.<span style="color:#9900CC;">w</span> <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">pixel_w</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">/</span><span style="color:#006666;">2</span>
    <span style="color:#0066ff; font-weight:bold;">@offset_y</span> = <span style="color:#006600; font-weight:bold;">&#40;</span>window.<span style="color:#9900CC;">h</span> <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">pixel_h</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">/</span><span style="color:#006666;">2</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Color para los espacios vacíos en el tablero</span>
    <span style="color:#0066ff; font-weight:bold;">@color</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Color</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>0xff222222<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Ponemos el tablero en su estado inicial</span>
    reset
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Para inicializar el tablero</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> reset
    <span style="color:#008000; font-style:italic;"># La pieza que actualmente está descendiendo</span>
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span> = Piece.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@window, <span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># La pieza que sigue</span>
    <span style="color:#0066ff; font-weight:bold;">@next_piece</span> = Piece.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@window, <span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Movemos la pieza siguiente al lado del tablero para que la pueda</span>
    <span style="color:#008000; font-style:italic;"># ver el jugador</span>
    <span style="color:#0066ff; font-weight:bold;">@next_piece</span>.<span style="color:#9900CC;">move_to_side</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Generamos un arreglo de arreglos para representar nuestro</span>
    <span style="color:#008000; font-style:italic;"># tablero</span>
    <span style="color:#0066ff; font-weight:bold;">@board</span> = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@h<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">map</span>!<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@w, <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#008000; font-style:italic;"># Lo mismo para representar el color de los bloques en el tablero</span>
    <span style="color:#0066ff; font-weight:bold;">@board_colors</span> = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@h<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">map</span>!<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@w,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Nos servirá para saber si el juego ha terminado</span>
    <span style="color:#0066ff; font-weight:bold;">@full</span> = <span style="color:#0000FF; font-weight:bold;">false</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Ponemos la puntuación del jugador en cero</span>
    <span style="color:#0066ff; font-weight:bold;">@score</span> = <span style="color:#006666;">0</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Tocamos un sonido al iniciar el juego</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:game_start</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">play</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
  <span style="color:#008000; font-style:italic;"># Sirve para revisar si el estado tentativo es válido y si el</span>
  <span style="color:#008000; font-style:italic;"># tablero lo puede &quot;tomar&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> can_take_it?
    <span style="color:#008000; font-style:italic;"># Vamos a trabajar con el estado siguiente para validarlo</span>
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">with_next_state</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span>
      n.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row, i<span style="color:#006600; font-weight:bold;">|</span>
        row.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>cell, j<span style="color:#006600; font-weight:bold;">|</span>
          <span style="color:#008000; font-style:italic;"># Nos aseguramos de trabajar con los renglones de la pieza</span>
          <span style="color:#008000; font-style:italic;"># que están dentro del tablero</span>
          <span style="color:#9966CC; font-weight:bold;">if</span> n.<span style="color:#9900CC;">y</span> <span style="color:#006600; font-weight:bold;">+</span> i <span style="color:#006600; font-weight:bold;">&gt;</span>= <span style="color:#006666;">0</span>
            <span style="color:#008000; font-style:italic;"># Checamos si hay colisión</span>
            <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@board</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">+</span>n.<span style="color:#9900CC;">y</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">+</span>n.<span style="color:#9900CC;">x</span><span style="color:#006600; font-weight:bold;">&#93;</span> != <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> n.<span style="color:#9900CC;">shape</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span> != <span style="color:#006666;">0</span>
              <span style="color:#008000; font-style:italic;"># Si hayamos una colisión regresamos falso para avisar</span>
              <span style="color:#008000; font-style:italic;"># que el tablero no puede &quot;tomar&quot; la piezao</span>
              <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">false</span>
            <span style="color:#9966CC; font-weight:bold;">end</span>
          <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Si no hay colisión entonces devolvemos verdadero, con esto</span>
    <span style="color:#008000; font-style:italic;"># informamos que el tablero si puede &quot;tomar&quot; la pieza</span>
    <span style="color:#0000FF; font-weight:bold;">true</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Almacena los bloques de la pieza que ha llegado al fondo del</span>
  <span style="color:#008000; font-style:italic;"># tablero</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> store_piece
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row, i<span style="color:#006600; font-weight:bold;">|</span>
      row.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>cell, j<span style="color:#006600; font-weight:bold;">|</span>
        <span style="color:#008000; font-style:italic;"># Solo copia los bloques llenos (diferentes a cero)</span>
        <span style="color:#0066ff; font-weight:bold;">@board</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">+</span>@current_piece.<span style="color:#9900CC;">y</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">+</span>@current_piece.<span style="color:#9900CC;">x</span><span style="color:#006600; font-weight:bold;">&#93;</span> = cell <span style="color:#9966CC; font-weight:bold;">if</span> cell != <span style="color:#006666;">0</span>
        <span style="color:#008000; font-style:italic;"># Copiamos los colores de la pieza al tablero de colores</span>
        <span style="color:#0066ff; font-weight:bold;">@board_colors</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">+</span>@current_piece.<span style="color:#9900CC;">y</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">+</span>@current_piece.<span style="color:#9900CC;">x</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">color</span> <span style="color:#9966CC; font-weight:bold;">if</span> cell != <span style="color:#006666;">0</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#008000; font-style:italic;"># Tocamos un sonido cuando una pieza baja</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:store_piece</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">play</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método que elimina los renglones llenos</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> compact_board
    <span style="color:#008000; font-style:italic;"># Necesitamos saber que renglones vamos a eliminar</span>
    to_delete = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Vamos a revisar renglón por renglón</span>
    <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row,i<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#008000; font-style:italic;"># Sólo si el renglón NO incluye algún cero...</span>
      <span style="color:#9966CC; font-weight:bold;">unless</span> row.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#008000; font-style:italic;"># Registramos si este renglón necesita ser eliminado</span>
        to_delete <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>:row <span style="color:#006600; font-weight:bold;">=&gt;</span> row, <span style="color:#ff3333; font-weight:bold;">:index</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> i<span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    to_delete.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>r<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#008000; font-style:italic;"># Eliminamos el renglón del tablero</span>
      <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">delete</span><span style="color:#006600; font-weight:bold;">&#40;</span>r<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:row</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#008000; font-style:italic;"># Y eliminamos el renglón en el tablero de colores (para que</span>
      <span style="color:#008000; font-style:italic;"># esté sincronizado con nuestro tablero de bloques)</span>
      <span style="color:#0066ff; font-weight:bold;">@board_colors</span>.<span style="color:#9900CC;">delete_at</span><span style="color:#006600; font-weight:bold;">&#40;</span>r<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:index</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#008000; font-style:italic;"># Insertamos un nuevo renglón lleno de ceros (vacío) al inicio</span>
      <span style="color:#008000; font-style:italic;"># de cada tablero (el de bloques y el de colores)</span>
      <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">unshift</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@w,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#0066ff; font-weight:bold;">@board_colors</span>.<span style="color:#9900CC;">unshift</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@w,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Aumentamos la puntuación del jugador</span>
    <span style="color:#0066ff; font-weight:bold;">@score</span> <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span> <span style="color:#006600; font-weight:bold;">*</span> to_delete.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Y tocamos un sonido si se eliminaron algunos renglones</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:completed_row</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">play</span> <span style="color:#9966CC; font-weight:bold;">if</span> to_delete.<span style="color:#9900CC;">size</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">0</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Anchura del tablero en pixeles</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> pixel_w
    <span style="color:#0066ff; font-weight:bold;">@w</span> <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#0066ff; font-weight:bold;">@b_size</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Altura del tablero en pixeles</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> pixel_h
    <span style="color:#0066ff; font-weight:bold;">@h</span> <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#0066ff; font-weight:bold;">@b_size</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Intenta de mover la pieza actual a la izquierda</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> move_piece_left
    <span style="color:#008000; font-style:italic;"># Con el estado tentativo</span>
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">with_next_state</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>s<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#008000; font-style:italic;"># Lo movemos a la izquierda</span>
      s.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">-</span>= <span style="color:#006666;">1</span>
      <span style="color:#008000; font-style:italic;"># Checamos si es válida su posición y si no colisiona con nada</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> s.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">&gt;</span>= <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> can_take_it?
        <span style="color:#008000; font-style:italic;"># Si es así, actualizamos el estado</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">to_next_state</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#008000; font-style:italic;"># Si no, restauramos el estado</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">restore_state</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Trata de mover la pieza actual a la derecha</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> move_piece_right
    <span style="color:#008000; font-style:italic;"># Con el estado tentativo</span>
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">with_next_state</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>s<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#008000; font-style:italic;"># Lo movemos a la derecha</span>
      s.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#006666;">1</span>
      <span style="color:#008000; font-style:italic;"># Checamos si es válida su posición y si no colisiona con nada</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> s.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">+</span> s.<span style="color:#9900CC;">w</span> <span style="color:#006600; font-weight:bold;">&lt;</span>= <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">w</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> can_take_it?
        <span style="color:#008000; font-style:italic;"># Si es así, actualizamos el estado</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">to_next_state</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#008000; font-style:italic;"># Si no, restauramos el estado</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">restore_state</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Trata de mover la pieza actual hacia abajo</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> move_piece_down
    <span style="color:#008000; font-style:italic;"># Con el estado tentativo</span>
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">with_next_state</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>s<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#008000; font-style:italic;"># Lo movemos hacia abajo</span>
      s.<span style="color:#9900CC;">y</span> <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#006666;">1</span>
      <span style="color:#008000; font-style:italic;"># Checamos si es válida su posición y si no colisiona con nada</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> s.<span style="color:#9900CC;">y</span> <span style="color:#006600; font-weight:bold;">+</span> s.<span style="color:#9900CC;">h</span> <span style="color:#006600; font-weight:bold;">&lt;</span>= <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">h</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> can_take_it?
        <span style="color:#008000; font-style:italic;"># Si es así, actualizamos el estado</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">to_next_state</span>
      <span style="color:#008000; font-style:italic;"># Si la pieza está completamente dentro del tablero...</span>
      <span style="color:#9966CC; font-weight:bold;">elsif</span> s.<span style="color:#9900CC;">y</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">0</span>
        <span style="color:#008000; font-style:italic;"># Guardamos la pieza</span>
        store_piece
        <span style="color:#008000; font-style:italic;"># Revisamos si hay renglones llenos y los quitamos</span>
        compact_board
        <span style="color:#008000; font-style:italic;"># Ponemos en juego la siguiente pieza</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span> = <span style="color:#0066ff; font-weight:bold;">@next_piece</span>
        <span style="color:#008000; font-style:italic;"># Y la ponemos lista para entrar al tablero</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">move_to_center</span>
        <span style="color:#008000; font-style:italic;"># Generamos la pieza que vendrá a continuación</span>
        <span style="color:#0066ff; font-weight:bold;">@next_piece</span> = Piece.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@window, <span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#008000; font-style:italic;"># La ponemos al lado del tablero</span>
        <span style="color:#0066ff; font-weight:bold;">@next_piece</span>.<span style="color:#9900CC;">move_to_side</span>
      <span style="color:#008000; font-style:italic;"># Si no está completamente dentro, significa que el tablero está</span>
      <span style="color:#008000; font-style:italic;"># lleno</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#008000; font-style:italic;"># Avisamos que el tablero está lleno</span>
        <span style="color:#0066ff; font-weight:bold;">@full</span> = <span style="color:#0000FF; font-weight:bold;">true</span>
        <span style="color:#008000; font-style:italic;"># Y tocamos un sonido para avisar que el juego terminó</span>
        <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:game_over</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">play</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Trata de rotar la pieza a la izquierda</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> rotate_piece_left
    <span style="color:#008000; font-style:italic;"># Necesitaremos esto para mantener el pivote en su lugar cuando</span>
    <span style="color:#008000; font-style:italic;"># hagamos la rotación de la pieza</span>
    adjust_by = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#008000; font-style:italic;"># Necesitamos los datos de ambos estados</span>
    <span style="color:#008000; font-style:italic;"># c = current_state, n = next_state</span>
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">with_states</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>c, n<span style="color:#006600; font-weight:bold;">|</span>
      n.<span style="color:#9900CC;">shape</span> = <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">empty_rotated_shape</span>
      c.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row, i<span style="color:#006600; font-weight:bold;">|</span>
        row.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>cell, j<span style="color:#006600; font-weight:bold;">|</span>
          <span style="color:#008000; font-style:italic;"># Vemos si hay que realizar algún ajuste por el pivote</span>
          adjust_by = <span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">-</span>i, i<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006600; font-weight:bold;">&#40;</span>row.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">-</span>j<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> c.<span style="color:#9900CC;">shape</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span> == <span style="color:#006666;">2</span>
          <span style="color:#008000; font-style:italic;"># Copiamos la pieza rotada</span>
          n.<span style="color:#9900CC;">shape</span><span style="color:#006600; font-weight:bold;">&#91;</span>row.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">-</span>j<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> = c.<span style="color:#9900CC;">shape</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#008000; font-style:italic;"># Hacemos los ajustes pertinentes</span>
      n.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">+</span>= adjust_by<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      n.<span style="color:#9900CC;">y</span> <span style="color:#006600; font-weight:bold;">+</span>= adjust_by<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
      <span style="color:#008000; font-style:italic;"># Checamos que esté dentro del tablero y que no colisione con</span>
      <span style="color:#008000; font-style:italic;"># nada al rotar</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> n.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">&gt;</span>= <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span>
          n.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">+</span> n.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">size</span> <span style="color:#006600; font-weight:bold;">&lt;</span>= <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">w</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span>
          n.<span style="color:#9900CC;">y</span> <span style="color:#006600; font-weight:bold;">+</span> n.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">size</span> <span style="color:#006600; font-weight:bold;">&lt;</span>= <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">h</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span>
          can_take_it?
        <span style="color:#008000; font-style:italic;"># Si es así, la rotamos</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">to_next_state</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#008000; font-style:italic;"># Si no, la dejamos como estaba originalmente</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">restore_state</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Trata de rotar la pieza a la derecha</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> rotate_piece_right
    <span style="color:#008000; font-style:italic;"># Necesitaremos esto para mantener el pivote en su lugar cuando</span>
    <span style="color:#008000; font-style:italic;"># hagamos la rotación de la pieza</span>
    adjust_by = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#008000; font-style:italic;"># Necesitamos los datos de ambos estados</span>
    <span style="color:#008000; font-style:italic;"># c = current_state, n = next_state</span>
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">with_states</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>c, n<span style="color:#006600; font-weight:bold;">|</span>
      n.<span style="color:#9900CC;">shape</span> = <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">empty_rotated_shape</span>
      c.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row, i<span style="color:#006600; font-weight:bold;">|</span>
        row.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>cell, j<span style="color:#006600; font-weight:bold;">|</span>
          <span style="color:#008000; font-style:italic;"># Vemos si hay que realizar algún ajuste por el pivote</span>
          adjust_by = <span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006600; font-weight:bold;">&#40;</span>c.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">-</span>i<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>, i<span style="color:#006600; font-weight:bold;">-</span>j<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> c.<span style="color:#9900CC;">shape</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span> == <span style="color:#006666;">2</span>
          <span style="color:#008000; font-style:italic;"># Copiamos la pieza rotada</span>
          n.<span style="color:#9900CC;">shape</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>c.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">-</span>i<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> = c.<span style="color:#9900CC;">shape</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#008000; font-style:italic;"># Hacemos los ajustes pertinentes</span>
      n.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">+</span>= adjust_by<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      n.<span style="color:#9900CC;">y</span> <span style="color:#006600; font-weight:bold;">+</span>= adjust_by<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
      <span style="color:#008000; font-style:italic;"># Checamos que esté dentro del tablero y que no colisione con</span>
      <span style="color:#008000; font-style:italic;"># nada al rotar</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> n.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">&gt;</span>= <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span>
          n.<span style="color:#9900CC;">x</span> <span style="color:#006600; font-weight:bold;">+</span> n.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">size</span> <span style="color:#006600; font-weight:bold;">&lt;</span>= <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">w</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span>
          n.<span style="color:#9900CC;">y</span> <span style="color:#006600; font-weight:bold;">+</span> n.<span style="color:#9900CC;">shape</span>.<span style="color:#9900CC;">size</span> <span style="color:#006600; font-weight:bold;">&lt;</span>= <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">h</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span>
          can_take_it?
        <span style="color:#008000; font-style:italic;"># Si es así, la rotamos</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">to_next_state</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#008000; font-style:italic;"># Si no, la dejamos como estaba originalmente</span>
        <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">restore_state</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>  
&nbsp;
  <span style="color:#008000; font-style:italic;"># Método para facilitarnos el iterar a través de todas las celdas</span>
  <span style="color:#008000; font-style:italic;"># que contiene el tablero</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> for_every_cell
    <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>row,i<span style="color:#006600; font-weight:bold;">|</span>
      row.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>cell,j<span style="color:#006600; font-weight:bold;">|</span>
        <span style="color:#9966CC; font-weight:bold;">yield</span> cell, i, j
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Para dibujar el marcador en pantalla</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> draw_score
    <span style="color:#008000; font-style:italic;"># Dibujamos la palabra &quot;Puntos&quot; en la pantalla</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">font</span>.
      <span style="color:#9900CC;">draw</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">GameConstants::Text::Score</span>,
           offset_x <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">font</span>.<span style="color:#9900CC;">text_width</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">GameConstants::Text::Score</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">1.5</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0066ff; font-weight:bold;">@b_size</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">2</span>,
           offset_y,
           <span style="color:#6666ff; font-weight:bold;">ZOrder::UI</span>,
           <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">1.5</span>,
           <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">1.5</span>,
           0xffffffff<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Dibujamos los puntos que lleva el jugador</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">font</span>.
      <span style="color:#9900CC;">draw</span><span style="color:#006600; font-weight:bold;">&#40;</span>@score,
           offset_x <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">font</span>.<span style="color:#9900CC;">text_width</span><span style="color:#006600; font-weight:bold;">&#40;</span>@score, <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0066ff; font-weight:bold;">@b_size</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">2</span>,
           offset_y <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#0066ff; font-weight:bold;">@b_size</span> <span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">2</span>,
           <span style="color:#6666ff; font-weight:bold;">ZOrder::UI</span>,
           <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">1.0</span>,
           <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">1.0</span>,
           0xffcc3300<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Para dibujar las piezas en pantalla (la actual y la siguiente)</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> draw_pieces
    <span style="color:#008000; font-style:italic;"># Dibujamos la pieza en juego</span>
    <span style="color:#0066ff; font-weight:bold;">@current_piece</span>.<span style="color:#9900CC;">draw</span>
    <span style="color:#008000; font-style:italic;"># Dibujamos la pieza que sigue</span>
    <span style="color:#0066ff; font-weight:bold;">@next_piece</span>.<span style="color:#9900CC;">draw</span>
    <span style="color:#008000; font-style:italic;"># Dibujamos las palabras &quot;Siguiente pieza&quot; en la pantalla</span>
    <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">font</span>.
      <span style="color:#9900CC;">draw</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">GameConstants::Text::NextPiece</span>,
           offset_x <span style="color:#006600; font-weight:bold;">+</span> w <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#0066ff; font-weight:bold;">@b_size</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#0066ff; font-weight:bold;">@b_size</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">2</span>,
           offset_y,
           <span style="color:#6666ff; font-weight:bold;">ZOrder::UI</span>,
           <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">0.9</span>,
           <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">0.9</span>,
           0xffffffff<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Para dibujar el tablero en la pantalla</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> draw_board
    <span style="color:#008000; font-style:italic;"># Dibujamos el tablero iterando cada celda que lo compone</span>
    for_every_cell <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>c, i, j<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#0066ff; font-weight:bold;">@window</span>.<span style="color:#9900CC;">graphics</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:square</span><span style="color:#006600; font-weight:bold;">&#93;</span>.
        <span style="color:#9900CC;">draw</span><span style="color:#006600; font-weight:bold;">&#40;</span>@offset_x <span style="color:#006600; font-weight:bold;">+</span> j<span style="color:#006600; font-weight:bold;">*</span>@b_size,
             <span style="color:#0066ff; font-weight:bold;">@offset_y</span> <span style="color:#006600; font-weight:bold;">+</span> i<span style="color:#006600; font-weight:bold;">*</span>@b_size,
             <span style="color:#6666ff; font-weight:bold;">ZOrder::Board</span>,
             <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span>,
             <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span>,
             <span style="color:#0066ff; font-weight:bold;">@board</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span> == <span style="color:#006666;">0</span> ? <span style="color:#0066ff; font-weight:bold;">@color</span> : <span style="color:#0066ff; font-weight:bold;">@board_colors</span><span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span>,
             <span style="color:#ff3333; font-weight:bold;">:default</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Dibujamos el tablero, el marcador y las piezas en pantalla</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> draw
    draw_score
    draw_pieces
    draw_board
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
<span style="color:#008000; font-style:italic;"># Esta es la clase que controla la aplicación, aquí se checa la</span>
<span style="color:#008000; font-style:italic;"># entrada de teclado y se lleva el registro de los tiempos para hacer</span>
<span style="color:#008000; font-style:italic;"># que las piezas desciendan</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Metris <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Gosu::Window</span>
  <span style="color:#008000; font-style:italic;"># Ancho y alto de la pantalla, fuente a usar para el texto, gráficos</span>
  <span style="color:#008000; font-style:italic;"># y sonidos</span>
  attr_reader <span style="color:#ff3333; font-weight:bold;">:w</span>, <span style="color:#ff3333; font-weight:bold;">:h</span>, <span style="color:#ff3333; font-weight:bold;">:font</span>, <span style="color:#ff3333; font-weight:bold;">:graphics</span>, <span style="color:#ff3333; font-weight:bold;">:sounds</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize
    <span style="color:#0066ff; font-weight:bold;">@w</span> = <span style="color:#6666ff; font-weight:bold;">GameConstants::ScreenWidth</span>
    <span style="color:#0066ff; font-weight:bold;">@h</span> = <span style="color:#6666ff; font-weight:bold;">GameConstants::ScreenHeight</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">super</span><span style="color:#006600; font-weight:bold;">&#40;</span>@w, <span style="color:#0066ff; font-weight:bold;">@h</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::FullScreen</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">caption</span> = <span style="color:#6666ff; font-weight:bold;">GameConstants::Text::Caption</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Esta variable nos servirá para llevar un control de los gráficos</span>
    <span style="color:#008000; font-style:italic;"># que tenemos en el juego</span>
    <span style="color:#0066ff; font-weight:bold;">@graphics</span> = <span style="color:#CC00FF; font-weight:bold;">Hash</span>.<span style="color:#9900CC;">new</span>
    <span style="color:#008000; font-style:italic;"># La imagen que usamos para representar los bloques</span>
    <span style="color:#0066ff; font-weight:bold;">@graphics</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:square</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Image</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::Graphics::Tile</span>, <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Y la que usamos para el pivote en las piezas</span>
    <span style="color:#0066ff; font-weight:bold;">@graphics</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:circle</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Image</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::Graphics::Pivot</span>, <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Variable para tener fácil acceso a los sonidos</span>
    <span style="color:#0066ff; font-weight:bold;">@sounds</span> = <span style="color:#CC00FF; font-weight:bold;">Hash</span>.<span style="color:#9900CC;">new</span>
    <span style="color:#008000; font-style:italic;"># Sonido a tocar cuando un renglón este lleno</span>
    <span style="color:#0066ff; font-weight:bold;">@sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:completed_row</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Sample</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::Sounds::CompletedRow</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Sonido a tocar cuando el juego termine</span>
    <span style="color:#0066ff; font-weight:bold;">@sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:game_over</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Sample</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::Sounds::GameOver</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Sonido a tocar cuando una pieza haya tocado fondo</span>
    <span style="color:#0066ff; font-weight:bold;">@sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:store_piece</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Sample</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::Sounds::StorePiece</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Sonido a tocar cuando comience el juego</span>
    <span style="color:#0066ff; font-weight:bold;">@sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:game_start</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Sample</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::Sounds::GameStart</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Sonido a tocar cuando no se pueda rotar o mover la pieza a algún lugar</span>
    <span style="color:#0066ff; font-weight:bold;">@sounds</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:invalid_move</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Sample</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>, <span style="color:#6666ff; font-weight:bold;">GameConstants::Sounds::InvalidMove</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Creamos el tablero de juego</span>
    <span style="color:#0066ff; font-weight:bold;">@board</span> = Board.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Creamos la fuente para poner texto en pantalla</span>
    <span style="color:#0066ff; font-weight:bold;">@font</span> = <span style="color:#6666ff; font-weight:bold;">Gosu::Font</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>, Gosu::default_font_name, <span style="color:#006666;">30</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Inicializamos los contadores de tiempo y el tablero</span>
    reset
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Para inicializar los tiempos y el tablero</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> reset
    <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@falling_time</span> = Gosu::milliseconds
    <span style="color:#0066ff; font-weight:bold;">@moving_delta</span> = <span style="color:#0066ff; font-weight:bold;">@falling_delta</span> = <span style="color:#006666;">0</span>
    <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">reset</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
  <span style="color:#008000; font-style:italic;"># Este es el ciclo del juego (gameloop)</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> update
    <span style="color:#008000; font-style:italic;"># Si el tablero no está lleno, lo actualizamos</span>
    update_board <span style="color:#9966CC; font-weight:bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span>!@board.<span style="color:#9900CC;">full</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Para actualizar el tablero</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> update_board
    <span style="color:#008000; font-style:italic;"># Tomamos el tiempo actual</span>
    <span style="color:#0066ff; font-weight:bold;">@new_time</span> = Gosu::milliseconds
    <span style="color:#008000; font-style:italic;"># La diferencia entre el tiempo actual y el tiempo de movimiento</span>
    <span style="color:#0066ff; font-weight:bold;">@moving_delta</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span> <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0066ff; font-weight:bold;">@moving_time</span>
    <span style="color:#008000; font-style:italic;"># La diferencia entre el tiempo actual y el tiempo de caida</span>
    <span style="color:#0066ff; font-weight:bold;">@falling_delta</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span> <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#0066ff; font-weight:bold;">@falling_time</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Esto pregunta si ya pasaron X ms desde la última vez que la</span>
    <span style="color:#008000; font-style:italic;"># pieza bajo un renglón</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@falling_delta</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#6666ff; font-weight:bold;">GameConstants::BoostedDescendTime</span>
      <span style="color:#008000; font-style:italic;"># Si es así, entonces checamos si está presionado el botón de</span>
      <span style="color:#008000; font-style:italic;"># flecha abajo</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> button_down? <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbDown</span>
        <span style="color:#008000; font-style:italic;"># Hacemos que el tablero mueva la pieza un renglón abajo</span>
        <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">move_piece_down</span>
        <span style="color:#008000; font-style:italic;"># Reiniciamos la variable del tiempo de caída al tiempo más</span>
        <span style="color:#008000; font-style:italic;"># reciente obtenido</span>
        <span style="color:#0066ff; font-weight:bold;">@falling_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Este código es el que hace que la pieza baje automáticamente</span>
    <span style="color:#008000; font-style:italic;"># cada X número de milisegundos, funciona igual que el anterior</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@falling_delta</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#6666ff; font-weight:bold;">GameConstants::DescendTime</span>
      <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">move_piece_down</span>
      <span style="color:#0066ff; font-weight:bold;">@falling_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Este código permite que el jugador mantenga pulsada una tecla y</span>
    <span style="color:#008000; font-style:italic;"># la pieza se siga moviendo a los lados, o siga rotando</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@moving_delta</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#6666ff; font-weight:bold;">GameConstants::RepeatTime</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> button_down? <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbRight</span>
        <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">move_piece_right</span>
        <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">if</span> button_down? <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbLeft</span>
        <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">move_piece_left</span>
        <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">if</span> button_down? <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbUp</span>
        <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">rotate_piece_right</span>
        <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">if</span> button_down? <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbQ</span>
        <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">rotate_piece_left</span>
        <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">if</span> button_down? <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbW</span>
        <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">rotate_piece_right</span>
        <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Esto es para tener acción inmediata, si alguien presiona de manera</span>
  <span style="color:#008000; font-style:italic;"># repetida las flechas hacia los lados se obtendrá un movimiento más</span>
  <span style="color:#008000; font-style:italic;"># rápido que si la dejamos presionada</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> button_down<span style="color:#006600; font-weight:bold;">&#40;</span>id<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># Si se presiona la tecla Esc, salimos</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">close</span> <span style="color:#9966CC; font-weight:bold;">if</span> id == <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbEscape</span>
    <span style="color:#008000; font-style:italic;"># Si se presiona la tecla Enter, reiniciamos el juego</span>
    reset <span style="color:#9966CC; font-weight:bold;">if</span> id == <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbReturn</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Si el tablero está lleno, no continuar</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">full</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Movimientos y rotaciones</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> id == <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbRight</span>
      <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">move_piece_right</span>
      <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> id == <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbLeft</span>
      <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">move_piece_left</span>
      <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> id == <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbQ</span>
      <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">rotate_piece_left</span>
      <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> id == <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbUp</span>
      <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">rotate_piece_right</span>
      <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> id == <span style="color:#6666ff; font-weight:bold;">Gosu::Button::KbW</span>
      <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">rotate_piece_right</span>
      <span style="color:#0066ff; font-weight:bold;">@moving_time</span> = <span style="color:#0066ff; font-weight:bold;">@new_time</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># Dibujar el &quot;game over&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> draw_game_over
    <span style="color:#0066ff; font-weight:bold;">@font</span>.<span style="color:#9900CC;">draw_rel</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">GameConstants::Text::GameOver</span>,
                   <span style="color:#0066ff; font-weight:bold;">@w</span><span style="color:#006600; font-weight:bold;">/</span><span style="color:#006666;">2</span>,
                   <span style="color:#006666;">40</span>,
                   <span style="color:#6666ff; font-weight:bold;">ZOrder::UI</span>,
                   <span style="color:#006666;">0.5</span>,
                   <span style="color:#006666;">0.5</span>,
                   <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">2.0</span>,
                   <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">2.0</span>,
                   0xffff0000<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@font</span>.<span style="color:#9900CC;">draw_rel</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">GameConstants::Text::Info</span>,
                   <span style="color:#0066ff; font-weight:bold;">@w</span><span style="color:#006600; font-weight:bold;">/</span><span style="color:#006666;">2</span>,
                   <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">pixel_h</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">offset_y</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">10</span>,
                   <span style="color:#6666ff; font-weight:bold;">ZOrder::UI</span>,
                   <span style="color:#006666;">0.5</span>,
                   <span style="color:#006666;">0</span>,
                   <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">0.8</span>,
                   <span style="color:#6666ff; font-weight:bold;">GameConstants::Factor</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006666;">0.8</span>,
                   0xffffffff<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
&nbsp;
  <span style="color:#008000; font-style:italic;"># Dibujar el tablero y el gameover de ser necesario</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> draw
    <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">draw</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Dibujamos el game over si el tablero está lleno</span>
    draw_game_over <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@board</span>.<span style="color:#9900CC;">full</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Creamos la aplicación y la mostramos</span>
Metris.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">show</span></pre></td></tr></table></div>

<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/' title='Programación de videojuegos con Gosu en Ruby'>Programación de videojuegos con Gosu en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/02/rubytris-en-github/' title='Rubytris en GitHub'>Rubytris en GitHub</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Programación de videojuegos con Gosu en Ruby</title>
		<link>http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/</link>
		<comments>http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 02:18:44 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[gosu]]></category>
		<category><![CDATA[juegos]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=2329</guid>
		<description><![CDATA[Aún recuerdo cuando me saltaba la barda de la primara para ir a las maquinitas a la hora del recreo. Buenos tiempos aquellos del Atari 2600. Desde siempre me han llamado la atención los videojuegos &#8212; y fui un jugador asiduo y vago, cabe mencionar jeje. Y también desde siempre quise aprender a programar videojuegos. [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/avatares/lobo_tuerto.jpg" title="" class="thickbox" rel="singlepic610" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=610&amp;width=120&amp;height=&amp;mode=" alt="lobo_tuerto" title="lobo_tuerto" />
</a>

<p align="justify">Aún recuerdo cuando me saltaba la barda de la primara para ir a las maquinitas a la hora del recreo. Buenos tiempos aquellos del <strong>Atari 2600</strong>.</p>
<p>Desde siempre me han llamado la atención los videojuegos &#8212; y fui un jugador asiduo y vago, cabe mencionar jeje.</p>
<p>Y también desde siempre quise aprender a programar videojuegos. Aprendí a programar, pero conforme pasaron los años cada vez tenía menos tiempo para mis <a href="http://aztlanrpg.net/">proyectos personales</a>.</p>
<p>Estos días, sin embargo, he andado un poco libre y me puse a investigar como andaba el rollo de la programación de juegos en <a href="http://www.ruby-lang.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby Programming Language"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Ruby</a>, dado que es el lenguaje que he adoptado a últimas fechas &#8212; y que además adoro como no tienen idea. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Entonces, andando por la red me enteré de un <em>framework</em> llamado <a href="http://www.libgosu.org/"><strong>Gosu</strong></a> (<a href="http://code.google.com/p/gosu/">sitio en Google Code</a> | <a href="http://code.google.com/p/gosu/w/list">Wiki del proyecto</a>).</p>
<p>Gosu, es una biblioteca multiplataforma para desarrollo de juegos en 2D. Tiene soporte para <strong>C++</strong> y <strong>Ruby</strong>. Sumamente sencillo de agarrar y usar.</p>
<p>¿No me creen? échenle un ojo al <a href="http://code.google.com/p/gosu/wiki/RubyTutorial">tutorial de Ruby</a> (o <a href="http://code.google.com/p/gosu/wiki/CppTutorial">al de C++</a>). En este otro sitio pueden descargar el tutorial de <strong>Gosu</strong> y <strong>Ruby</strong> en PDF en español: <a href="http://cafeina.ladybenko.net/?p=485">Un videojuego sencillo con Gosu y Ruby</a></p>
<p>Bueno, la noticia es que me puse a programar un <strong>Tetris</strong>, comencé ayer a las 4pm aprox, y ya casi lo termino. Me falta comentar el código y refactorizar algunas cosas. En cuanto lo tenga listo (más al rato o mañana) lo pondré por si están interesados en incursionar en el <em>game development</em>. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Aquí les dejo un <em>screenshot</em> jejeje:<br />

<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/mio-tetris.png" title="" class="thickbox" rel="singlepic633" >
	<img class="ngg-singlepic ngg-center" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=633&amp;width=400&amp;height=&amp;mode=" alt="mio-tetris" title="mio-tetris" />
</a>
</p>
<p>De hecho, estaba pensando en hacer un <em>remake</em> de varios juegos antiguos &#8212; sólo por diversión y conocimiento. Y después me gustaría hacer algo más elaborado, como <a href="http://en.wikipedia.org/wiki/Gauntlet_(arcade_game)"><strong>Gauntlet</strong></a> &#8212; ¡le traigo un chingo de ganas desde hace un buen!</p>
<p>¿Qué tal, cómo ven?<br />
¿Algún otro interesado en programar juegos en Ruby?</p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/' title='Metris &#8212; Mi clón de Tetris en Ruby y Gosu'>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/31/una-manita-de-gato-al-clon-de-tetris/' title='Una manita de gato al clon de Tetris'>Una manita de gato al clon de Tetris</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/07/09/programacion-de-videojuegos-con-gosu-en-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Soy tu aire — Arte interactivo</title>
		<link>http://lobotuerto.com/blog/2009/05/20/soy-tu-aire-%e2%80%94-arte-interactivo/</link>
		<comments>http://lobotuerto.com/blog/2009/05/20/soy-tu-aire-%e2%80%94-arte-interactivo/#comments</comments>
		<pubDate>Wed, 20 May 2009 18:13:40 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[arte & diseño]]></category>
		<category><![CDATA[game development]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[interactivo]]></category>
		<category><![CDATA[labuat]]></category>
		<category><![CDATA[música]]></category>
		<category><![CDATA[pintar]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=1565</guid>
		<description><![CDATA[¿Qué tan lejos se puede llevar la metáfora de pintar una canción? De Labuat Soy tu aire. Tenía un buen rato que no sostenía en mi cara una sonrisa honesta por tanto tiempo&#8230; Vean el por qué aquí. Artículos relacionados: Long life to you my friend! ¡Trololololololololololo! Gustavo Cordera &#8212; Ansiedad de buscar You&#8217;ll have [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/misc/soy_tu_aire.jpg" title="" class="thickbox" rel="singlepic607" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=607&amp;width=120&amp;height=&amp;mode=" alt="soy_tu_aire.jpg" title="soy_tu_aire.jpg" />
</a>

<p align="justify">¿Qué tan lejos se puede llevar la metáfora de <em>pintar una canción</em>? De <strong>Labuat</strong> Soy tu aire.</p>
<p>Tenía un buen rato que no sostenía en mi cara una sonrisa honesta por tanto tiempo&#8230; Vean el por qué <a href="http://soytuaire.labuat.com/">aquí</a>.</p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2010/03/29/long-life-to-you-my-friend/' title='Long life to you my friend!'>Long life to you my friend!</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/06/%c2%a1trololololololololololo/' title='¡Trololololololololololo!'>¡Trololololololololololo!</a></li>
<li><a href='http://lobotuerto.com/blog/2010/01/21/gustavo-cordera-ansiedad-de-buscar/' title='Gustavo Cordera &#8212; Ansiedad de buscar'>Gustavo Cordera &#8212; Ansiedad de buscar</a></li>
<li><a href='http://lobotuerto.com/blog/2010/01/19/youll-have-time/' title='You&#8217;ll have time&#8230;'>You&#8217;ll have time&#8230;</a></li>
<li><a href='http://lobotuerto.com/blog/2009/12/19/rob-dougan-clubbed-to-death/' title='Rob Dougan &#8212; Clubbed to death'>Rob Dougan &#8212; Clubbed to death</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/05/20/soy-tu-aire-%e2%80%94-arte-interactivo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena</title>
		<link>http://lobotuerto.com/blog/2009/03/04/tutorial-4-de-irrlicht-como-controlar-con-el-teclado-un-nodo-de-escena/</link>
		<comments>http://lobotuerto.com/blog/2009/03/04/tutorial-4-de-irrlicht-como-controlar-con-el-teclado-un-nodo-de-escena/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 20:10:09 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[irrlicht]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=86</guid>
		<description><![CDATA[Ah pasado un rato desde el último tutorial que escribí para Irrlicht. Cuestiones de tiempo no me habían permitido seguir jugando con este motor gráfico. Pero aquí seguimos, al pie del cañón. Ok, manos a la obra. Pueden seguir el tutorial para descargar y compilar la versión en desarrollo de Irrlicht, o simplemente descargar de [...]]]></description>
			<content:encoded><![CDATA[
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/irrlicht_new_logo.png" title="" class="thickbox" rel="singlepic537" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=537&amp;width=140&amp;height=&amp;mode=" alt="irrlicht_new_logo.png" title="irrlicht_new_logo.png" />
</a>

<p align="justify">Ah pasado un rato desde el último tutorial que escribí para <a href="http://irrlicht.sourceforge.net/"  class="alinks_links" onclick="return alinks_click(this);" title="The Irrlicht Engine is an open source high performance realtime 3D engine."  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Irrlicht</a>. Cuestiones de tiempo no me habían permitido seguir jugando con este motor gráfico.</p>
<p>Pero aquí seguimos, al pie del cañón. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Ok, manos a la obra.</p>
<p>Pueden seguir el <a href="http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-como-compilar-e-instalar-irrlicht-en-ubuntu-804/">tutorial para descargar y compilar la versión en desarrollo de Irrlicht</a>, o simplemente <a href="http://irrlicht.sourceforge.net/downloads.html">descargar de sourceforge</a> la más reciente liberada al público (la 1.5 al momento de escribir este tutorial).</p>
<h3>Objetivo</h3>
<p>Controlar un nodo de escena con el teclado.</p>
<h3>Tutoriales pasados</h3>
<p><a href="http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-como-compilar-e-instalar-irrlicht-en-ubuntu-804/">Tutorial #1 de Irrlicht: Cómo compilar e instalar Irrlicht en Ubuntu 8.04</a><br />
<a href="http://lobotuerto.com/blog/2008/05/10/tutorial-2-de-irrlicht-como-configurar-netbeans-61-y-hacer-un-hola-mundo/">Tutorial #2 de Irrlicht: Cómo configurar NetBeans 6.1 y hacer un Hola Mundo</a><br />
<a href="http://lobotuerto.com/blog/2008/05/28/tutorial-3-de-irrlicht-como-agregar-y-manipular-nodos-de-escena-en-irrlicht/">Tutorial #3 de Irrlicht: Cómo agregar y manipular nodos de escena en Irrlicht</a></p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2008/05/28/tutorial-3-de-irrlicht-como-agregar-y-manipular-nodos-de-escena-en-irrlicht/' title='Tutorial #3 de Irrlicht: Cómo agregar y manipular nodos de escena en Irrlicht'>Tutorial #3 de Irrlicht: Cómo agregar y manipular nodos de escena en Irrlicht</a></li>
<li><a href='http://lobotuerto.com/blog/2008/04/01/devmag-21/' title='Dev.Mag #21'>Dev.Mag #21</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2009/03/04/tutorial-4-de-irrlicht-como-controlar-con-el-teclado-un-nodo-de-escena/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Juego de Talento: Take #2</title>
		<link>http://lobotuerto.com/blog/2008/10/25/juego-de-talento-take-2/</link>
		<comments>http://lobotuerto.com/blog/2008/10/25/juego-de-talento-take-2/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 15:07:33 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[opinión]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[jdt]]></category>
		<category><![CDATA[méxico]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=840</guid>
		<description><![CDATA[La pensé un poco, no quería &#8212;como dicen&#8212; restregar sal en la herida, pero que chingaos, ya son varias las personas que me han comentado recientemente lo que está sucediendo con Juego de Talento. Basta ver el último comentario publicado por GameIndustrySavior en el artículo anterior. Pongo la versión TL;DR a continuación para tu comodidad: [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/juego-de-talento.jpg" title="" class="thickbox" rel="singlepic538" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=538&amp;width=110&amp;height=&amp;mode=" alt="juego-de-talento.jpg" title="juego-de-talento.jpg" />
</a>

<p align="justify">La pensé un poco, no quería &#8212;como dicen&#8212; restregar sal en la herida, pero que chingaos, ya son varias las personas que me han comentado recientemente lo que está sucediendo con Juego de Talento.</p>
<p align="justify">Basta ver el último comentario publicado por <strong>GameIndustrySavior</strong> en el <a href="http://lobotuerto.com/blog/2008/05/08/juego-de-talento-%C2%BFuna-iniciativa-real-para-apoyar-el-desarrollo-de-videojuegos-en-mexico/">artículo anterior</a>. Pongo la versión <strong><a href="http://en.wiktionary.org/wiki/tl;dr">TL;DR</a></strong> a continuación para tu comodidad:</p>
<blockquote><p>Juego de Talento no es mas que una escusa que utilizaron los organizadores para promover su centro CECAVIM, el cual despues de analizar la curricula presenta programas de estudio basura que no ayudaran a nadie a realmente entrar a la industria, solo enriquecer a los dueños de estas iniciativas. Del jurado del “Virtuality” solo hay 1 persona que realmente se dedica al desarrollo de videojuegos, los demas son personas que no tienen que ver con la industria a excepcion de la chica de gamers que creo yo si aporta a la parte del gameplay. <strong>Por dios hasta hay un contador publico! que contador publico es incluido en un concurso de desarrollo de videojuegos como juez!???</strong> Todo esto demuestra que JDT es otra iniciativa que en vez de ayudar a la apenas naciente industria, la perjudica.<br />
&#8230;
</p></blockquote>
<p>Un contador público &#8594; <strong>LOL?</strong><br />
<span id="more-840"></span></p>
<p align="justify">Esta es una conversación que tuve hace unos meses (en agosto para ser exactos) con alguien involucrado en Juego de Talento:</p>
<blockquote><p>
<strong>Anonymous:</strong> tu le entraste al Juego de Talento?<br />
<em>Lobo tuerto:</em> nop<br />
<em>Lobo tuerto:</em> de hecho fui uno de los que lo critico jejeje<br />
<em>Lobo tuerto:</em> tu le entraste?<br />
<strong>Anonymous:</strong> jejeje<br />
<strong>Anonymous:</strong> nel&#8230; pero ando ahi de metiche<br />
<em>Lobo tuerto:</em> que bien, y cómo va todo el asunto?<br />
<strong>Anonymous:</strong> pos ahi va&#8230; solo que los weyes que concursan no tienen ni puta idea de la que les espera jejeje<br />
<strong>Anonymous:</strong> stan entusiasmados&#8230; pero los cabrones se van a pegar con la pared al final jejeje<br />
<em>Lobo tuerto:</em> jajajaja porque lo dices<br />
<em>Lobo tuerto:</em> que viene?<br />
<strong>Anonymous:</strong> a pos que los cabrones creen que el mundo les tiene que dar las cosas de a gratis jejeje<br />
<strong>Anonymous:</strong> se supone, que los ganadores, a parte de llevarse su lana de 1, 2 o 3 lugar&#8230; les van a apoyar a poner su empresa o a hacer su juego<br />
<em>Lobo tuerto:</em> ah sip<br />
<em>Lobo tuerto:</em> eso si lo había leído<br />
<em>Lobo tuerto:</em> psss<br />
<em>Lobo tuerto:</em> ojala que todo salga bien jeje<br />
<strong>Anonymous:</strong> perooooo<br />
<strong>Anonymous:</strong> te digo que los chavos estan tan enajenados que no se dan cuenta de la realidad de las cosas jejeje<br />
<strong>Anonymous:</strong> los de Juego de Talento solo les van a dar 3 opciones a los ganadores:<br />
<strong>Anonymous:</strong> 1- Apoyarlos a hacer su Juego<br />
2- Apoyarlos en hacer su Empresa<br />
3- Tomen su premio y mucha suerte<br />
<em>Lobo tuerto:</em> hmmm<br />
<em>Lobo tuerto:</em> yo tomaria la 3<br />
<em>Lobo tuerto:</em> pero de nuevo, por lo mismo no estoy en juego de talento jejeje<br />
<strong>Anonymous:</strong> tanto para la 1 como para la 2&#8230; es obvio que tanto financiar un proyecto, como armar una empresa implica una inversión pesada de lana y muchas otras cosas<br />
<strong>Anonymous:</strong> y pos es natural que nadie te va a regalar toda esa lana<br />
<em>Lobo tuerto:</em> aunque por ahi tambien lei, de que los de juego de talento podrian tomar el proyecto y sacarlo ellos, si es que los participantes &#8220;no estuveran interesados&#8221; en hacerlo ellos mismos no?<br />
<strong>Anonymous:</strong> esa es la opción 1<br />
<strong>Anonymous:</strong> el chiste es el siguiente&#8230; si tomas la opción 1, en la que te apoyen en hacer tu juego&#8230; la única condición para que eso suceda, es que les tienes que secer tu IP<br />
<strong>Anonymous:</strong> en la opción 2&#8230; donde te ayudan a poner tu empresa&#8230; ellos se van a quedar un buen % de las acciones de la misma<br />
<em>Lobo tuerto:</em> ohhhh<br />
<em>Lobo tuerto:</em> omg<br />
<strong>Anonymous:</strong> es natural&#8230; yo la neta si voy a financiar un proyecto&#8230; es porque espero que me regresen mi inversión y también generar ganancia<br />
<em>Lobo tuerto:</em> obvio<br />
<strong>Anonymous:</strong> asi es como se hacen las cosas<br />
<em>Lobo tuerto:</em> aunque eso suena mas a inv priv<br />
<em>Lobo tuerto:</em> siendo del gobierno<br />
<em>Lobo tuerto:</em> podrias &#8220;esperar&#8221; otra cosa<br />
<strong>Anonymous:</strong> pero el pedo es que muchos no se dan cuenta de esto y al rato se van a poner a chillar jejeje<br />
<em>Lobo tuerto:</em> no crees?<br />
<strong>Anonymous:</strong> pues no&#8230; JDT no tiene nada que ver con el gobierno jejeje&#8230; es 100% iniciativa privada<br />
<em>Lobo tuerto:</em> pues creo que les deberían dar un &#8220;propedéutico&#8221;<br />
<em>Lobo tuerto:</em> y platicarles y que entiendan bien eso<br />
<em>Lobo tuerto:</em> lol<br />
<em>Lobo tuerto:</em> pues como salió el tema de la política y eso, crei que era del gobierno<br />
<em>Lobo tuerto:</em> luego eso tiendo a pensar cuando escucho &#8220;secretaría de economía&#8221; en algún lugar<br />
<strong>Anonymous:</strong> el gobierno está metido, pero solo porque el gobierno financió el proyecto de JDT&#8230; pero no lo organizaron<br />
<em>Lobo tuerto:</em> ya veo la escalera<br />
<em>Lobo tuerto:</em> jejeje<br />
<strong>Anonymous:</strong> pues incluso nosotros también metimos un par de proyectos a la Secre de Economia para que nos ayudaran con el financiamiento<br />
<em>Lobo tuerto:</em> pense que el tal grinberg era el que dirigia jdt y era algún político<br />
<em>Lobo tuerto:</em> no se de donde saqué la idea<br />
<em>Lobo tuerto:</em> jajaajaj<br />
<strong>Anonymous:</strong> pues el Grinberg ni siquiera es mexicano&#8230; es un argentino que supo como sacarle lana al gobierno de México jejeje<br />
<em>Lobo tuerto:</em> uta&#8230;.<br />
<em>Lobo tuerto:</em> no, pues esto confirma mis sospechas jajaja<br />
<em>Lobo tuerto:</em> es que tuve un post en mi blog algo polemico jaja<br />
<strong>Anonymous:</strong> jajaja<br />
<em>Lobo tuerto:</em> hasta un tipo del staff de jdt me fue a &#8220;escribir&#8221; ahi<br />
<strong>Anonymous:</strong> chido jejeje<br />
<em>Lobo tuerto:</em> pero entendio mal mi &#8220;rant&#8221;<br />
<em>Lobo tuerto:</em> a final de cuentas conclui con que SI me da gusto que haya ese tipo de iniciativas, pero tambien SI les falta un buen con la organizacion y logistica<br />
<em>Lobo tuerto:</em> y mira que medio los disculpe porque crei que eran del gobierno jajaja<br />
<em>Lobo tuerto:</em> pero ahora que se que son inversion 100% priv psss<br />
<strong>Anonymous:</strong> y no solo eso&#8230; JDT es solo una fachada jejeje&#8230; por eso esta todo mal organizado&#8230;<br />
<em>Lobo tuerto:</em> bueno y no solo eso<br />
<em>Lobo tuerto:</em> ve<br />
<em>Lobo tuerto:</em> jejeje<br />
<strong>Anonymous:</strong> el verdadero plan malifico vendrá después jejeje<br />
<em>Lobo tuerto:</em> chas<br />
<em>Lobo tuerto:</em> ya hasta parece telenovela<br />
<em>Lobo tuerto:</em> jejeje<br />
<em>Lobo tuerto:</em> y que sigue? (jajaja)<br />
<strong>Anonymous:</strong> pues no puedo decir mucho&#8230; incluso lo que te comento es &#8216;off the record&#8217; jejeje<br />
<strong>Anonymous:</strong> puedes usar la información&#8230; solo no digas de donde salio jejeje<br />
<em>Lobo tuerto:</em> claro<br />
<em>Lobo tuerto:</em> es mi deber como bloggero<br />
<em>Lobo tuerto:</em> proteger las fuentes<br />
<em>Lobo tuerto:</em> jeje<br />
<strong>Anonymous:</strong> yup<br />
<strong>Anonymous:</strong> es todo un desmadre&#8230; pero pos es que si uno no juega con sus reglas, luego no te dan chance de nada y pos tus grandes sueños se quedas solo en eso&#8230; sueños<br />
<em>Lobo tuerto:</em> de acuerdo contigo<br />
<strong>Anonymous:</strong> al menos nosotros estamos procurando que las cosas beneficien a todos&#8230;<br />
<strong>Anonymous:</strong> no lo niego, tenemos nuestras prioridades, pero neta que si queremos ver crecer todo esto<br />
<em>Lobo tuerto:</em> si, de acuerdo tambien<br />
<strong>Anonymous:</strong> lo que se es que el Gabriel tiene el plan de poner 3 negocios:<br />
1- Estudio desarrollador de juegos<br />
2- Su escuela<br />
3- Una incuvadora para estudios de games<br />
<strong>Anonymous:</strong> y pues JDT es solo una fachada para todo eso</p>
<p><em>Lobo tuerto:</em> chale<br />
<em>Lobo tuerto:</em> justo lo que queria hacer<br />
<em>Lobo tuerto:</em> pero yo sin varo<br />
<em>Lobo tuerto:</em> jajajaaj<br />
<em>Lobo tuerto:</em> pues ojala le funcione<br />
<em>Lobo tuerto:</em> neta</p>
</blockquote>
<p align="justify">Y bueno, como digo, las puras buenas intenciones no bastan, si quieren hacer algo <strong>no lo hagan con las nalgas</strong>, háganlo bien, no hay otra manera.</p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2008/05/08/juego-de-talento-%c2%bfuna-iniciativa-real-para-apoyar-el-desarrollo-de-videojuegos-en-mexico/' title='Juego de talento: ¿una iniciativa REAL para apoyar el desarrollo de videojuegos en México?'>Juego de talento: ¿una iniciativa REAL para apoyar el desarrollo de videojuegos en México?</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/' title='Metris &#8212; Mi clón de Tetris en Ruby y Gosu'>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/10/25/juego-de-talento-take-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dev.Mag #25</title>
		<link>http://lobotuerto.com/blog/2008/09/12/devmag-25/</link>
		<comments>http://lobotuerto.com/blog/2008/09/12/devmag-25/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 23:50:22 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[revistas]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=700</guid>
		<description><![CDATA[Acaba de ser publicado el número 25 de la revista de desarrollo de videojuegos Dev.Mag (chequen de una vez el 24 jeje). Si aún no la conoces puedes revisar la lista de todos los números editados. ¡Muy recomendable! Artículos relacionados: Dev.Mag #23 Dev.Mag #21 lotu &#8212; Un framework para desarrollo de juegos en Ruby Mi [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/misc/dev-mag.jpg" title="" class="thickbox" rel="singlepic488" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=488&amp;width=90&amp;height=&amp;mode=" alt="dev-mag.jpg" title="dev-mag.jpg" />
</a>

<p align="justify">Acaba de ser publicado el número 25 de la revista de desarrollo de videojuegos <a href="http://www.devmag.org.za/"  class="alinks_links" onclick="return alinks_click(this);" title="South Africa's Premier Game Development Magazine"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Dev.Mag</a> (chequen de una vez el 24 jeje). <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p align="justify">Si aún no la conoces puedes revisar la lista de <a href="http://www.devmag.org.za/issuelist.jsp">todos los números</a> editados.</p>
<p align="justify"><strong>¡Muy recomendable!</strong> <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2008/07/09/devmag-23/' title='Dev.Mag #23'>Dev.Mag #23</a></li>
<li><a href='http://lobotuerto.com/blog/2008/04/01/devmag-21/' title='Dev.Mag #21'>Dev.Mag #21</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/09/12/devmag-25/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dev.Mag #23</title>
		<link>http://lobotuerto.com/blog/2008/07/09/devmag-23/</link>
		<comments>http://lobotuerto.com/blog/2008/07/09/devmag-23/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 17:28:15 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[revistas]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=121</guid>
		<description><![CDATA[Ya está publicado el número 23 (y el 22 jeje) de Dev.Mag, revista orientada al desarrollo de videojuegos. Viene totalmente rediseñada para ser fácilmente leída donde normalmente lo hacen: En el monitor. Si aún no la conoces puedes revisar la lista de todos los números editados. ¡Muy recomendable! Artículos relacionados: Dev.Mag #25 Dev.Mag #21 lotu [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/misc/dev-mag.jpg" title="" class="thickbox" rel="singlepic488" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=488&amp;width=90&amp;height=&amp;mode=" alt="dev-mag.jpg" title="dev-mag.jpg" />
</a>

<p align="justify">Ya está publicado el <strong>número 23</strong> (y el 22 jeje) de <a href="http://www.devmag.org.za/"  class="alinks_links" onclick="return alinks_click(this);" title="South Africa's Premier Game Development Magazine"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Dev.Mag</a>, revista orientada al desarrollo de videojuegos.</p>
<p align="justify">Viene totalmente rediseñada para ser fácilmente leída donde normalmente lo hacen: En el monitor.</p>
<p align="justify">Si aún no la conoces puedes revisar la lista de <a href="http://www.devmag.org.za/issuelist.jsp">todos los números</a> editados. ¡Muy recomendable! <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2008/09/12/devmag-25/' title='Dev.Mag #25'>Dev.Mag #25</a></li>
<li><a href='http://lobotuerto.com/blog/2008/04/01/devmag-21/' title='Dev.Mag #21'>Dev.Mag #21</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/07/09/devmag-23/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial #3 de Irrlicht: Cómo agregar y manipular nodos de escena en Irrlicht</title>
		<link>http://lobotuerto.com/blog/2008/05/28/tutorial-3-de-irrlicht-como-agregar-y-manipular-nodos-de-escena-en-irrlicht/</link>
		<comments>http://lobotuerto.com/blog/2008/05/28/tutorial-3-de-irrlicht-como-agregar-y-manipular-nodos-de-escena-en-irrlicht/#comments</comments>
		<pubDate>Thu, 29 May 2008 01:46:18 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[irrlicht]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/?p=85</guid>
		<description><![CDATA[Todo proyecto comienza por un principio &#8212;ya sé, bonito aforismo. Por fin haremos algo divertido &#8212;uy si, cuánto&#8212; con Irrlicht: vamos a agregar algunos objetos a nuestro espacio 3D y los mostraremos en pantalla. Véanlo como poner a un actor en escena, es el primer paso para lograr una obra, en nuestro caso ¡un videojuego! [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/irrlicht_new_logo.png" title="" class="thickbox" rel="singlepic537" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=537&amp;width=140&amp;height=&amp;mode=" alt="irrlicht_new_logo.png" title="irrlicht_new_logo.png" />
</a>

<p align="justify"><em>Todo proyecto comienza por un principio</em> &#8212;ya sé, bonito aforismo. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p align="justify">Por fin haremos algo divertido &#8212;uy si, cuánto&#8212; con <a href="http://irrlicht.sourceforge.net/"  class="alinks_links" onclick="return alinks_click(this);" title="The Irrlicht Engine is an open source high performance realtime 3D engine."  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Irrlicht</a>: vamos a agregar algunos objetos a nuestro espacio 3D y los mostraremos en pantalla. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p align="justify">Véanlo como poner a un actor en escena, es el primer paso para lograr una obra, en nuestro caso ¡un videojuego!</p>
<p align="justify">Los videojuegos en su parte más fundamental están compuestos por entidades, ya saben, siempre nos referimos a ellas como el personaje principal (o monito), los monstruos, las balas, las pociones, el castillo, etc.</p>
<p align="justify">Nosotros comenzaremos agregando cubos a nuestra aplicación, esperando que en un futuro no muy lejano se conviertan en temibles criaturas a las cuales podamos derrotar a base de espadazos o balazos &#8212;o algo así. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h3>Objetivo</h3>
<p align="justify">En este tutorial aprenderemos a agregar nodos de escena y a modificarles las siguientes propiedades:</p>
<ul>
<li><strong>Posición</strong></li>
<li><strong>Escala</strong></li>
<li><strong>Rotación</strong></li>
</ul>
<h3>Tutoriales pasados</h3>
<p><a href="http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-como-compilar-e-instalar-irrlicht-en-ubuntu-804/">Tutorial #1 de Irrlicht: Cómo compilar e instalar Irrlicht en Ubuntu 8.04</a><br />
<a href="http://lobotuerto.com/blog/2008/05/10/tutorial-2-de-irrlicht-como-configurar-netbeans-61-y-hacer-un-hola-mundo/">Tutorial #2 de Irrlicht: Cómo configurar NetBeans 6.1 y hacer un Hola Mundo</a></p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2009/03/04/tutorial-4-de-irrlicht-como-controlar-con-el-teclado-un-nodo-de-escena/' title='Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena'>Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena</a></li>
<li><a href='http://lobotuerto.com/blog/2008/04/01/devmag-21/' title='Dev.Mag #21'>Dev.Mag #21</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/05/28/tutorial-3-de-irrlicht-como-agregar-y-manipular-nodos-de-escena-en-irrlicht/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Tutorial #2 de Irrlicht: Cómo configurar NetBeans 6.1 y hacer un Hola Mundo</title>
		<link>http://lobotuerto.com/blog/2008/05/10/tutorial-2-de-irrlicht-como-configurar-netbeans-61-y-hacer-un-hola-mundo/</link>
		<comments>http://lobotuerto.com/blog/2008/05/10/tutorial-2-de-irrlicht-como-configurar-netbeans-61-y-hacer-un-hola-mundo/#comments</comments>
		<pubDate>Sat, 10 May 2008 06:28:07 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[hardy heron]]></category>
		<category><![CDATA[irrlicht]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/2008/05/10/tutorial-2-de-irrlicht-como-configurar-netbeans-61-y-hacer-un-hola-mundo/</guid>
		<description><![CDATA[¿Por qué NetBeans? porque me gusta. Lo he estado usando para el último proyecto Rails en el que he trabajado y se me hace un IDE muy bueno. Si quieren leer sobre sus capacidades específicas para C/C++ pueden hacerlo aquí: C/C++ features. Se que muchos han escuchado que necesita grandes cantidades de recursos, que es [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/irrlicht_new_logo.png" title="" class="thickbox" rel="singlepic537" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=537&amp;width=140&amp;height=&amp;mode=" alt="irrlicht_new_logo.png" title="irrlicht_new_logo.png" />
</a>

<p align="justify">¿Por qué <a href="http://www.netbeans.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Fully-featured Java IDE written completely in Java"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">NetBeans</a>? porque me gusta.</p>
<p align="justify">Lo he estado usando para el último proyecto <a href="http://www.rubyonrails.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Ruby on Rails"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Rails</a> en el que he trabajado y se me hace un IDE muy bueno. Si quieren leer sobre sus capacidades específicas para C/C++ pueden hacerlo aquí: <a href="http://www.netbeans.org/features/cpp/index.html">C/C++ features.</a></p>
<p align="justify">Se que muchos han escuchado que necesita grandes cantidades de recursos, que es muy lento y otras tantas cosas más, yo solo les digo que antes de juzgar lo prueben.</p>
<p align="justify">Aprovechen, acaba de salir la versión <strong>6.1.</strong> <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Objetivo</h3>
<p align="justify">El objetivo de este tutorial es configurar NetBeans para poder compilar desde ahí nuestras aplicaciones basadas en <a href="http://irrlicht.sourceforge.net/"  class="alinks_links" onclick="return alinks_click(this);" title="The Irrlicht Engine is an open source high performance realtime 3D engine."  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Irrlicht</a>.<br />
Y crearemos nuestro primer programa usando este poderoso motor gráfico, así es, ¡un Hola Mundo con Irrlicht!</p>
<h3>Tutoriales pasados</h3>
<p><a href="http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-como-compilar-e-instalar-irrlicht-en-ubuntu-804/">Tutorial #1 de Irrlicht: Cómo compilar e instalar Irrlicht en Ubuntu 8.04</a></p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-como-compilar-e-instalar-irrlicht-en-ubuntu-804/' title='Tutorial #1 de Irrlicht: Cómo compilar e instalar Irrlicht en Ubuntu 8.04'>Tutorial #1 de Irrlicht: Cómo compilar e instalar Irrlicht en Ubuntu 8.04</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
<li><a href='http://lobotuerto.com/blog/2009/03/04/tutorial-4-de-irrlicht-como-controlar-con-el-teclado-un-nodo-de-escena/' title='Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena'>Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena</a></li>
<li><a href='http://lobotuerto.com/blog/2008/10/24/el-utilisimo-comando-screen/' title='El utilísimo comando screen'>El utilísimo comando screen</a></li>
<li><a href='http://lobotuerto.com/blog/2008/08/20/como-compilar-e-instalar-git-160-en-ubuntu-804-hardy-heron/' title='Cómo compilar e instalar git 1.6.0 en Ubuntu 8.04 Hardy Heron'>Cómo compilar e instalar git 1.6.0 en Ubuntu 8.04 Hardy Heron</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/05/10/tutorial-2-de-irrlicht-como-configurar-netbeans-61-y-hacer-un-hola-mundo/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Juego de talento: ¿una iniciativa REAL para apoyar el desarrollo de videojuegos en México?</title>
		<link>http://lobotuerto.com/blog/2008/05/08/juego-de-talento-%c2%bfuna-iniciativa-real-para-apoyar-el-desarrollo-de-videojuegos-en-mexico/</link>
		<comments>http://lobotuerto.com/blog/2008/05/08/juego-de-talento-%c2%bfuna-iniciativa-real-para-apoyar-el-desarrollo-de-videojuegos-en-mexico/#comments</comments>
		<pubDate>Fri, 09 May 2008 05:39:28 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[opinión]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[jdt]]></category>
		<category><![CDATA[méxico]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/2008/05/08/juego-de-talento-%c2%bfuna-iniciativa-real-para-apoyar-el-desarrollo-de-videojuegos-en-mexico/</guid>
		<description><![CDATA[Lo dudo mucho. La intención inicial debió ser buena (muy buena, creo) pero la realidad deja mucho que desear. ¿Por qué digo esto? pues como dijo Jack el destripador (y un buen amigo), vámonos por partes&#8230; Estoy convencido de que el principal problema es casi siempre, que la gente que está a cargo de cierta [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/juego-de-talento.jpg" title="" class="thickbox" rel="singlepic538" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=538&amp;width=110&amp;height=&amp;mode=" alt="juego-de-talento.jpg" title="juego-de-talento.jpg" />
</a>

<p align="justify">Lo dudo mucho. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p align="justify">La intención inicial debió ser buena (muy buena, creo) pero la realidad deja mucho que desear.</p>
<p align="justify">¿Por qué digo esto? pues como dijo <strong>Jack el destripador</strong> (y un buen amigo), vámonos por partes&#8230;</p>
<p><span id="more-81"></span></p>
<ol>
<li>Estoy convencido de que el principal problema es casi siempre, que la gente que está a cargo de cierta área, no es experta o apasionada en ella.<br />
Para muestra basta un botón, <a href="http://www.juegodetalento.com/index.php?option=com_content&#038;view=article&#038;id=196:faq&#038;catid=4:noticias&#038;Itemid=16">vean lo que contestó</a> <em>Gabriel Grinberg</em> a un<del datetime="2008-05-13T14:41:58+00:00">a</del> muchacho<del datetime="2008-05-13T14:41:58+00:00">a</del> llamado<del datetime="2008-05-13T14:43:06+00:00">a</del> <em>KAILA</em> el <del datetime="2008-05-13T14:43:40+00:00">la</del> cual preguntó en qué categoría entrarían <strong>King of Fighters</strong> y <strong>God of War.</strong><br />
Por si les da flojera les puedo compartir que él respondió que esos juegos entrarían en estrategia, a sabiendas de que en el concurso existe una categoría de acción &#8212;raro ¿no?</li>
<li>Por otra parte, la mayor queja es &#8212;para variar&#8212; una pésima organización, además de falta de seriedad. Nada más vean los comentarios que pone la gente aquí: <a href="http://www.juegodetalento.com/index.php?option=com_content&#038;view=article&#038;id=42:jdt&#038;catid=4:noticias&#038;Itemid=16">Juego de talento.</a></li>
<li>Algo que me hizo desconfiar inmediatamente de que fuese una propuesta genuina y parcial es que recortaron la fecha límite de envío de proyectos de dos meses a tan solo uno.<br />
Es decir, la fecha límite de envío de proyectos pasó de ser del 30 de junio al 30 de mayo. Encima te dicen que los de <a href="http://ses4.sep.gob.mx/somos/f6.htm">INDAUTOR</a> se tardan 20 días en registrar tu obra (lo cual es requisito indispensable para concursar). Así que debías tener algo preparado con anterioridad, o ser capaz de hacer algo presentable en unos cuantos días.</li>
<li>Una más, los famosos talleres en un inicio no eran obligatorios, ahora sí lo son. ¿Con tanta tecnología no se les pudo haber prendido el foco y sacar el material de manera virtual para los que son del interior de la república? lo bueno es que te consiguen tarifas preferenciales en hoteles&#8230; han de creer que todos son estudiantes de la Ibero o del Tec. O que disponemos total y libremente de nuestro tiempo &#8212;algunos hacemos el intento por trabajar. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
</ol>
<p align="justify">En lugar de querer captar gente o &#8220;talentos&#8221;, más bien parece que quisieran limitar la entrada, es posible que ya incluso cuenten con su ganador jajaja (si, conspiracionista el asunto). <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p align="justify">Por cierto, una persona que se autodenominó <em>cauto</em> <a href="http://www.juegodetalento.com/index.php?option=com_content&#038;view=article&#038;id=42:jdt&#038;catid=4:noticias&#038;Itemid=16">hizo comentarios</a> en la misma línea &#8212;conspiratoria&#8212; en la página de <strong>Juego de talento</strong>, pero en lugar de ignorar sus comentarios o contestarlos con profesionalidad, trataron de mofarse de ellos. Chéquen la sección de <a href="http://www.juegodetalento.com/index.php?option=com_content&#038;view=article&#038;id=177&#038;Itemid=26">Preguntas Frecuentes</a> para que vean a que me refiero.</p>
<p align="justify">Ya para terminar quiero comentar que la página esta hecha un desmadre, mal organizada como todo el evento. Lo que debieron haber puesto es una portada con la información y enlaces a unos foros, no ocupar una sección de comentarios para preguntas y respuestas.</p>
<p align="justify">De seguro les dieron un buen presupuesto para el sitio web y la terminó haciendo el sobrino de alguno de los organizadores &#8212;nunca falta. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p align="justify">Pero bueno, lo rescatable del asunto es que YA empieza a haber eventos mas &#8220;serios&#8221; con respecto al desarrollo de videojuegos en México, y eso <strong>SI</strong> que me da gusto.</p>
<p align="justify">Supongo que con el tiempo mejorará la calidad y organización de los mismos.</p>
<p align="justify">A los que van a participar les deseo la mejor de las suertes, y a los que no, también. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2008/10/25/juego-de-talento-take-2/' title='Juego de Talento: Take #2'>Juego de Talento: Take #2</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/16/mi-proximo-videojuego/' title='Mi próximo videojuego'>Mi próximo videojuego</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/13/metris-mi-clon-de-tetris-en-ruby-y-gosu/' title='Metris &#8212; Mi clón de Tetris en Ruby y Gosu'>Metris &#8212; Mi clón de Tetris en Ruby y Gosu</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/05/08/juego-de-talento-%c2%bfuna-iniciativa-real-para-apoyar-el-desarrollo-de-videojuegos-en-mexico/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Tutorial #1 de Irrlicht: Cómo compilar e instalar Irrlicht en Ubuntu 8.04</title>
		<link>http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-como-compilar-e-instalar-irrlicht-en-ubuntu-804/</link>
		<comments>http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-como-compilar-e-instalar-irrlicht-en-ubuntu-804/#comments</comments>
		<pubDate>Sun, 04 May 2008 03:29:55 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[hardy heron]]></category>
		<category><![CDATA[irrlicht]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-instalando-irrlicht-en-ubuntu-804/</guid>
		<description><![CDATA[Este tutorial es el primero de una serie que escribiré acerca de este excelente motor gráfico. Los artículos me servirán como apuntes de lo que he aprendido y si alguien más se beneficia con ellos pues qué mejor. Objetivo El objetivo de este primer tutorial es descargar, compilar e instalar las bibliotecas de la versión [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/gamedev/irrlicht_new_logo.png" title="" class="thickbox" rel="singlepic537" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=537&amp;width=140&amp;height=&amp;mode=" alt="irrlicht_new_logo.png" title="irrlicht_new_logo.png" />
</a>

<p align="justify">Este tutorial es el primero de una serie que escribiré acerca de este excelente motor gráfico.<br />
Los artículos me servirán como apuntes de lo que he aprendido y si alguien más se beneficia con ellos pues qué mejor.</p>
<h3>Objetivo</h3>
<p align="justify">El objetivo de este primer tutorial es descargar, compilar e instalar las bibliotecas de la versión más reciente de <a href="http://irrlicht.sourceforge.net/"  class="alinks_links" onclick="return alinks_click(this);" title="The Irrlicht Engine is an open source high performance realtime 3D engine."  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Irrlicht</a> en mi sistema operativo favorito: <strong><a href="http://www.ubuntu.com/"  class="alinks_links" onclick="return alinks_click(this);" title="Linux Ubuntu"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Ubuntu</a></strong> en su versión más reciente la <strong>8.04 Hardy Heron</strong>. Como paso opcional compilaremos los ejemplos y ejecutaremos el famoso &#8220;Hello world&#8221;.</p>
<p align="justify">A darle, que pa&#8217; luego es tarde&#8230; <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-82"></span></p>
<h3>Descargar y compilar Irrlicht</h3>
<p align="justify">Si no cuentas con <strong>SVN</strong> (Subversion) necesitas instalarlo, lo ocuparás para descargar el código fuente de Irrlicht.<br />
Abre una terminal y en ella teclea lo siguiente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> subversion</pre></td></tr></table></div>

<p align="justify">También necesitamos instalar ciertos paquetes en nuestro sistema para poder compilar Irrlicht.<br />
Teclea lo siguiente en la terminal:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> build-essential xserver-xorg-dev x11proto-xf86vidmode-dev libxxf86vm-dev mesa-common-dev libgl1-mesa-dev libglu1-mesa-dev libxext-dev</pre></td></tr></table></div>

<p align="justify">Ya con SVN en nuestro equipo y los requisitos previos cubiertos, procedemos a crear un directorio donde almacenaremos el código fuente de Irrlicht que descargaremos desde su repositorio.<br />
En tu terminal teclea los siguiente comandos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> src
<span style="color: #7a0874; font-weight: bold;">cd</span> src
<span style="color: #c20cb9; font-weight: bold;">svn</span> checkout https:<span style="color: #000000; font-weight: bold;">//</span>irrlicht.svn.sourceforge.net<span style="color: #000000; font-weight: bold;">/</span>svnroot<span style="color: #000000; font-weight: bold;">/</span>irrlicht<span style="color: #000000; font-weight: bold;">/</span>trunk irrlicht</pre></td></tr></table></div>

<p align="justify">Para compilar Irrlicht:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> irrlicht<span style="color: #000000; font-weight: bold;">/</span>source<span style="color: #000000; font-weight: bold;">/</span>Irrlicht
<span style="color: #c20cb9; font-weight: bold;">make</span></pre></td></tr></table></div>

<h4>Opcional: Compilar los ejemplos</h4>
<p align="justify">Después de compilar Irrlicht, inmediatamente puedes compilar los ejemplos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>examples
.<span style="color: #000000; font-weight: bold;">/</span>buildAllExamples.sh
<span style="color: #7a0874; font-weight: bold;">cd</span> ..<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>Linux</pre></td></tr></table></div>

<p align="justify">Para ejecutar el <strong>Hello World</strong> de ejemplo que trae Irrlicht, escribe lo siguiente en tu terminal:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>01.HelloWorld</pre></td></tr></table></div>

<h3>Instalar Irrlicht en Ubuntu</h3>
<p align="justify">Ahora vamos a instalar la biblioteca compilada y los archivos de cabecera en nuestro sistema:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ..<span style="color: #000000; font-weight: bold;">/</span>..
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> lib<span style="color: #000000; font-weight: bold;">/</span>Linux<span style="color: #000000; font-weight: bold;">/</span>libIrrlicht.a <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-r</span> include<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span></pre></td></tr></table></div>

<p align="justify">Listo, ya contamos con lo necesario para experimentar y comenzar a develar los misterios de la programación de videojuegos. <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h3>Lo que sigue</h3>
<p align="justify">El tutorial #2 ya viene en camino y muestra cómo configurar <a href="http://www.netbeans.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Fully-featured Java IDE written completely in Java"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">NetBeans</a> &#8212;mi IDE favorita&#8212; para compilar programas basados en Irrlicht.</p>
<p align="justify">¡Hasta la próxima!</p>
<h3>Referencia</h3>
<p><a href="http://www.irrlicht3d.org/wiki/index.php?n=Main.InstallingIrrlicht">Installing Irrlicht</a></p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2008/05/10/tutorial-2-de-irrlicht-como-configurar-netbeans-61-y-hacer-un-hola-mundo/' title='Tutorial #2 de Irrlicht: Cómo configurar NetBeans 6.1 y hacer un Hola Mundo'>Tutorial #2 de Irrlicht: Cómo configurar NetBeans 6.1 y hacer un Hola Mundo</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/' title='Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope'>Cómo instalar Ruby/Gosu en Ubuntu 9.04 Jaunty Jackalope</a></li>
<li><a href='http://lobotuerto.com/blog/2009/03/04/tutorial-4-de-irrlicht-como-controlar-con-el-teclado-un-nodo-de-escena/' title='Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena'>Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena</a></li>
<li><a href='http://lobotuerto.com/blog/2008/10/24/el-utilisimo-comando-screen/' title='El utilísimo comando screen'>El utilísimo comando screen</a></li>
<li><a href='http://lobotuerto.com/blog/2008/08/20/como-compilar-e-instalar-git-160-en-ubuntu-804-hardy-heron/' title='Cómo compilar e instalar git 1.6.0 en Ubuntu 8.04 Hardy Heron'>Cómo compilar e instalar git 1.6.0 en Ubuntu 8.04 Hardy Heron</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/05/03/tutorial-1-de-irrlicht-como-compilar-e-instalar-irrlicht-en-ubuntu-804/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Dev.Mag #21</title>
		<link>http://lobotuerto.com/blog/2008/04/01/devmag-21/</link>
		<comments>http://lobotuerto.com/blog/2008/04/01/devmag-21/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 04:19:04 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[blender]]></category>
		<category><![CDATA[game programming]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[irrlicht]]></category>
		<category><![CDATA[revistas]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/2008/04/01/devmag-21/</guid>
		<description><![CDATA[Ya está publicado el número 21 de Dev.Mag, revista orientada al desarrollo de videojuegos. Si te interesa la programación de juegos para computadora o estás iniciándote en ello, hazte un favor y descarga todos los números de Dev.Mag. Traducción del correo que recibí: Después de saltarnos un mes, ¡el número 21 ya está aquí! En [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/misc/dev-mag.jpg" title="" class="thickbox" rel="singlepic488" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=488&amp;width=90&amp;height=&amp;mode=" alt="dev-mag.jpg" title="dev-mag.jpg" />
</a>

<p align="justify">Ya está publicado el <strong>número 21</strong> de <a href="http://www.devmag.org.za/"  class="alinks_links" onclick="return alinks_click(this);" title="South Africa's Premier Game Development Magazine"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Dev.Mag</a>, revista orientada al desarrollo de videojuegos.</p>
<p align="justify">Si te interesa la programación de juegos para computadora o estás iniciándote en ello, hazte un favor y descarga <a href="http://www.devmag.org.za/issuelist.jsp">todos los números</a> de <strong>Dev.Mag.</strong></p>
<p align="justify">Traducción del correo que recibí:</p>
<blockquote>
<p align="justify">Después de saltarnos un mes, ¡el número 21 ya está aquí!</p>
<p align="justify">En esta edición le echamos una mirada a <strong>AGS</strong>, analizamos la <strong>GDC</strong> anual y reseñamos muchos juegos independientes.<br />
Además continuamos con nuestros artículos sobre <strong><a href="http://irrlicht.sourceforge.net/"  class="alinks_links" onclick="return alinks_click(this);" title="The Irrlicht Engine is an open source high performance realtime 3D engine."  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Irrlicht</a></strong> y <strong><a href="http://www.blender.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Blender is the free open source 3D content creation suite."  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Blender</a>.</strong></p>
<p align="justify">Disfruta lo que ofrecemos este mes, ¡y prepárate para una gran sorpresa en la siguiente edición!</p>
<p align="justify">¡VAMOS!</p>
</blockquote>
<p align="justify">Cambiando un poco de tema, mi &#8220;engine 3D&#8221; preferido por el momento es <strong>Irrlicht.</strong> <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p align="justify">Si estuviese haciendo un juego eligiría como herramientas base:</p>
<ul>
<li>Irrlicht como motor de 3D.</li>
<li>Raknet como motor de red.</li>
<li><a href="skAI is an Artificial Intelligence library"  class="alinks_links" onclick="return alinks_click(this);" title="http://skai.sourceforge.net/"  >skAI</a> para la inteligencia artificial.</li>
<li>Y para la física aún debo decidir entre <a href="http://www.bulletphysics.com/Bullet/wordpress/"  class="alinks_links" onclick="return alinks_click(this);" title="Bullet Physics Library"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Bullet</a>, <a href="http://www.ode.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Open Dynamics Engine"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">ODE</a> o <a href="http://www.tokamakphysics.com/"  class="alinks_links" onclick="return alinks_click(this);" title="Tokamak Physics Engine"  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Tokamak</a>.</li>
</ul>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2009/03/04/tutorial-4-de-irrlicht-como-controlar-con-el-teclado-un-nodo-de-escena/' title='Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena'>Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena</a></li>
<li><a href='http://lobotuerto.com/blog/2008/09/12/devmag-25/' title='Dev.Mag #25'>Dev.Mag #25</a></li>
<li><a href='http://lobotuerto.com/blog/2008/07/09/devmag-23/' title='Dev.Mag #23'>Dev.Mag #23</a></li>
<li><a href='http://lobotuerto.com/blog/2008/05/28/tutorial-3-de-irrlicht-como-agregar-y-manipular-nodos-de-escena-en-irrlicht/' title='Tutorial #3 de Irrlicht: Cómo agregar y manipular nodos de escena en Irrlicht'>Tutorial #3 de Irrlicht: Cómo agregar y manipular nodos de escena en Irrlicht</a></li>
<li><a href='http://lobotuerto.com/blog/2010/03/05/lotu-un-framework-para-desarrollo-de-juegos-en-ruby/' title='lotu &#8212; Un framework para desarrollo de juegos en Ruby'>lotu &#8212; Un framework para desarrollo de juegos en Ruby</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/04/01/devmag-21/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Desarrollo de videojuegos: Dev.Mag</title>
		<link>http://lobotuerto.com/blog/2008/02/16/desarrollo-de-videojuegos-devmag/</link>
		<comments>http://lobotuerto.com/blog/2008/02/16/desarrollo-de-videojuegos-devmag/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 15:12:31 +0000</pubDate>
		<dc:creator>lobo_tuerto</dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[blender]]></category>
		<category><![CDATA[irrlicht]]></category>
		<category><![CDATA[revistas]]></category>

		<guid isPermaLink="false">http://lobotuerto.com/blog/2008/02/16/desarrollo-de-videojuegos-devmag/</guid>
		<description><![CDATA[Husmeando por la red me encontré con una excelente publicación sobre desarrollo de videojuegos. Estoy hablando de Dev.Mag, una revista sudafricana de distribución gratuita (y en línea) que actualmente va en el número 20 &#8212;The &#8220;I&#8221; Edition: Irrlicht, IGF and Innovation&#8212; si te late todo lo relacionado con el desarrollo de juegos de video deberías [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://lobotuerto.com/blog/wp-content/gallery/misc/dev-mag.jpg" title="" class="thickbox" rel="singlepic488" >
	<img class="ngg-singlepic ngg-left" src="http://lobotuerto.com/blog/index.php?callback=image&amp;pid=488&amp;width=90&amp;height=&amp;mode=" alt="dev-mag.jpg" title="dev-mag.jpg" />
</a>

<p align="justify">Husmeando por la red me encontré con una excelente publicación sobre desarrollo de videojuegos.</p>
<p align="justify">Estoy hablando de <strong><a href="http://www.devmag.org.za/" title="South Africa's Premier Game Development Magazine">Dev.Mag</a>,</strong> una revista sudafricana de distribución gratuita (y en línea) que actualmente va en el número 20 &#8212;The &#8220;I&#8221; Edition: <a href="http://irrlicht.sourceforge.net/"  class="alinks_links" onclick="return alinks_click(this);" title="The Irrlicht Engine is an open source high performance realtime 3D engine."  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Irrlicht</a>, IGF and Innovation&#8212; si te late todo lo relacionado con el desarrollo de juegos de video deberías darte una vuelta por su <a href="http://www.devmag.org.za/" title="South Africa's Premier Game Development Magazine">sitio</a>.</p>
<p align="justify">El último número trae una entrevista con el creador de <strong>Irrlicht</strong>, reseñas de juegos interesantes (e independientes), tutoriales de <strong><a href="http://www.blender.org/"  class="alinks_links" onclick="return alinks_click(this);" title="Blender is the free open source 3D content creation suite."  style="padding-right: 13px; background: url(http://lobotuerto.com/blog/wp-content/plugins/alinks/images/external.png) center right no-repeat;" rel="external">Blender</a></strong>, de <strong>Irrlicht</strong>, de gráficos para videojuego con <strong>Photoshop</strong> y hasta de programación del <strong><a href="http://es.wikipedia.org/wiki/Ruido_Perlin">Ruido Perlin</a></strong>, también tiene su sección de diseño entre otras.</p>
<p align="justify">Bájenla y espero sus comentarios acerca de ella <img src='http://lobotuerto.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3 class='related_post_title'>Artículos relacionados:</h3>
<ul class='related_post'>
<li><a href='http://lobotuerto.com/blog/2008/04/01/devmag-21/' title='Dev.Mag #21'>Dev.Mag #21</a></li>
<li><a href='http://lobotuerto.com/blog/2009/08/19/ubuntu-studio/' title='Ubuntu Studio'>Ubuntu Studio</a></li>
<li><a href='http://lobotuerto.com/blog/2009/07/08/modela-texturiza-y-renderea-un-cocina-fotorealista-en-blender-y-yafaray/' title='Modela, texturiza y renderea un cocina fotorealista en Blender y Yafaray'>Modela, texturiza y renderea un cocina fotorealista en Blender y Yafaray</a></li>
<li><a href='http://lobotuerto.com/blog/2009/03/04/tutorial-4-de-irrlicht-como-controlar-con-el-teclado-un-nodo-de-escena/' title='Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena'>Tutorial #4 de Irrlicht: Cómo controlar con el teclado un nodo de escena</a></li>
<li><a href='http://lobotuerto.com/blog/2008/09/12/devmag-25/' title='Dev.Mag #25'>Dev.Mag #25</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lobotuerto.com/blog/2008/02/16/desarrollo-de-videojuegos-devmag/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
