<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CU4ARns5fSp7ImA9WxNUGUk.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220</id><updated>2009-11-11T04:52:27.525-08:00</updated><title>Programar para Nintendo DS y Wii</title><subtitle type="html">Programación de la Nintendo DS y la Wii</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://devnintendods.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Iñigo</name><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/ProgramarParaNintendoDS" type="application/atom+xml" /><feedburner:emailServiceId>ProgramarParaNintendoDS</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;DkEMQX4_eip7ImA9WxNUGEg.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-2148126545356913582</id><published>2009-11-10T03:08:00.001-08:00</published><updated>2009-11-10T04:04:40.042-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-10T04:04:40.042-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="Wii" /><title>Retomamos</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EpPKUBGfNo2t6GjKsqIS5rUl3u8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EpPKUBGfNo2t6GjKsqIS5rUl3u8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EpPKUBGfNo2t6GjKsqIS5rUl3u8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EpPKUBGfNo2t6GjKsqIS5rUl3u8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Ha habido un cierre temporal del blog estos meses, que espero que sea eso, temporal.&lt;br /&gt;
&lt;br /&gt;
Como penitencia voy a crear unos post hablando de la Wii y de como programar para ella. Ya tengo portado el tetris (por ahora usando el mando como un pad) y no hemos pasado el New Super Mario Bros, porque lo van a hacer los de Nintendo este mes y no era cuestión de adelantarnos a ellos :D&lt;br /&gt;
&lt;br /&gt;
Por supuesto, seguiremos con el New Super Mario Bros para la Nintendo DS.&lt;br /&gt;
&lt;br /&gt;
Este viernes posteamos fijo!!!&lt;br /&gt;
&lt;br /&gt;
Saludos&lt;br /&gt;
&lt;br /&gt;
P.D. Hemos cambiado el título del blog, ahora es Programar para la Nintendo DS y Wii, la url por supuesto sigue igual!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-2148126545356913582?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/Z4Rd8yavJio" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/2148126545356913582/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=2148126545356913582" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/2148126545356913582?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/2148126545356913582?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/Z4Rd8yavJio/retomamos.html" title="Retomamos" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/11/retomamos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ABQng_eip7ImA9WxNUF0U.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-4602717355251669718</id><published>2009-09-18T00:00:00.000-07:00</published><updated>2009-11-09T08:55:53.642-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-09T08:55:53.642-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>La aventura de Mario</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CmWyKcey98H-6F1_ydMgxFAfmmc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CmWyKcey98H-6F1_ydMgxFAfmmc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CmWyKcey98H-6F1_ydMgxFAfmmc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CmWyKcey98H-6F1_ydMgxFAfmmc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Por fin ponemos a Mario en su sitio. Mario se hace dueño y señor de su mundo. Un juego que se llama New Super Mario Bros y que no saliera él por ningún sitio era algo extraño. Pues nada un poco de photoshop para ponerle guapo y ya está. Quitamos a koopa y ponemos a Mario.&lt;br /&gt;&lt;br /&gt;Nos ha hecho cambiar alguna cosa más, como por ejemplo el mario_collision_map. Es que este Mario es un poco más bajito que Koopa. También cambia el número de frames que forman la animación (el número de imágenes que representan el movimiento).&lt;br /&gt;&lt;br /&gt;El aspecto de nuestro juego DS es el siguient:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Spt2YW51aFI/AAAAAAAAAMg/xGqKZjqe8mQ/s1600-h/mario.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 192px;" src="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Spt2YW51aFI/AAAAAAAAAMg/xGqKZjqe8mQ/s320/mario.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5376020741033912402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Es el Mario pequeñito. Ya pondremos al intermedio, porque el grande es otra historia.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-4602717355251669718?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/Glxg0N8BWRg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/4602717355251669718/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=4602717355251669718" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4602717355251669718?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4602717355251669718?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/Glxg0N8BWRg/la-aventura-de-mario.html" title="La aventura de Mario" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Spt2YW51aFI/AAAAAAAAAMg/xGqKZjqe8mQ/s72-c/mario.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/09/la-aventura-de-mario.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAMQngyfip7ImA9WxNUGE4.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-7207112297210372949</id><published>2009-09-11T00:00:00.000-07:00</published><updated>2009-11-09T23:06:23.696-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-09T23:06:23.696-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><title>Instalar DevkitPro en linux - Ubuntu</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Y3CMt8LcYltd5X68oOQ-S2U4Htg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y3CMt8LcYltd5X68oOQ-S2U4Htg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Y3CMt8LcYltd5X68oOQ-S2U4Htg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y3CMt8LcYltd5X68oOQ-S2U4Htg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Hemos instalado devkitpro y PAlib en una distribución de Ubuntu.&lt;br /&gt;&lt;br /&gt;Hemos seguido los siguientes pasos:&lt;br /&gt;&lt;br /&gt;Hemos descargado de la red los siguientes ficheros:&lt;br /&gt;&lt;br /&gt;devkitarm, libNds, DSwifi, libfat de &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=114505" target="_blank"&gt;http://sourceforge.net/project/showfiles.php?group_id=114505&lt;/a&gt;&lt;br /&gt;y PAlib: &lt;a href="http://www.palib.info/wiki/doku.php" target="_blank"&gt;http://www.palib.info/wiki/doku.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se han descargado en el Escritorio. Abrimos un terminal y ejecutamos los siguientes comandos:&lt;br /&gt;&lt;br /&gt;$ cd Escritorio&lt;br /&gt;$ sudo mkdir /usr/local/devkitpro&lt;br /&gt;$ sudo chmod 777 /usr/local/devkitpro&lt;br /&gt;$ sudo bunzip2 devkitARM_r26-i686-linux.tar.bz2&lt;br /&gt;$ sudo tar xvf devkitARM_r26-i686-linux.tar -C /usr/local/devkitpro&lt;br /&gt;$ sudo mkdir /usr/local/devkitpro/libnds&lt;br /&gt;$ sudo chmod 777 /usr/local/devkitpro/libnds&lt;br /&gt;$ sudo bunzip2 libnds-1.3.6.tar.bz2&lt;br /&gt;$ sudo tar xvf libnds-1.3.6.tar -C /usr/local/devkitpro/libnds&lt;br /&gt;$ sudo bunzip2 dswifi-0.3.9.tar.bz2&lt;br /&gt;$ sudo tar xvf dswifi-0.3.9.tar -C /usr/local/devkitpro/libnds&lt;br /&gt;$ sudo bunzip2 libfat-nds-20070127.tar.bz2&lt;br /&gt;$ sudo tar xvf libfat-nds-20070127.tar -C /usr/local/devkitpro/libnds&lt;br /&gt;$ sudo mkdir /usr/local/devkitpro/PAlib&lt;br /&gt;$ sudo chmod 777 /usr/local/devkitpro/PAlib&lt;br /&gt;&lt;br /&gt;Aquí me cansé de lanzar tantos comandos y lo que hice fue copiar con el explorador de archivos el &lt;br /&gt;fichero PAlib99999.7z a devkitpro y con el ratón ejecutar descomprimir aquí.&lt;br /&gt;&lt;br /&gt;Para acabar lanzamos el siguiente comando:&lt;br /&gt;$ gksudo gedit /etc/environment&lt;br /&gt;&lt;br /&gt;y añadimos al final las siguientes líneas:&lt;br /&gt;&lt;br /&gt;DEVKITPRO="/usr/local/devkitpro"&lt;br /&gt;DEVKITARM="/usr/local/devkitpro/devkitARM"&lt;br /&gt;PAPATH="/usr/local/devkitpro/PAlib"&lt;br /&gt;&lt;br /&gt;Para instalar un emulador realizamos los siguientes pasos:&lt;br /&gt;&lt;br /&gt;En el menú principal: Sistema/administración/gestor de paquetes synaptic&lt;br /&gt;buscamos 'Desmume' y lo bajamos. Son dos paquetes.&lt;br /&gt;&lt;br /&gt;Y ya está todo.&lt;br /&gt;&lt;br /&gt;He creado la carpeta devDS en /home/inigo/devDS (donde inigo es mi usuario) y ahí he copiado el proyecto. Dentro de SuperMarioDS se puede ejecutar (desde el terminal) la sentencia make. Una vez compilado para ejecutarlo escribimos desmume SuperMarioDS.nds y ...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Sp2OXalD1sI/AAAAAAAAAMw/C6fW_Yd-jd8/s1600-h/Pantallazo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Sp2OXalD1sI/AAAAAAAAAMw/C6fW_Yd-jd8/s320/Pantallazo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5376610063073138370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Es Mario y no Koopa!!.....la semana que viene lo vemos.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-7207112297210372949?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/zqilLCWqy7I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/7207112297210372949/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=7207112297210372949" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/7207112297210372949?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/7207112297210372949?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/zqilLCWqy7I/instalar-en-linux-ubuntu.html" title="Instalar DevkitPro en linux - Ubuntu" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Sp2OXalD1sI/AAAAAAAAAMw/C6fW_Yd-jd8/s72-c/Pantallazo.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/09/instalar-en-linux-ubuntu.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIFRHc_eip7ImA9WxNUGEg.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-9125324174946474683</id><published>2009-09-04T00:10:00.000-07:00</published><updated>2009-11-10T04:01:55.942-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-10T04:01:55.942-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><title>Nueva versión del entorno de desarrollo</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dc5i5ioA1OkMOcUvadu8xNMaWUM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dc5i5ioA1OkMOcUvadu8xNMaWUM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dc5i5ioA1OkMOcUvadu8xNMaWUM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dc5i5ioA1OkMOcUvadu8xNMaWUM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Tenemos nueva versión de devkitPro y parece que muchos de los problemas de instalación han desaparecido. Ya no hace falta cambiar algunas de las librerías que vienen por defecto con el devkitPro para que PAlib funcione.&lt;br /&gt;
&lt;br /&gt;
Pero sí que va a ser necesario cambiar algo de nuestro código. Pero eso lo veremos más adelante.&lt;br /&gt;
&lt;br /&gt;
Ahora mismo los pasos para instalar el entorno de homebrew de la nintendo DS son los siguientes:&lt;br /&gt;
&lt;br /&gt;
Para instalar devkitPro en windows:&lt;br /&gt;
&lt;br /&gt;
1. Bajar devkitPro Updater 1.5.0 de esta &lt;a href="http://sourceforge.net/projects/devkitpro/files/Automated%20Installer/devkitProUpdater-1.5.0.exe" target="_blank"&gt;dirección&lt;/a&gt;.&lt;br /&gt;
2. En una de las pantallas nos muestra esta opción 'Download and install/install from downloaded files' la dejamos pulsada y seguimos&lt;br /&gt;
3. La siguiente nos preunta que hacer con los ficheros que ha bajado. Por defecto está seleccionada Keep downloaded files, que lo único que hace es dejar todos los ficheros en la carpeta de descargas. Yo lo dejé por si tenía algún problema. Cada uno... Seguimos.&lt;br /&gt;
4. Seleccionamos devkitARM -&gt; para trabajar con la DS (la que usamos en este blog)&lt;br /&gt;
devkitPPC -&gt; para gamecube/wii  &lt;br /&gt;
devkitPSP -&gt; para la PSP &lt;br /&gt;
2. A la hora de instalarlo Lo instalaremos en c:\devkitPro (Instalarlo donde queráis pero que la ruta no tenga espacios en blanco)&lt;br /&gt;
6. Se tirará un ratito bajando e instalando cosas...&lt;br /&gt;
&lt;br /&gt;
Y ya está, ahora le toca el turno a PAlib.&lt;br /&gt;
&lt;br /&gt;
7. Bajamos la última &lt;a href="http://forum.palib.info/index.php?topic=7048.0" target="_blank"&gt;versión&lt;/a&gt; (es una beta).&lt;br /&gt;
8. Creamos la carpeta c:\devkitPro\PAlib y descomprimimos el zip PAlib090801.7z ahí.&lt;br /&gt;
&lt;br /&gt;
Y ya está todo!!!!.&lt;br /&gt;
&lt;br /&gt;
Ahora un emulador. Yo he bajado no$gba y lo he instalado en C:\devkitPro\emulators\no$gba.&lt;br /&gt;
&lt;br /&gt;
Ahora le toca el turno a nuestro programa, el SuperMarioDS. &lt;br /&gt;
&lt;br /&gt;
Hay que cambiar una serie de cosas en el código, así que crearemos un proyecto nuevo y trasladaremos las cosas del antiguo a este. Lo primero que hacemos es copiar la carpeta C:\devkitPro\PAlib\template a c:\devDS o donde trabajemos. Cambiamos el nombre template por SuperMarioDS y borramos el fichero main.c de source. Yo para hecer esto renombre el antiguo SuperMarioDS por SuperMarioDS_old&lt;br /&gt;
&lt;br /&gt;
Si nos fijamos las carpetas han cambiado un poco. El mayor cambio es la carpeta gfx, que pasa de source a estar al nivel de todas las demás. El programa ha cambiado un poco así que únicamente copiaremos los ficheros PNG a la nueva carpeta. El ini ha cambiado, también, así que lanzamos el programa PAGfxFrontend.exe (se necesita tener instalado .net) y se cargan como sprites lo siguientes ficheros: coin.png, goomba.png y koopa.png&lt;br /&gt;
Como backgrounds se cargarán estos otros: fondo_azul.png, newImage_0.png, newImage_1.png&lt;br /&gt;
&lt;br /&gt;
Salvamos y generamos, ningún problema. Sólo que únicamente crea all_gfx.h y NO all_gfx.c. Tendremos que quitar esa referencia.&lt;br /&gt;
&lt;br /&gt;
En el make file hacemos una pequeña modificamos en la línea 46:&lt;br /&gt;
&lt;br /&gt;
Antes: SOURCES  := source data gfx/bin &lt;br /&gt;
Ahora: SOURCES  := source data gfx/bin source/devnintendods&lt;br /&gt;
&lt;br /&gt;
De esta forma podemos usar las fuentes que hay en source/devnintendods.&lt;br /&gt;
&lt;br /&gt;
Ahora el resto de cosas. Los ficheros que estaban en data (dos .raw) siguen en la nueva data.&lt;br /&gt;
&lt;br /&gt;
El fichero devnintendods.h de include se va al nuevo include y source sigue igual quitando el gfx antiguo, claro.&lt;br /&gt;
&lt;br /&gt;
Ahora, si compilamos, saldrán una serie de errores. En mi caso bastantes. Lo primero, quitar all_gfx.c de NSMB.cpp.&lt;br /&gt;
&lt;br /&gt;
Otra cosa, en ScreenManager.cpp cambia la línea 45 y en el .h correspondiente la línea 137:&lt;br /&gt;
Lo que antes era:&lt;br /&gt;
SetBackground(unsigned int background, int *info, void * pal, const unsigned char *tiles, u32 tiles_size, const unsigned short *mapa) &lt;br /&gt;
ahora es:&lt;br /&gt;
SetBackground(unsigned int background, int *info, void * pal, const unsigned char *tiles, unsigned int tiles_size, const unsigned int *mapa)&lt;br /&gt;
&lt;br /&gt;
El array Blank, que era un array a blanco ha desaparecido, así que da error la línea 16 del TileSet.cpp, la he comentado. Ahora no se usa, pero...&lt;br /&gt;
&lt;br /&gt;
Y no recuerdo más cambios.&lt;br /&gt;
&lt;br /&gt;
El juego ya compila y se puede ejecutar.&lt;br /&gt;
&lt;br /&gt;
La semana que viene veremos como instalar en ubuntu, que es un poco más largo, pero no da ningún tipo de problema.&lt;br /&gt;
&lt;br /&gt;
Saludos&lt;br /&gt;
&lt;br /&gt;
P.D. Tras el descanso veraniego, en que le blog no ha sido actualizado, vamos a intentar seguir con el blog. No sé de cuanto tiempo dispondré pero bueno...&lt;br /&gt;
&lt;br /&gt;
Enlaces paqtrocinados&lt;br /&gt;
&lt;a href="http://www.sologoogle.com" target="_blank" &gt;alta en buscadores&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.alta-en-buscadores.biz" target="_blank" &gt;como salir en google&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lapaginadeltarot.com/consultas_trabajo.htm" target="_blank" &gt;Consultas trabajo&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.TrabajaDesdeCasaAhora.com" target="_blank" &gt;Ganar Dinero Extra&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.parot.es/ing/aptos.html" target="_blank" &gt;Ibiza apartments&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.islared.com" target="_blank" &gt;marketing on-line&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lapaginadeltarot.com/" target="_blank" &gt;Tarot telefónico&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lapaginadeltarot.com/tarot_visa.htm" target="_blank" &gt;Tarot VISA&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.exponsor.com" target="_blank" &gt;vender enlaces&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lapaginadeltarot.com/videncia.htm" target="_blank" &gt;Videncia&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-9125324174946474683?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/64Wuuxk-rDo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/9125324174946474683/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=9125324174946474683" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/9125324174946474683?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/9125324174946474683?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/64Wuuxk-rDo/nueva-version-del-entorno-de-desarrollo.html" title="Nueva versión del entorno de desarrollo" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/09/nueva-version-del-entorno-de-desarrollo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEFRH05fCp7ImA9WxJUGEw.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-1173318792297898088</id><published>2009-07-17T00:01:00.000-07:00</published><updated>2009-07-17T00:10:15.324-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-17T00:10:15.324-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Dejamos el salto fino</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/z01U_GEbwdZfpmIcyKwJw1nEInw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z01U_GEbwdZfpmIcyKwJw1nEInw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/z01U_GEbwdZfpmIcyKwJw1nEInw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z01U_GEbwdZfpmIcyKwJw1nEInw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Hasta ahora a la hora de caer de un salto nuestro personaje realizaba una misteriosa maniobra. Justo antes de caer al suelo frenaba de forma misteriosa. Lo que ocurría era que el código al obtener una colisión con el suelo reseteaba todos los valores del salto y empezaba a caer de nuevo.&lt;br /&gt;&lt;br /&gt;Eso hay que cambiarlo.&lt;br /&gt;&lt;br /&gt;Lo único que se necesita es que al obtener una colisión, como estamos cayendo con una 'fuerza' de más de un pixel, debemos encontrar la primera posición libre antes de las plataformas. Un sencillo for realizará este trabajo (NSMB.cpp):&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;bool NSMB::BeforeVBL() {&lt;br /&gt; if (tiempoSalto-- &lt; 0) { &lt;br /&gt;&lt;br /&gt;  tiempoSalto = MOVIMIENTO_VELOCIDAD_INTERMEDIA;&lt;br /&gt;  int y = koopa-&gt;GetY();&lt;br /&gt;  koopa-&gt;SetY(y + fuerzaSalto);&lt;br /&gt;  if (topScreen-&gt;IsCollision(koopa, topScreen-&gt;GetBackgroundsX() / 8, topScreen-&gt;GetBackgroundsY() / 8)) {&lt;br /&gt;   if (fuerzaSalto &gt; 0) {   &lt;br /&gt;    int i = 0;&lt;br /&gt;    for (i = 0; i &lt; MAXIMA_FUERZA_CAIDA; i++) {&lt;br /&gt;     koopa-&gt;MoveUp();&lt;br /&gt;     if (!topScreen-&gt;IsCollision(koopa, topScreen-&gt;GetBackgroundsX() / 8, topScreen-&gt;GetBackgroundsY() / 8)) break;&lt;br /&gt;    }&lt;br /&gt;   } else {&lt;br /&gt;    koopa-&gt;SetY(y);&lt;br /&gt;   }&lt;br /&gt;   fuerzaSalto = 0;&lt;br /&gt;   volando = false;&lt;br /&gt;  } else {&lt;br /&gt;   if (fuerzaSalto &lt; MAXIMA_FUERZA_CAIDA) fuerzaSalto++;&lt;br /&gt;   volando = true;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El aspecto del juego no ha cambido demasiado:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0_Lj8wUYfQM/Sltc8fjwe-I/AAAAAAAAAMQ/0fO4ufD7gHU/s1600-h/screen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 193px;" src="http://3.bp.blogspot.com/_0_Lj8wUYfQM/Sltc8fjwe-I/AAAAAAAAAMQ/0fO4ufD7gHU/s320/screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5357978376020720610" /&gt;&lt;/a&gt;&lt;br /&gt;Otras cosas que hemos hecho es seguir 'mejorando' la librería. Por ejemplo, las funciones de mover un sprite, MoveLeft, MoveUp que tengan el parámetro opcional y así realizar un movimiento de 1 por defecto, preparando el código para coger las monedas, etc.&lt;br /&gt;&lt;br /&gt;Esta semana si vamos a colgar el &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb/SuperMarioDS_0.7.zip?attredirects=0"&gt;proyecto&lt;/a&gt;, tal cual está.&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;P.D. Otra cosa, estamos en verano y los post no serán tan fluidos, pero supongo que tampoco las visitas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-1173318792297898088?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/nqQ0qp9_HwQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/1173318792297898088/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=1173318792297898088" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/1173318792297898088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/1173318792297898088?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/nqQ0qp9_HwQ/dejamos-el-salto-fino.html" title="Dejamos el salto fino" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_0_Lj8wUYfQM/Sltc8fjwe-I/AAAAAAAAAMQ/0fO4ufD7gHU/s72-c/screen.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/07/dejamos-el-salto-fino.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4AQX0_eCp7ImA9WxNRE0Q.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-6379755422893260982</id><published>2009-06-19T00:00:00.000-07:00</published><updated>2009-09-08T01:35:40.340-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-08T01:35:40.340-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Mejoramos el movimiento</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6X4klJ0PIl0f3Zy8V8g30SqxDfA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6X4klJ0PIl0f3Zy8V8g30SqxDfA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6X4klJ0PIl0f3Zy8V8g30SqxDfA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6X4klJ0PIl0f3Zy8V8g30SqxDfA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Todas estas semanas atrás hemos estado programando el juego utilizando las funcionalidades de los Tiles que nos brinda PALib. Esto está muy bien para juegos tipo Tetris, de tablero, etc. Pero para el New Super Mario Bros, o para los Pokemon no es totalmente válido.&lt;br /&gt;&lt;br /&gt;El programar con tiles permite dibujar la pantalla con 'azulejos' de 8x8 pixeles, por lo que el movimiento del fondo (necesario en este tipo de juegos) ha de ser de 8 en 8 pixeles y eso no puede ser. Necesitamos unas transiciones más suaves.&lt;br /&gt;&lt;br /&gt;PALib permite crear tiles y mover el fondo como de si una imagen se tratara. Así que hemos realizado los siguientes cambios en nuestra librería y en el editor de mapas.&lt;br /&gt;&lt;br /&gt;Con respecto a la nueva librería hemos creado nuevas funciones para tratar los fondos. Estas funciones estarán en ScreenManager:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt; /**&lt;br /&gt;  * Asigna una imagen de fondo&lt;br /&gt;  *&lt;br /&gt;  * @param background Cada pantalla de la consola permite cuatro niveles de&lt;br /&gt;  * fondos. Los valores posibles son: BACKGROUND_ZERO, BACKGROUND_ONE,&lt;br /&gt;  * BACKGROUND_TWO, BACKGROUND_THREE (de mayor a menor prioridad)&lt;br /&gt;  */&lt;br /&gt; void SetBackground(unsigned int background, int *info, void * pal, const unsigned char *tiles, u32 tiles_size, const unsigned short *mapa);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Devuelve la coordenada X única a todos los fondos.&lt;br /&gt;  */&lt;br /&gt; int GetBackgroundsX();&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Devuelve la coordenada Y única a todos los fondos.&lt;br /&gt;  */&lt;br /&gt; int GetBackgroundsY();&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Asigna la coordenada X única a todos los fondos.&lt;br /&gt;  * Se utiliza para mover todos los fondos a la vez&lt;br /&gt;  *&lt;br /&gt;  * @param y coordenada x&lt;br /&gt;  */&lt;br /&gt; void SetBackgroundsX(int x);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Asigna la coordenada Y única a todos los fondos.&lt;br /&gt;  * Se utiliza para mover todos los fondos a la vez&lt;br /&gt;  *&lt;br /&gt;  * @param y coordenada Y&lt;br /&gt;  */&lt;br /&gt; void SetBackgroundsY(int y);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Asigna las coordenadas X, Y única a todos los fondos.&lt;br /&gt;  * Se utiliza para mover todos los fondos a la vez&lt;br /&gt;  *&lt;br /&gt;  * @param y coordenada x&lt;br /&gt;  * @param y coordenada Y&lt;br /&gt;  */&lt;br /&gt; void SetBackgroundsXY(int x, int y);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Desplaza a la izquierda todos los fondos una cantidad dada&lt;br /&gt;  * Se utiliza para mover todos los fondos a la vez&lt;br /&gt;  *&lt;br /&gt;  * @param offset desplazamiento&lt;br /&gt;   * @return la nueva coordenada x&lt;br /&gt;  */&lt;br /&gt; int MoveBackgroundsLeft(int offset);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Desplaza a la derecha todos los fondos una cantidad dada&lt;br /&gt;  * Se utiliza para mover todos los fondos a la vez&lt;br /&gt;  *&lt;br /&gt;  * @param offset desplazamiento&lt;br /&gt;   * @return la nueva coordenada x&lt;br /&gt;  */&lt;br /&gt; int MoveBackgroundsRight(int offset);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Desplaza arriba todos los fondos una cantidad dada&lt;br /&gt;  * Se utiliza para mover todos los fondos a la vez&lt;br /&gt;  *&lt;br /&gt;  * @param offset desplazamiento&lt;br /&gt;   * @return la nueva coordenada y&lt;br /&gt;  */&lt;br /&gt; int MoveBackgroundsUp(int offset);&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Desplaza abajo todos los fondos una cantidad dada&lt;br /&gt;  * Se utiliza para mover todos los fondos a la vez&lt;br /&gt;  *&lt;br /&gt;  * @param offset desplazamiento&lt;br /&gt;  * @return la nueva coordenada y&lt;br /&gt;  */&lt;br /&gt; int MoveBackgroundsBottom(int offset);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De esta forma podemos asignar una serie de imágenes a los distintos fondos y moverlos sin problema los pixeles que se desean. En nuestro caso los fondos se moverán de izquierda a derecha.&lt;br /&gt;&lt;br /&gt;Las funciones utilizadas hasta hoy, &lt;span style="font-style:italic;"&gt;CreateTileSet&lt;/span&gt;, y la clase &lt;span style="font-style:italic;"&gt;TileSet &lt;/span&gt;se dejarán para los proyectos que lo necesiten.&lt;br /&gt;&lt;br /&gt;En cuanto al programa de edición de mapas se han cambiado los ficheros de salida. Ahora genera un png con el dibujo que se ha editado. Este dibujo debe pasar por PAGfx para generar los ficheros de salida. A continuación publicamos las dos imágenes de salida del programa de edición:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0_Lj8wUYfQM/SiTIIgQaJnI/AAAAAAAAAMA/cYcPS_Vhnho/s1600-h/newImage_0.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 80px;" src="http://3.bp.blogspot.com/_0_Lj8wUYfQM/SiTIIgQaJnI/AAAAAAAAAMA/cYcPS_Vhnho/s320/newImage_0.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5342615106391516786" /&gt;&lt;/a&gt;&lt;br /&gt;Fondo cero&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SiTK2mLPkSI/AAAAAAAAAMI/RmNVPIyqbSw/s1600-h/newImage_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 80px;" src="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SiTK2mLPkSI/AAAAAAAAAMI/RmNVPIyqbSw/s320/newImage_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5342618097277702434" /&gt;&lt;/a&gt;&lt;br /&gt;Fondo uno&lt;br /&gt;&lt;br /&gt;El código en NSMB.cpp quedará así:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt; topScreen-&gt;SetBackground(BACKGROUND_ZERO, FONDO_CERO);&lt;br /&gt; topScreen-&gt;SetBackground(BACKGROUND_ONE, FONDO_UNO);&lt;br /&gt; topScreen-&gt;SetBackground(BACKGROUND_THREE, FONDO_TRES);&lt;br /&gt; topScreen-&gt;SetCollisionMap8x8((void *)newImage_0_Map, newImage_0_Info[1] / 8, newImage_0_Info[2] / 8);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta semana no voy a publicar código. Son demasiados cambios de un solo golpe y no puedo mantener bien las versiones. Además de que el código estará lleno de errores.&lt;br /&gt;&lt;br /&gt;Ahora mi objetivo es dejar el salto fino y coger las monedas.&lt;br /&gt;&lt;br /&gt;Espero tener para la semana que viene cosas nuevas que ofrecer, aunque el verano me va a quitar tiempo. &lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-6379755422893260982?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/sWNoVYvJoLE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/6379755422893260982/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=6379755422893260982" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/6379755422893260982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/6379755422893260982?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/sWNoVYvJoLE/mejoramos-el-movimiento.html" title="Mejoramos el movimiento" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_0_Lj8wUYfQM/SiTIIgQaJnI/AAAAAAAAAMA/cYcPS_Vhnho/s72-c/newImage_0.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/06/mejoramos-el-movimiento.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcGR3k5eCp7ImA9WxJXF0Q.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-3937750932488288644</id><published>2009-06-12T00:00:00.000-07:00</published><updated>2009-06-12T00:00:26.720-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-12T00:00:26.720-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="sonido" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Los sonidos</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zRLHmKzZQP2cK1j1JIIi218w3PI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zRLHmKzZQP2cK1j1JIIi218w3PI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zRLHmKzZQP2cK1j1JIIi218w3PI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zRLHmKzZQP2cK1j1JIIi218w3PI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;A partir del &lt;a href="http://devnintendods.blogspot.com/2009/04/sonidos-en-la-nintendo-ds.html"&gt;post&lt;/a&gt; de como programar los sonidos en la Nintendo DS, con el código de David que publicamos hace ya un tiempo, vamos a implementar los sonidos de nuestro juego.&lt;br /&gt;&lt;br /&gt;Como ya explicamos en aquel post, las librerías PALib leen los ficheros de audio en formato raw.&lt;br /&gt;&lt;br /&gt;Para pasar de mp3 a raw lo he hecho con 'Switch Sound File Converter'. Para editar los ficheros hemos usado Audacity.&lt;br /&gt;&lt;br /&gt;Los ficheros de sonido se dejan en la carpeta data de SuperMarioDS. &lt;br /&gt;&lt;br /&gt;La Instrucción PA_InitSound la hemos puesto en el constructor de GameManager.cpp. Ahora en la instalación que tengo de PALib ha empezado a dar problemas y he tenido que cambiar el código, que ha quedad de esta forma: &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;GameManager::GameManager() {&lt;br /&gt; PA_Init();&lt;br /&gt; PA_InitVBL();&lt;br /&gt; &lt;br /&gt; //PA_InitSound();&lt;br /&gt; AS_Init(AS_MODE_SURROUND | AS_MODE_16CH );&lt;br /&gt; AS_SetDefaultSettings(AS_PCM_8BIT, 11025, AS_SURROUND);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El código a cambiar en NSMB.cpp es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;#include &lt;PA9.h&gt;&lt;br /&gt;#include "salto.h"&lt;br /&gt;&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;bool NSMB::HeldUp() {&lt;br /&gt; if (!volando) { //Si no estamos volando podremos saltar&lt;br /&gt;  //PA_PlaySimpleSound(0, salto);&lt;br /&gt;  PA_PlaySimpleSound(salto);&lt;br /&gt;  tiempoSalto = TIEMPO_SALTO;&lt;br /&gt;  volando = true;&lt;br /&gt;  fuerzaSalto = FUERZA_SALTO_INICIAL;&lt;br /&gt; }&lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El error que aparecía al compilar era&lt;span style="font-style:italic;"&gt;&lt;br /&gt;'PA_InitSound' was not declared in this scope&lt;/span&gt;, y ahí me he quedado, he cambiado PA_InitSound y PA_PlaySimpleSound(0, salto) por las otras instrucciones y ya funciona (¿?¿?¿?¿?).&lt;br /&gt;&lt;br /&gt;Ahora habrá que ir poniendo sonidos a las distintas acciones...&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-3937750932488288644?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/DMMnOd4OAqY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/3937750932488288644/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=3937750932488288644" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3937750932488288644?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3937750932488288644?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/DMMnOd4OAqY/los-sonidos.html" title="Los sonidos" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/06/los-sonidos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIAQn4-eCp7ImA9WxJVGUg.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-8031573030478229053</id><published>2009-06-05T00:01:00.000-07:00</published><updated>2009-07-07T01:49:03.050-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T01:49:03.050-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>La gravedad y el salto</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dwKtk6OstdM0H6MqDSSkfvogOKQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dwKtk6OstdM0H6MqDSSkfvogOKQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dwKtk6OstdM0H6MqDSSkfvogOKQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dwKtk6OstdM0H6MqDSSkfvogOKQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Bueno, aquí no vamos a explicar lo que es la gravedad, pero si que es necesario ponerla en nuestro juego.&lt;br /&gt;&lt;br /&gt;Vamos a programar la gravedad en nuestro juego.&lt;br /&gt;&lt;br /&gt;El tema está en que al saltar, Mario no sube y después baja, no....si no que al saltar Mario sube, el bajar es cosa de la gravedad, no del salto. Por lo que habrá que programar primero el tema de la gravedad.&lt;br /&gt;&lt;br /&gt;Lo primero será hacer un mapa con una zona elevada y poner ahí a nuestro héroe. Y que al salir de dicha zona la gravedad le haga caer y que lo haga hasta que ocurra una colisión.&lt;br /&gt;&lt;br /&gt;he creado varias variables, una para saber que estamos cayendo, ya que en esos momentos no podemos saltar. Sólo se salta desde el suelo.&lt;br /&gt;Otra es para el tema de la fuerza al caer, es decir, cada vez se cae más deprisa y el retardo del salto para que no caiga demasiado deprisa.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;bool NSMB::BeforeVBL() {&lt;br /&gt; if (tiempoSalto-- &lt; 0) { &lt;br /&gt;  tiempoSalto = MOVIMIENTO_VELOCIDAD;&lt;br /&gt;  int y = koopa-&gt;GetY();&lt;br /&gt;  koopa-&gt;SetY(y + fuerzaSalto);&lt;br /&gt;  if (topScreen-&gt;IsCollision(koopa, mundo_plataformas_cero-&gt;GetX(), mundo_plataformas_cero-&gt;GetY())) {&lt;br /&gt;   koopa-&gt;SetY(y);&lt;br /&gt;   fuerzaSalto = 1;//inicializar&lt;br /&gt;   volando = false;&lt;br /&gt;  } else {&lt;br /&gt;   if (fuerzaSalto &lt; MAXIMA_FUERZA_CAIDA) fuerzaSalto++;&lt;br /&gt;   volando = true;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El código lo hemos colocado en la función &lt;span style="font-style:italic;"&gt;BeforeVBL&lt;/span&gt; que se ejecuta en cada vuelta del bucle y antes del refresco de la pantalla. Esto se ha hecho así porque la gravedad actua continuamente.&lt;br /&gt;&lt;br /&gt;Lo que realmente hace nuestro código es coger la coordenada 'Y' de nuestro héroe y sumarle la fuerza. La hemos llamado fuerzaSalto porque sirve igualmente para saltar que para caer, ya hemos dicho que saltar y caer es lo mismo.&lt;br /&gt;&lt;br /&gt;Una vez sumados los valores vemos si hay colisión, si no es el caso aumentamos la fuerza, cada vez caemos más fuerte (hasta un límite 'MAXIMA_FUERZA_CAIDA'). Este algoritmo se ejecutará hasta llegar a un suelo.&lt;br /&gt;&lt;br /&gt;Y ahora que pasa si fuerzaSalto es negativo. Pues que tenemos a nuestro héroe saltando. Por lo que necesitamos este código para comenzar a saltar:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;bool NSMB::HeldUp() {&lt;br /&gt; if (!volando) { //Si no estamos volando podremos saltar&lt;br /&gt;  tiempoSalto = TIEMPO_SALTO;&lt;br /&gt;  volando = true;&lt;br /&gt;  fuerzaSalto = FUERZA_SALTO_INICIAL;&lt;br /&gt; }&lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y ya está, programando la gravedad nos ha salido gratis el salto. Así da gusto!&lt;br /&gt;&lt;br /&gt;El juego tiene este aspecto ahora mismo:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0_Lj8wUYfQM/ShUnGOm6TDI/AAAAAAAAAL4/zmi6HCBb3Dc/s1600-h/juego.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 192px;" src="http://2.bp.blogspot.com/_0_Lj8wUYfQM/ShUnGOm6TDI/AAAAAAAAAL4/zmi6HCBb3Dc/s320/juego.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5338215921271589938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aún así queda un efecto feo al aterrizar. Ya lo trabajaremos más adelate.&lt;br /&gt;&lt;br /&gt;Ahora sólo queda coger las monedas, meter los sonidos, los efectos de fondo, más plataformas,... esto no acaba nunca.&lt;br /&gt;&lt;br /&gt;Saludos, nos vemos en los comentarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-8031573030478229053?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/9Ly-qTRKJsg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/8031573030478229053/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=8031573030478229053" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/8031573030478229053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/8031573030478229053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/9Ly-qTRKJsg/la-gravedad-y-el-salto.html" title="La gravedad y el salto" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_0_Lj8wUYfQM/ShUnGOm6TDI/AAAAAAAAAL4/zmi6HCBb3Dc/s72-c/juego.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/06/la-gravedad-y-el-salto.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCQn08fCp7ImA9WxJQFUU.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-7573576791365753599</id><published>2009-05-29T00:01:00.000-07:00</published><updated>2009-05-29T00:01:03.374-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-29T00:01:03.374-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Las monedas</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iSMoRDnZ28PAwTzSidd-Zh6z2JM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iSMoRDnZ28PAwTzSidd-Zh6z2JM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iSMoRDnZ28PAwTzSidd-Zh6z2JM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iSMoRDnZ28PAwTzSidd-Zh6z2JM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;El tema de las monedas nos va a permitir crear un nuevo tipo de Sprite, los Sprites de fondo. Esto no es algo de PALib, si no que es algo implementado por nuestra pequeña librería. &lt;br /&gt;&lt;br /&gt;Los sprites de fondo o 'background sprite' se moverán con el fondo, por lo que habrá que hacer también funciones que muevan el fondo.&lt;br /&gt;&lt;br /&gt;Se ha implementado casi todo dentro de ScreenManager. La función para crear un Sprite de fondo es 'CreateBackgroundSprite'. Tiene los mismos parámetros que 'CreateSprite', lo único que el Sprite queda en una lista de sprites de fondo. También se ha preparado 'CloneBackgroundSprite' que crea un sprite idéntico ahorrando espacio en memoria.&lt;br /&gt;&lt;br /&gt;Antes de ver las funciones, conviene resaltar que se ha usado por primera vez una clase de C++ denominada Vector. Esta clase permite tener una especie de 'array' que se puede ir cargando de forma dinámica. En este caso se ha usado de esta forma:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;//ScreenManager.h&lt;br /&gt;std::vector &lt;Sprite *&gt; *m_backgroundSprites;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta es la forma de crear un vector de clases de Sprite. Más delante se ve como recorrerlo, en 'MoveRightBackgroundSprites' y en 'MoveLeftBackgroundSprites'.&lt;br /&gt;&lt;br /&gt;Las funciones nuevas son las siguientes:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;Sprite *ScreenManager::CreateBackgroundSprite(unsigned int background, unsigned int shape, unsigned int sizes, void *palette, void *sprite, int x, int y) {&lt;br /&gt; return CreateBackgroundSprite(background, shape, sizes, palette, sprite, x, y, 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Sprite *ScreenManager::CreateBackgroundSprite(unsigned int background, unsigned int shape, unsigned int sizes, void *palette, void *sprite, int x, int y, int hflip) {&lt;br /&gt; Sprite *newSprite = new Sprite(m_screen, background, shape, sizes, palette, sprite, x, y, hflip);&lt;br /&gt; if (!m_backgroundSprites) m_backgroundSprites = new std::vector&lt;Sprite *&gt;();&lt;br /&gt; m_backgroundSprites-&gt;push_back(newSprite);&lt;br /&gt; return newSprite;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Sprite *ScreenManager::CloneBackgroundSprite(Sprite *sprite) {&lt;br /&gt; return CloneBackgroundSprite(sprite, sprite-&gt;GetX(), sprite-&gt;GetY());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Sprite *ScreenManager::CloneBackgroundSprite(Sprite *sprite, int x, int y) {&lt;br /&gt; Sprite *clone = sprite-&gt;Clone(x, y);&lt;br /&gt; m_backgroundSprites-&gt;push_back(clone);&lt;br /&gt; return clone;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y, finalmente, las funciones encargadas de mover todos los sprites de fondo de un golpe son:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;void ScreenManager::MoveRightBackgroundSprites(int offset) {&lt;br /&gt; unsigned int i;&lt;br /&gt; for(i = 0; i &lt; m_backgroundSprites-&gt;size(); i++) {&lt;br /&gt;  Sprite *sprite = (Sprite *)m_backgroundSprites-&gt;at(i);&lt;br /&gt;  sprite-&gt;MoveRight(offset);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ScreenManager::MoveLeftBackgroundSprites(int offset) {&lt;br /&gt; unsigned int i;&lt;br /&gt; for(i = 0; i &lt; m_backgroundSprites-&gt;size(); i++) {&lt;br /&gt;  Sprite *sprite = (Sprite *)m_backgroundSprites-&gt;at(i);&lt;br /&gt;  sprite-&gt;MoveLeft(offset);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En este punto surgió un problema y es que cuando la x se hacía negativa o mayor de 256 aparecían los sprites por el otro lado. Este tema se ha corregido creando una función nueva que permite ocultar los sprites:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;void Sprite::SetVisible(int visible) {&lt;br /&gt; if (!visible) {&lt;br /&gt;  if (PA_GetSpriteMode(m_screen, m_index_sprite) != 1) {&lt;br /&gt;   PA_SetSpriteMode(m_screen, m_index_sprite, 1);&lt;br /&gt;   PA_EnableSpecialFx(m_screen, SFX_ALPHA, 0, SFX_BG0 | SFX_BG1 | SFX_BG2 | SFX_BG3 | SFX_BD);&lt;br /&gt;   PA_SetSFXAlpha(m_screen, 0, 0);&lt;br /&gt;  }&lt;br /&gt; } else if (PA_GetSpriteMode(m_screen, m_index_sprite) != 0) {&lt;br /&gt;  PA_SetSpriteMode(m_screen, m_index_sprite, 0);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Esta función pone el sprite totalmente transparente (Esto no es cierto del todo, Existen dos modos y en uno de ellos serán todos los sprites transparentes). Se puede utilizar desde nuestros programas y además lo utilizan las funciones SetX, SetY y SetXY si las coordenadas están fuera de la pantalla:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;void Sprite::SetX(int x) {&lt;br /&gt; m_x = x;&lt;br /&gt; PA_SetSpriteX(m_screen, m_index_sprite, m_x);&lt;br /&gt; if (m_x &lt; 0 || m_x &gt; 256) SetVisible(0);&lt;br /&gt; else SetVisible(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void Sprite::SetY(int y) {&lt;br /&gt; m_y = y;&lt;br /&gt; PA_SetSpriteY(m_screen, m_index_sprite, m_y);&lt;br /&gt; if (m_y &lt; 0 || m_y &gt; 192) SetVisible(0);&lt;br /&gt; else SetVisible(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void Sprite::SetXY(int x, int y) {&lt;br /&gt; m_x = x;&lt;br /&gt; m_y = y;&lt;br /&gt; PA_SetSpriteXY(m_screen, m_index_sprite, m_x, m_y);&lt;br /&gt; if (m_x &lt; 0 || m_x &gt; 256) SetVisible(0);&lt;br /&gt; else SetVisible(1);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Las monedas las hemos creado en NSMB.cpp de la siguiente manera:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;Sprite *coin = topScreen-&gt;CreateBackgroundSprite(BACKGROUND_TWO, COIN, 192, 80);&lt;br /&gt;coin-&gt;SetAnim(0, 3, 4);&lt;br /&gt;coin-&gt;StartAnim();&lt;br /&gt;topScreen-&gt;CloneBackgroundSprite(coin, 224, 88);&lt;br /&gt;topScreen-&gt;CloneBackgroundSprite(coin, 248, 96);&lt;br /&gt;topScreen-&gt;CloneBackgroundSprite(coin, 548, 104);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La primera línea crea una moneda (un sprite de fondo).&lt;br /&gt;La segunda define los frames para la animación.&lt;br /&gt;La tercera pone a girar la moneda.&lt;br /&gt;Y las otras tres crean tres monedas más.&lt;br /&gt;&lt;br /&gt;Este es el aspecto del juego en estos momentos:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SgCrCXour1I/AAAAAAAAALo/uyC2AHWnYJg/s1600-h/nsmb_6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 286px; height: 268px;" src="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SgCrCXour1I/AAAAAAAAALo/uyC2AHWnYJg/s320/nsmb_6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5332450015999602514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;¡¡Ahora solo nos falta saltar para coger esas monedas!!&lt;br /&gt;&lt;br /&gt;Tenemos que hacer el tema de la gravedad y lo de saltar.&lt;br /&gt;&lt;br /&gt;El código correspondiente a esta última entrega lo podéis descargar desde &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb/SuperMarioDS_0.6.zip?attredirects=0"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Nos vemos en los comentarios.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-7573576791365753599?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/U2ZWEboJQe8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/7573576791365753599/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=7573576791365753599" title="5 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/7573576791365753599?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/7573576791365753599?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/U2ZWEboJQe8/las-monedas.html" title="Las monedas" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SgCrCXour1I/AAAAAAAAALo/uyC2AHWnYJg/s72-c/nsmb_6.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/04/las-monedas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ECSXYyfip7ImA9WxJRGUo.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-7388962914117200564</id><published>2009-05-22T00:01:00.000-07:00</published><updated>2009-05-22T00:01:08.896-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-22T00:01:08.896-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Creación de mapas para el Juego (II)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5ROtdIFolG0dVVbbyJS3sk0fMOA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5ROtdIFolG0dVVbbyJS3sk0fMOA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5ROtdIFolG0dVVbbyJS3sk0fMOA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5ROtdIFolG0dVVbbyJS3sk0fMOA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Hemos seguido desarrollando el programa de Java para crear mapas. Se ha detectado un error a la hora de generar los mapas de 8 pixeles y se ha añadido la posibilidad de crear más niveles (hasta los cuatro que permite la Nintendo DS).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SgfTByCBx5I/AAAAAAAAALw/Cbv-XbEliTM/s1600-h/mapas.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 148px;" src="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SgfTByCBx5I/AAAAAAAAALw/Cbv-XbEliTM/s320/mapas.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5334464311207249810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En la foto se puede ver que se ha añadido una lista de opciones con el nombre 'cero', 'one', 'two' y 'three'. Al añadir dibujos a la pantalla se añadirán al mapa que esté seleccionado. tener en cuenta que el mapa 'cero' es de de mayor prioridad, y así hasta el 'three'. (Por supuesto, mayor prioridad es que sale encima).&lt;br /&gt;&lt;br /&gt;En la foto las plantas están en la pantalla 'one', y los ladrillos en la 'two'.&lt;br /&gt;&lt;br /&gt;A la hora de cargar un mapa se ha de cargar el cero_mapa_16.txt, con la opción abrir mapa 16. A la hora de guardar se pondrá, únicamente, el nombre de un txt. &lt;br /&gt;Si por ejemplo se pone casa.txt el programa generará:&lt;br /&gt;cero_mapa_16_casa.txt, (este es el que habrá que cargar la próxima vez para editar todos los mapas)&lt;br /&gt;cero_mapa_8_casa.txt,&lt;br /&gt;cero_collision_8_casa.txt,&lt;br /&gt;one_mapa_16_casa.txt,&lt;br /&gt;one_mapa_8_casa.txt,&lt;br /&gt;one_collision_8_casa.txt,&lt;br /&gt;two_mapa_16_casa.txt,&lt;br /&gt;two_mapa_8_casa.txt,&lt;br /&gt;two_collision_8_casa.txt,&lt;br /&gt;three_mapa_16_casa.txt,&lt;br /&gt;three_mapa_8_casa.txt y&lt;br /&gt;three_collision_8_casa.txt&lt;br /&gt;&lt;br /&gt;Los ficheros de colisión serán los que utilizaremos para el tema de las colisiones. En nuestro caso sólo usaremos el cero_collision_8_...&lt;br /&gt;&lt;br /&gt;La última versión la encontraréis &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb/NSMB_mapas_0.3.zip?attredirects=0"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Con todo esto creo que tenemos toda la información necesaria para poder programar nuestro juego. Otra cosa que se puede hacer en el futuro es cargar estos txt directamente desde el juego. Tiempo al tiempo.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-7388962914117200564?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/RUypsab9cUY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/7388962914117200564/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=7388962914117200564" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/7388962914117200564?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/7388962914117200564?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/RUypsab9cUY/creacion-de-mapas-para-el-juego-ii.html" title="Creación de mapas para el Juego (II)" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SgfTByCBx5I/AAAAAAAAALw/Cbv-XbEliTM/s72-c/mapas.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/05/creacion-de-mapas-para-el-juego-ii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8CRX4yeCp7ImA9WxJRE0o.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-2451637432068568592</id><published>2009-05-15T00:01:00.000-07:00</published><updated>2009-05-15T00:01:04.090-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-15T00:01:04.090-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>El movimiento</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d8GPgualKoi34sm9csdcr409_uU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d8GPgualKoi34sm9csdcr409_uU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d8GPgualKoi34sm9csdcr409_uU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d8GPgualKoi34sm9csdcr409_uU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Otra característica del Mario Bros es que Mario no está siempre en el centro de la pantalla. Si no que cuando se acaban las plataformas, tanto a un lado como a otro, llega hasta el borde de la pantalla.&lt;br /&gt;&lt;br /&gt;Esta característica hay que programarla dentro del juego y no de las librerías, es decir, lo pondremos en NSMB.cpp.&lt;br /&gt;&lt;br /&gt;El código fuente de la función avanzar será el siguiente:&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;int NSMB::avanzar() {&lt;br /&gt; velocidad--;&lt;br /&gt; if (velocidad == 0) {&lt;br /&gt;  velocidad = MOVIMIENTO_VELOCIDAD;&lt;br /&gt;  if (movimiento == MOVIMIENTO_DERECHA) {&lt;br /&gt;   if (koopa-&amp;gt;GetX() &amp;lt; 128) {//128 = pixeles mitad pantalla&lt;br /&gt;    koopa-&gt;MoveRight(MOVIMIENTO_VELOCIDAD);&lt;br /&gt;    if (topScreen-&amp;gt;IsCollision(koopa, mundo_plataformas-&amp;gt;GetX(), mundo_plataformas-&amp;gt;GetY()))&lt;br /&gt;     koopa-&gt;MoveLeft(MOVIMIENTO_VELOCIDAD);//deshacemos el avance&lt;br /&gt;   } else {&lt;br /&gt;    int x = mundo_plataformas-&amp;gt;GetX() + 1;&lt;br /&gt;    if (x &amp;lt; COLUMNAS_MAPA - COLUMNAS_PANTALLA) {&lt;br /&gt;     if (!topScreen-&amp;gt;IsCollision(koopa, x, mundo_plataformas-&amp;gt;GetY())) {&lt;br /&gt;      mundo_plataformas-&amp;gt;SetX(x);&lt;br /&gt;      mundo_plataformas-&amp;gt;PrintMap8x8(MAPA_PLATAFORMAS);&lt;br /&gt;     }&lt;br /&gt;    } else if (koopa-&amp;gt;GetX() &lt; 256) {&lt;br /&gt;     koopa-&amp;gt;MoveRight(MOVIMIENTO_VELOCIDAD);&lt;br /&gt;     if (topScreen-&amp;gt;IsCollision(koopa, mundo_plataformas-&amp;gt;GetX(), mundo_plataformas-&amp;gt;GetY()))&lt;br /&gt;      koopa-&amp;gt;MoveLeft(MOVIMIENTO_VELOCIDAD);//deshacemos el avance&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  } else {//MOVIMIENTO_IZQUIERDA&lt;br /&gt;   if (koopa-&amp;gt;GetX() &amp;gt; 128) {//128 = pixeles mitad pantalla&lt;br /&gt;    koopa-&amp;gt;MoveLeft(MOVIMIENTO_VELOCIDAD);&lt;br /&gt;    if (topScreen-&amp;gt;IsCollision(koopa, mundo_plataformas-&amp;gt;GetX(), mundo_plataformas-&amp;gt;GetY()))&lt;br /&gt;     koopa-&gt;MoveRight(MOVIMIENTO_VELOCIDAD);//deshacemos el avance&lt;br /&gt;   } else if (mundo_plataformas-&amp;gt;GetX() &gt; 0) {&lt;br /&gt;    int x = mundo_plataformas-&amp;gt;GetX() - 1;&lt;br /&gt;    if (!topScreen-&amp;gt;IsCollision(koopa, x, mundo_plataformas-&amp;gt;GetY())) {&lt;br /&gt;     mundo_plataformas-&amp;gt;SetX(x);&lt;br /&gt;     mundo_plataformas-&amp;gt;PrintMap8x8(MAPA_PLATAFORMAS);&lt;br /&gt;    }&lt;br /&gt;   } else if (koopa-&amp;gt;GetX() &amp;gt; 0) {&lt;br /&gt;    koopa-&amp;gt;MoveLeft(MOVIMIENTO_VELOCIDAD);&lt;br /&gt;    if (topScreen-&amp;gt;IsCollision(koopa, mundo_plataformas-&amp;gt;GetX(), mundo_plataformas-&amp;gt;GetY()))&lt;br /&gt;     koopa-&amp;gt;MoveRight(MOVIMIENTO_VELOCIDAD);//deshacemos el avance&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hoy no voy a poner una versión del código porque está cambiando bastante por lo que lo dejaré para futuros post. Sólo os puedo decir que las funciones Print de ScreenManager están ahora a nivel de TileSet. La clase Sprite está cambiando y mantener varias versiones no me es posible.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-2451637432068568592?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/Od94ypVqIFw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/2451637432068568592/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=2451637432068568592" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/2451637432068568592?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/2451637432068568592?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/Od94ypVqIFw/el-movimiento.html" title="El movimiento" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/05/el-movimiento.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQFQnY4cSp7ImA9WxJXFU4.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-4769952236584660792</id><published>2009-05-08T00:01:00.000-07:00</published><updated>2009-06-09T00:25:13.839-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T00:25:13.839-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Las colisiones</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XMCetEM6bo4EdOKwosLNYnEUqAs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XMCetEM6bo4EdOKwosLNYnEUqAs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XMCetEM6bo4EdOKwosLNYnEUqAs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XMCetEM6bo4EdOKwosLNYnEUqAs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Quizás es uno de los temas más importantes de nuestro juego: no demos salirnos de nuestro mundo, ni atravesar las paredes. La intención de este post es de dotar a las librerías que estamos creando, y de paso al NSMB, de esta cualidad tan necesaria.&lt;br /&gt;&lt;br /&gt;Vamos a ver cosas que hemos tenido en cuenta a la hora de programar el tema de las colisiones:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Veamos cómo está definido Koopa, nuestro héroe:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0_Lj8wUYfQM/ScdWaiOnxcI/AAAAAAAAALQ/UB2hxMJW_HI/s1600-h/colisiones.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 35px; height: 35px;" src="http://3.bp.blogspot.com/_0_Lj8wUYfQM/ScdWaiOnxcI/AAAAAAAAALQ/UB2hxMJW_HI/s320/colisiones.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316312898998879682" /&gt;&lt;/a&gt;&lt;br /&gt;Está dentro de un array de 4x4, pero en el fondo sólo ocupa 2x4 (2 columnas y 4 filas). Es decir, una colisión se dará en el caso en que un objeto entrase en las coordenadas (x+1, y) o (x+1, y+1) o (x+1, y+2) o (x+1, y+3) o (x+2, y) o (x+2, y+1) o (x+2, y+2) o (x+2, y+3). El resto de coordenadas no causan colisión.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Otro tema a tener en cuenta. Nuestro juego es de plataformas y Koopa está siempre en las mismas coordenadas, son las plataformas las que se mueven, por lo que habrá que calcular en que casillas del mapa está nuestra tortuga.&lt;br /&gt;&lt;br /&gt;En el código que tenemos hecho hasta la fecha estamos trabajando con formas de 16x16 pixeles,&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Sa-yYHHqKgI/AAAAAAAAAKw/sruCz7V9tEI/s1600-h/plataformas.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 32px;" src="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Sa-yYHHqKgI/AAAAAAAAAKw/sruCz7V9tEI/s320/plataformas.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5309658612990880258" /&gt;&lt;/a&gt;&lt;br /&gt;y esto nos va a dar problemas. Hay que cambiar las cosas, tenemos que pasar a que nuestro mapa vuelva a ser de 8x8. Dejaremos las funciones de 16x16 por si otro proyecto las necesitase.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El mapa de colisiones, es decir un array parecido al que define la forma de nuestro mundo pero de colisiones.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;En definitiva hemos añadido el siguiente código:&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Se ha creado una función que nos permite asignar un array donde definir los obstáculos de nuestro mundo:&lt;br /&gt;void ScreenManager::SetCollisionMap8x8(void *collisionMap, unsigned int cols, unsigned int rows).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Y una que nos permita preguntar por una posible colisión:&lt;br /&gt;int ScreenManager::IsCollision(Sprite *sprite, int x, int y). Ambas funciones se han implementado en la clase ScreenManager.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;En la clase Sprite se han definido las siguientes funciones:&lt;br /&gt;void SetCollisionMap(void *collisionMap, unsigned int cols, unsigned int rows);&lt;br /&gt;void *GetCollisionMap();&lt;br /&gt;unsigned int GetCollisionCols();&lt;br /&gt;unsigned int GetCollisionRows();&lt;br /&gt;Que son las que sirven para definir el mapa de colisiones del Sprite.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;En NSMB.cpp hemos añadido el control de colisiones. Para hacer pruebas hemos dejado el código de subir y bajar, que no son del juego de NSMB, pero nos sirven, en este momento, para probar la funcionalidad. Este control lo encontraréis en la función int NSMB::avanzar() que es invocada desde HeldRight y HeldLeft.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El editor de pantallas tiene nuevas opciones como son la de grabar mapas de 8x8 y uno de colisiones.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Para ver la versión que corresponde a este post pinchar &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb/SuperMarioDS_0.5.zip?attredirects=0"&gt;aquí&lt;/a&gt;.&lt;br /&gt;La nueva versión del editor de mapas está &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb/NSMB_mapas_0.2.zip?attredirects=0"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Esto empieza a tener algo de forma. Nos falta que nuestro héroe, que tiene que ser Mario y no koopa, empiece a saltar. Lo dejaremos para próximos post. Y las monedas, tenemos que llenar nuestro mundo de monedas!!!&lt;br /&gt;&lt;br /&gt;Nos vemos en los comentarios.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-4769952236584660792?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/9pYxN7AFMR8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/4769952236584660792/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=4769952236584660792" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4769952236584660792?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4769952236584660792?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/9pYxN7AFMR8/las-colisiones.html" title="Las colisiones" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_0_Lj8wUYfQM/ScdWaiOnxcI/AAAAAAAAALQ/UB2hxMJW_HI/s72-c/colisiones.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/05/las-colisiones.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4MRH48eCp7ImA9WxJSFUw.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-7418950378523139713</id><published>2009-04-24T00:01:00.000-07:00</published><updated>2009-05-05T01:43:05.070-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-05T01:43:05.070-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Creación de mapas para el Juego</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5WP_60eVhIcyYTvOY8EnubieZAY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5WP_60eVhIcyYTvOY8EnubieZAY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5WP_60eVhIcyYTvOY8EnubieZAY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5WP_60eVhIcyYTvOY8EnubieZAY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Después del paréntesis de la semana santa volvemos al proyecto en que estamos metidos, hacer el New Super Mario Bros para la Nintendo DS.&lt;br /&gt;&lt;br /&gt;En esta entrada vamos a presentar un programa que sirve para hacer los mapas del juego. Es un poco cutre, pero el tiempo no da para más.  Aquí os dejo un pantallazo del programa.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SfA5PYfaU5I/AAAAAAAAALg/bK-kUUVZQ7I/s1600-h/mapas.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 132px;" src="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SfA5PYfaU5I/AAAAAAAAALg/bK-kUUVZQ7I/s320/mapas.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5327821295614317458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Su uso es muy sencillo:&lt;ul&gt;&lt;li&gt;Primero,  se debe cargar el tileset con el que queremos dibujar el mapa (fichero/abrir tileset...),&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Segundo, si queremos modificar un mapa ya hecho lo cargamos con la opción fichero/abrir mapa 16,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tercero, seleccionamos el tile que queremos dibujar en la parte superior,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cuarto, vamos 'clickando' por la pantalla para ir poniendo los cuadraditos y&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Finalmente guardamos el mapa con la opción 'guardar 16'.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Si os fijáis, al cargar se carga con la opción de cargar mapa 16. Esto es que el programa trabaja con tiles de 16x16 pixeles, así que el mapa a cargar sera de 16.&lt;br /&gt;&lt;br /&gt;La opción de 'grabar 16' graba el mapa con tiles de 16x16 pixeles (salida_16.txt).&lt;br /&gt;La opción de 'grabar 8' graba con tiles de 8x8 pixeles (salida_8.txt).&lt;br /&gt;&lt;br /&gt;El proyecto java lo encontrareis &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb/NSMB_mapas.zip?attredirects=0"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No he explicado nada de java, no es tema de este blog, pero si alguien quiere saber algo, que lo diga. Por otra parte, &lt;span style="font-weight:bold;"&gt;¡¡¡he comentado bastante el código!!!&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para ver el mapa dentro de nuestro juego, únicamente, tendremos que copiar el contenido del fichero a NSMB.cpp. Es el array denominado mapa8.&lt;br /&gt;&lt;br /&gt;El último código lo encontraréis &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb/SuperMarioDS_0.4.zip?attredirects=0"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hay un cambio con respecto a la anterior versión y es que antes dibujábamos casillas de 16x16 y ahora de 8x8. Dejaremos la anterior funcionalidad en las librerías por si a algún otro proyecto le pueda interesar.&lt;br /&gt;&lt;br /&gt;Ahora ya podemos ir a por el tema de las colisiones y, después, a por el tema de la gravedad.&lt;br /&gt;&lt;br /&gt;Ya siento no poder avanzar más pero de donde no hay no se puede sacar, y no tengo nada de tiempo.&lt;br /&gt;&lt;br /&gt;Nos vemos en los comentarios, saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-7418950378523139713?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/WqvOKFdt2AA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/7418950378523139713/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=7418950378523139713" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/7418950378523139713?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/7418950378523139713?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/WqvOKFdt2AA/creacion-de-mapas-para-el-juego.html" title="Creación de mapas para el Juego" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SfA5PYfaU5I/AAAAAAAAALg/bK-kUUVZQ7I/s72-c/mapas.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/04/creacion-de-mapas-para-el-juego.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08DRn8zeip7ImA9WxJTFEU.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-3660933787690744081</id><published>2009-04-10T00:01:00.000-07:00</published><updated>2009-04-23T03:17:57.182-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-23T03:17:57.182-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="doxygen" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Doxygen :: Comentar el código</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CgjDRL_xamwta1z8OB_YqhtdU0c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CgjDRL_xamwta1z8OB_YqhtdU0c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CgjDRL_xamwta1z8OB_YqhtdU0c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CgjDRL_xamwta1z8OB_YqhtdU0c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;He estado hablando con David y estamos viendo la posibilidad de comentar el código de una forma más extensa que hasta ahora. O mejor dicho, hasta ahora no se comentaba casi nada en las fuentes.&lt;br /&gt;&lt;br /&gt;Hemos estado mirando las distintas herramientas que hay en Internet para documentar un proyecto y parece que &lt;a href="http://www.stack.nl/~dimitri/doxygen/"&gt;Doxygen&lt;/a&gt; es la que nos parece más potente y fácil de usar. Posee una opción para utilizar los comentarios JavaDoc por lo que el que conozca esta forma de comentar ya lo tiene todo hecho, y ese es más o menos mi caso.&lt;br /&gt;&lt;br /&gt;El resultado es algo parecido a esto:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0_Lj8wUYfQM/SdnCiCyJkfI/AAAAAAAAALY/H5959ZdEjT4/s1600-h/doxygen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 180px;" src="http://1.bp.blogspot.com/_0_Lj8wUYfQM/SdnCiCyJkfI/AAAAAAAAALY/H5959ZdEjT4/s320/doxygen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5321498324833505778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;¡Ahora sólo queda comentar el código!&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-3660933787690744081?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/20_uYcHVbDw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/3660933787690744081/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=3660933787690744081" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3660933787690744081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3660933787690744081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/20_uYcHVbDw/doxygen-comentar-el-codigo.html" title="Doxygen :: Comentar el código" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_0_Lj8wUYfQM/SdnCiCyJkfI/AAAAAAAAALY/H5959ZdEjT4/s72-c/doxygen.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/04/doxygen-comentar-el-codigo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4NQHo9eCp7ImA9WxJRGUo.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-3917714330983863379</id><published>2009-04-03T00:10:00.000-07:00</published><updated>2009-05-21T23:49:51.460-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-21T23:49:51.460-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="sonido" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Sonidos en la Nintendo DS</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/To3m9ymf4TFaJGaKqDfREhLKu6s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/To3m9ymf4TFaJGaKqDfREhLKu6s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/To3m9ymf4TFaJGaKqDfREhLKu6s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/To3m9ymf4TFaJGaKqDfREhLKu6s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Esta semana vamos a tocar un tema que hasta el momento no habíamos hecho nada, el sonido.&lt;br /&gt;&lt;br /&gt;Para ilustrar el tema tenemos código que ha mandado David. David es un crack de la programación de la nintendo DS, además de ser quien aporta más comentarios al Blog.&lt;br /&gt;&lt;br /&gt;El código es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;#include &amp;lh;PA9.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include "intro.h"&lt;br /&gt;#include "uno.h"  // Include the sound (found in the data folder in .raw format)&lt;br /&gt;#include "dos.h"&lt;br /&gt;#include "tres.h"&lt;br /&gt;#include "cuatro.h"&lt;br /&gt;&lt;br /&gt;#include "constantes.h"&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt; PA_Init();    // Initializes PA_Lib&lt;br /&gt; PA_InitVBL(); // Initializes a standard VBL&lt;br /&gt;&lt;br /&gt; PA_InitSound();&lt;br /&gt; &lt;br /&gt; PA_InitText(SCREEN_TOP, BACKGROUND_ZERO);  // Initialise the text system on the top screen&lt;br /&gt; PA_InitText(SCREEN_BOTTOM, BACKGROUND_ZERO);  // Initialise the text system on the top screen&lt;br /&gt;&lt;br /&gt; PA_OutputSimpleText(SCREEN_TOP, 0, 1, "Prueba raw,pulsa Arriba para escuchar");&lt;br /&gt; PA_OutputSimpleText(SCREEN_TOP, 0, 3, "--------------------------------");&lt;br /&gt; &lt;br /&gt; PA_WaitForVBL();&lt;br /&gt; &lt;br /&gt; s32 sonido = 1;&lt;br /&gt; while (1)&lt;br /&gt; {&lt;br /&gt;  if (Pad.Newpress.Up)&lt;br /&gt;  {&lt;br /&gt;   switch (sonido)&lt;br /&gt;   {&lt;br /&gt;    case 1:&lt;br /&gt;     PA_PlaySimpleSound(0, uno);&lt;br /&gt;     sonido ++;&lt;br /&gt;     break;&lt;br /&gt;    case 2:&lt;br /&gt;     PA_PlaySimpleSound(0, dos);&lt;br /&gt;     sonido ++;&lt;br /&gt;     break;&lt;br /&gt;    case 3:&lt;br /&gt;     PA_PlaySimpleSound(0, tres);&lt;br /&gt;     sonido ++;&lt;br /&gt;     break;&lt;br /&gt;    case 4:&lt;br /&gt;     PA_PlaySimpleSound(0, cuatro);&lt;br /&gt;     sonido = 1;&lt;br /&gt;     break;&lt;br /&gt;    default:&lt;br /&gt;     PA_PlaySimpleSound(0, intro);&lt;br /&gt;     break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  PA_OutputText(SCREEN_BOTTOM, 1, 3, "sonido %d  ", sonido);&lt;br /&gt;  &lt;br /&gt;  PA_WaitForVBL();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para realizar este proyecto se han de seguir los siguientes pasos:&lt;br /&gt;&lt;br /&gt;1. Copiar los ficheros de sonido .raw a la carpeta data&lt;br /&gt;2. realizar los includes de los sonidos&lt;br /&gt;3. constants.h se encuentra en la carpeta 'include'. Como ya nos enseñó David, en esa carpeta puedes dejar cosas comunes y el compilador va a buscarlas ahí por defecto. constants.h hace las veces de devnintendods.h en los proyectos mios.&lt;br /&gt;4. PA_InitSound(); Esta función de PALib no la habíamos usado nunca hasta ahora. Inicializa el sistema de sonido de la consola.&lt;br /&gt;5.PA_PlaySimpleSound(0, uno); Hace sonar el fichero de sonido uno, por el canal 0. Tenemos hasta 8 canales disponibles, lo que permite tener varios sonidos sonando a la vez. En este ejemplo sólo falta una música de fondo, como si fuera la melodía de un juego.&lt;br /&gt;&lt;br /&gt;El programa mantiene una variable, sonido, que va pasando de 1 a 4 para que suenen los distintos ficheros.&lt;br /&gt;&lt;br /&gt;Un código sencillo y elegante.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/devnintendods/Home/sonidos/Sonido.zip?attredirects=0"&gt;El proyecto lo dejo donde siempre&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Saludos y gracias David.&lt;br /&gt;&lt;br /&gt;P.D. En estos momentos estoy sin tiempo, y con la proximidad de semana santa quizás no consiga llegar a mi cita semanal...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-3917714330983863379?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/AMQt-R-lw0Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/3917714330983863379/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=3917714330983863379" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3917714330983863379?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3917714330983863379?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/AMQt-R-lw0Y/sonidos-en-la-nintendo-ds.html" title="Sonidos en la Nintendo DS" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/04/sonidos-en-la-nintendo-ds.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEABRXY7fCp7ImA9WxJSFUw.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-2520009116804977757</id><published>2009-03-27T00:01:00.000-07:00</published><updated>2009-05-05T01:39:14.804-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-05T01:39:14.804-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>NSMB.cpp</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8fjT3v0vkT9TyyCnmNKmJCK8OcE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8fjT3v0vkT9TyyCnmNKmJCK8OcE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8fjT3v0vkT9TyyCnmNKmJCK8OcE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8fjT3v0vkT9TyyCnmNKmJCK8OcE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Hoy vamos a ver la clase NSMB.cpp que, al fin y al cabo, es lo único programado del juego hasta la fecha. El resto es una especie de librería que con el paso del tiempo podría servir para programar todo tipo de juegos para la Nintendo DS.&lt;br /&gt;&lt;br /&gt;Lo primero, si vemos el &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb"&gt;código&lt;/a&gt;, es que apenas hay nada de PALib en el código. Sólo está el include y un par de constantes. Las clases han conseguido encapsular todo el código PALib.&lt;br /&gt;&lt;br /&gt;Veamos el código del programa:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;NSMB::NSMB() {&lt;br /&gt;    gameManager = new GameManager();&lt;br /&gt;    gameManager-&gt;SetKeypadManager(this);&lt;br /&gt;    topScreen = gameManager-&gt;GetTopScreenManager();&lt;br /&gt;    koopa = topScreen-&gt;CreateSprite(BACKGROUND_THREE, KOOPA, 16, 0, 1);&lt;br /&gt;    koopa-&gt;SetAnim(0, 15, 15);&lt;br /&gt;&lt;br /&gt;    tileSet = topScreen-&gt;CreateTileSet(BACKGROUND_TWO, PLATAFORMAS);&lt;br /&gt;    topScreen-&gt;PrintMap(MAPA_PLATAFORMAS, tileSet, x, y);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Parece poco código, veamos lo que hace:&lt;br /&gt;&lt;br /&gt;gameManager = new GameManager();: Es la clase que crea el motor del juego. Podemos decir que engloba el HelloWorld de PaLib, es decir los init y el bucle principal.&lt;br /&gt;&lt;br /&gt;gameManager-&gt;SetKeypadManager(this);: En esta línea le estamos diciendo que clase va a recibir la información de entrada del juego (el teclado y el sylus). 'this' significa que será la propia clase NSMB la que los recibirá.&lt;br /&gt;Esto es una aproximación a lo que se suele llamar programación orientada a eventos. Es decir, cuando el usuario pulse un botón de la consola, NSMB recibirá una llamada a una de las funciones que tiene que implementar. Si, por ejemplo, se pulsa el botón de A se lanzará la función NewpressA.&lt;br /&gt;Sería algo parecido a los callback, pero más orientado a objetos.&lt;br /&gt;&lt;br /&gt;topScreen = gameManager-&gt;GetTopScreenManager();: Esto es una forma de tener una variable que apunte a la pantalla superior y no tener que ir todo el rato arrastrándo gameManager-&gt;GetTopScreenManager().&lt;br /&gt;&lt;br /&gt;topScreen-&gt;CreateSprite(BACKGROUND_THREE, KOOPA, 16, 0, 1);: Ya tenemos un sprite hecho. Más fácil imposible. Los parámetros último son x, y y si lo queremos girar horizontalmente (1 = si).&lt;br /&gt;&lt;br /&gt;koopa-&gt;SetAnim(0, 15, 15);: Y ahora lo animamos, entre los frames 0 a 15 y la velocidad es de 15.&lt;br /&gt;&lt;br /&gt;tileSet = topScreen-&gt;CreateTileSet(BACKGROUND_TWO, PLATAFORMAS);: Creamos los tileset (serían los ladrillos de nuestro juego) para los fondos.&lt;br /&gt;&lt;br /&gt;topScreen-&gt;PrintMap(MAPA_PLATAFORMAS, tileSet, x, y);: Y dibujamos el fondo de la pantalla superior.&lt;br /&gt;&lt;br /&gt;Ya está...........&lt;br /&gt;&lt;br /&gt;No parece muy complicado. Si no se tiene mucha experiencia en la programación con PALib puede resultar rara la definición de KOOPA. Pues nada, con echar un ojo a la entrada que se hizo en su día explicando los &lt;a href="http://devnintendods.blogspot.com/2008/04/sprites.html"&gt;Sprites&lt;/a&gt; creo que será suficiente.&lt;br /&gt;&lt;br /&gt;Por ahora estamos trabajando con Koopa como personaje. En cuanto saque tiempo prepararé los sprites de Mario.&lt;br /&gt;&lt;br /&gt;El resto del código es:&lt;br /&gt;&lt;br /&gt;void NSMB::Run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gameManager-&gt;Run();&lt;br /&gt;}&lt;br /&gt;Se podía haber puesto en el constructor (NSMB::NSMB()) pero aquí parece que queda mejor.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;bool NSMB::HeldLeft() {&lt;br /&gt;    if (movimiento != MOVIMIENTO_IZQUIERDA) {&lt;br /&gt;        koopa-&gt;Hflip(0);&lt;br /&gt;        movimiento = MOVIMIENTO_IZQUIERDA;&lt;br /&gt;        koopa-&gt;StartAnim();&lt;br /&gt;    } else {&lt;br /&gt;        koopa-&gt;RestartAnim();&lt;br /&gt;    }&lt;br /&gt;    velocidad--;&lt;br /&gt;    if (velocidad == 0){&lt;br /&gt;        velocidad = MOVIMIENTO_VELOCIDAD;&lt;br /&gt;        x--;&lt;br /&gt;    }&lt;br /&gt;    return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Cuando el jugador pulse en el botón de flecha izquierda se ejecutará este código, que ahora mismo únicamente, anima a nuestra tortuga. Usa la variable 'movimiento' para hacerlo una animación más fluida, y girar a nuestro héroe cuando sea necesario. Falta el tema de las colisiones.&lt;br /&gt;Con más detalle: si la tortuga estaba con otra orientación (if (movimiento != MOVIMIENTO_IZQUIERDA)) no hace falta girarlo (Hflip(0) = lo desgiramos - el sprite original mira a la izquierda) y empezamos la animación. Si ya estábamos mirando a la izquierda, únicamente, continuamos con la animación (RestartAnim). El resto del código es para ir poco a poco (lo intentaremos mejorar llamando a una función, que también la llamará HeldRight, que será la encargada de mover a nuestro héroe y mirar las colisiones).&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;bool NSMB::HeldRight() {&lt;br /&gt;    if (movimiento != MOVIMIENTO_DERECHA) {&lt;br /&gt;        koopa-&gt;Hflip(1);&lt;br /&gt;        movimiento = MOVIMIENTO_DERECHA;&lt;br /&gt;        koopa-&gt;StartAnim();&lt;br /&gt;    } else {&lt;br /&gt;        koopa-&gt;RestartAnim();&lt;br /&gt;    }&lt;br /&gt;    velocidad--;&lt;br /&gt;    if (velocidad == 0){&lt;br /&gt;        velocidad = MOVIMIENTO_VELOCIDAD;&lt;br /&gt;        x++;&lt;br /&gt;    }&lt;br /&gt;    return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Igual que el anterior pero para ir a la derecha.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;bool NSMB::NoKey() {&lt;br /&gt;    koopa-&amp;gt;PauseAnim();&lt;br /&gt;    return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si no se ha pulsado ninguna tecla se ejecutará esta función. Nosotros la usaremos para parar la animación de nuestro héroe.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;bool NSMB::BeforeVBL() {&lt;br /&gt;    topScreen-&amp;gt;PrintMap(MAPA_PLATAFORMAS, tileSet, x, y);&lt;br /&gt;    return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esto se ejecutará siempre, una vez por cada vuelta del bucle, después de tratar el teclado (incluida la función de que no se ha pulsado ninguna tecla).&lt;br /&gt;&lt;br /&gt;Y esto es todo, por ahora. La primera versión de GameManager ha sido publicada, esperemos que no sea la última.&lt;br /&gt;&lt;br /&gt;Y ¿cómo usarlo? Es decir, ¿cómo llamar a NSMB?&lt;br /&gt;&lt;br /&gt;Vemos el código de main.cpp:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;#include "NSMB.h"&lt;br /&gt;&lt;br /&gt;int main(int argc, char ** argv) {&lt;br /&gt;    NSMB *nsmb = new NSMB();&lt;br /&gt;    nsmb-&amp;gt;Run();&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Uhmmm, no sé que se puede explicar. Se crea un objeto de tipo NSMB y ejecutamos un 'run'.&lt;br /&gt;&lt;br /&gt;Nos vemos en los comentarios.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-2520009116804977757?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/BxX55f9hgjk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/2520009116804977757/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=2520009116804977757" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/2520009116804977757?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/2520009116804977757?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/BxX55f9hgjk/nsmbcpp.html" title="NSMB.cpp" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/03/nsmbcpp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4FR34-cSp7ImA9WxJSFUw.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-5715696256499812259</id><published>2009-03-20T00:00:00.000-07:00</published><updated>2009-05-05T01:41:56.059-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-05T01:41:56.059-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="tetris" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Nueva versión del Tetris</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HUSdP1t_2hO6MxA4DuTeD2q5Tuc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HUSdP1t_2hO6MxA4DuTeD2q5Tuc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HUSdP1t_2hO6MxA4DuTeD2q5Tuc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HUSdP1t_2hO6MxA4DuTeD2q5Tuc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Hacemos un paréntesis en la programación del NSMB y vamos a presentar la última versión del Tetris.&lt;br /&gt;&lt;br /&gt;Se ha creado un menú en la pantalla táctil, por lo que usaremos el stylus por primera vez en este blog. La imagen es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0_Lj8wUYfQM/Sb3_xn6pMOI/AAAAAAAAAK4/eACia0Tm4go/s1600-h/menu.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 256px; height: 192px;" src="http://3.bp.blogspot.com/_0_Lj8wUYfQM/Sb3_xn6pMOI/AAAAAAAAAK4/eACia0Tm4go/s320/menu.png" alt="" id="BLOGGER_PHOTO_ID_5313684363360678114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Posibilita la selección de tres tipos de juegos.&lt;br /&gt;&lt;br /&gt;PALib controla cuando se pulsa en la pantalla táctil y devuelve las coordenadas (x, y) donde se ha pulsado.&lt;br /&gt;&lt;br /&gt;if (Stylus.Held) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tipo_juego = obtener_tipo_juego(Stylus.X, Stylus.Y);&lt;br /&gt;&lt;br /&gt;El Stylus.Held indica que se está pulsando en la pantalla y las coordenadas quedan en Stylus.X y en Stylus.Y. Ahora para saber si se ha pulsado un botón u otro se ha creado esta función:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;u8 obtener_tipo_juego(s32 xStylus, s32 yStylus) {&lt;br /&gt;    if (pulsado_boton_con_stylus(xStylus, yStylus, 60, 37, 205, 79)) {&lt;br /&gt;        return JUEGO_MARATON;&lt;br /&gt;    } else if (pulsado_boton_con_stylus(xStylus, yStylus, 74, 83, 224, 125)) {&lt;br /&gt;        return JUEGO_EXPERTO;&lt;br /&gt;    } else if (pulsado_boton_con_stylus(xStylus, yStylus, 61, 133, 226, 170)) {&lt;br /&gt;        return JUEGO_SUPER_BLOQUES;&lt;br /&gt;    } else {&lt;br /&gt;        return 0;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool pulsado_boton_con_stylus(s32 xStylus, s32 yStylus, s32 x1, s32 y1, s32 x2, s32 y2) {&lt;br /&gt;    return (xStylus &amp;gt; x1 &amp;&amp; xStylus &amp;lt;&amp;gt; y1 &amp;&amp; yStylus &amp;lt; y2);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta última función es la que uso en todos los proyectos. Sirve para saber si un punto (x, y) esta dentro de un rectángulo (x1, y1) - (x2, y2).&lt;br /&gt;Los rectángulos los sacamos de la imagen, y aunque los botones estén un poco torcidos más o menos he trazado unos rectángulos y son esas coordenadas las que he usado:    &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0_Lj8wUYfQM/Sb4D6qOo7yI/AAAAAAAAALA/aWB9OKtTQ1E/s1600-h/Dibujo.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 184px; height: 156px;" src="http://3.bp.blogspot.com/_0_Lj8wUYfQM/Sb4D6qOo7yI/AAAAAAAAALA/aWB9OKtTQ1E/s320/Dibujo.JPG" alt="" id="BLOGGER_PHOTO_ID_5313688916646752034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El modo superbloques muestra fichas de distintas formas, posibilidad que nos da el haber creado las fichas como matrices de 4x4. Y tanto este modo como el experto van incrementando las velocidad a medida que se consigue aumentar la puntuación.&lt;br /&gt;&lt;br /&gt;Veamos la función actualizar_puntuacion: &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;if (tipo_juego == JUEGO_EXPERTO || tipo_juego == JUEGO_SUPER_BLOQUES) {&lt;br /&gt;    if (nivel != puntos / 100) {&lt;br /&gt;        nivel = puntos / 100; velocidad -= nivel;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Cada cien puntos aumentamos la velocidad (o disminuimos el tiempo de espera).&lt;br /&gt;&lt;br /&gt;Os dejo todo el código en el lugar &lt;a href="http://sites.google.com/site/devnintendods/Home/tetris"&gt;habitual&lt;/a&gt; para que echéis un vistazo. Como siempre nos vemos en los comentarios.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-5715696256499812259?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/Rh_N35JgSBw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/5715696256499812259/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=5715696256499812259" title="6 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/5715696256499812259?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/5715696256499812259?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/Rh_N35JgSBw/nueva-version-del-tetris.html" title="Nueva versión del Tetris" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_0_Lj8wUYfQM/Sb3_xn6pMOI/AAAAAAAAAK4/eACia0Tm4go/s72-c/menu.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/03/nueva-version-del-tetris.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DRngzcCp7ImA9WxJSFEk.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-3814564484566704909</id><published>2009-03-14T02:59:00.000-07:00</published><updated>2009-05-04T07:06:17.688-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T07:06:17.688-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Clases básicas: TileSet</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/k3HWApLftRP0rlo3kJ21zaMxDYo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k3HWApLftRP0rlo3kJ21zaMxDYo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/k3HWApLftRP0rlo3kJ21zaMxDYo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/k3HWApLftRP0rlo3kJ21zaMxDYo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;TileSet es una clase que nos permite trabajar con los tiles. Los tiles son esas pequeñas imágenes, de 8x8 pixeles, que sirven para dibujar en las pantallas de la nintendo DS.&lt;br /&gt;&lt;br /&gt;Para explicarlo mejor, las pantalla de la DS tienen 256x192 pixeles. Dividido entre 8 nos da 32x24 casillas. Es decir, cada pantalla tienen 32x24 casillas, y en cada casilla se puede dibujar un tile.&lt;br /&gt;&lt;br /&gt;PaLib nos permite trabajar con estos tiles de una forma muy sencilla, pero la clase TileSet nos permite aún una mayor abstracción. Sólo contiene, por ahora, tres funciones.&lt;br /&gt;&lt;br /&gt;El constructor de la clase nos permite cargar en memoria la imagen con todos los tiles de nuestro juego.&lt;br /&gt;&lt;br /&gt;La función SetTile16x16 nos permitirá dibujar en una ubicación dada un tile.&lt;br /&gt;&lt;br /&gt;La función GetTile nos permite ver que tile hay en una ubicación dada. Esto nos servirá para el tema de colisiones.&lt;br /&gt;&lt;br /&gt;Esta es la imagen que usamos, en este momento, en el proyecto:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Sa-yYHHqKgI/AAAAAAAAAKw/sruCz7V9tEI/s1600-h/plataformas.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 32px;" src="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Sa-yYHHqKgI/AAAAAAAAAKw/sruCz7V9tEI/s320/plataformas.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5309658612990880258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Si os fijáis bien el primer rectángulo es rosa, eso significa que el 0 será un recuadro transparente.&lt;br /&gt;&lt;br /&gt;Un ejemplo de uso:&lt;br /&gt;&lt;br /&gt;#define PLATAFORMAS (void *)plataformas_Pal, (void *)plataformas_Tiles, SIZEOF_16BIT(plataformas_Tiles), (void *)plataformas_Map&lt;br /&gt;&lt;br /&gt;#define COLUMNAS_16x16_PANTALLA 16&lt;br /&gt;#define COLUMNAS_16x16_MAPA 48&lt;br /&gt;#define FILAS_16x16 12&lt;br /&gt;#define MAPA_PLATAFORMAS (void *)mapa, COLUMNAS_16x16_PANTALLA, FILAS_16x16, COLUMNAS_16x16_MAPA&lt;br /&gt;&lt;br /&gt;int mapa[COLUMNAS_16x16_MAPA * FILAS_16x16] = {&lt;br /&gt;  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  1,  5,  2,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  7, 12,  8, 11, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  7,  8, 13, 12, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  1,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  7, 12,  8, 11, 14,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  6,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  7, 11, 12, 13, 14,  0,  0,  0,  0,  0,  0,  7,  9,  8, 10, 14,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  7, 12, 13,  8, 14,  0,  0,  0,  0,  0,  0,  7, 12, 10, 13, 14, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  7, 13,  9, 10, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  1,  3,  2,  6,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  7, 12,  8, 12, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,&lt;br /&gt;  7,  8, 12, 13, 15,  4,  3,  3,  4,  2,  3,  4,  2,  5,  4,  4,   3,  5,  2,  3,  5,  4,  3,  3,  4,  2,  3,  4,  2,  5,  4,  2,   3,  5,  2,  3,  5,  4,  3,  3,  4,  2,  3,  4,  2,  5,  4,  6,&lt;br /&gt;  7, 11, 13, 12,  8, 10,  9, 11, 12, 11,  8, 12, 12, 13, 12,  8,  10,  9, 11, 12, 11,  8, 12,  9, 11, 12, 11,  8, 12,  9, 13, 12,   8, 10,  9, 11,  8, 12, 12, 13, 12, 10, 12, 11,  8, 12,  9, 14&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;TileSet *newTileSet = new TileSet(SCREEN_TOP, BACKGROUND_TWO, PLATAFORMAS);&lt;br /&gt;newTileSet-&gt;SetTile16x16(MAPA_PLATAFORMAS, 10, 10);&lt;br /&gt;&lt;br /&gt;Es muy sencillo. Me gusta usar los defines, porque el código queda mucho más claro, desaparecen * y (void *) y queda todo más cómodo.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-3814564484566704909?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/VhGRPCQ2Lmo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/3814564484566704909/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=3814564484566704909" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3814564484566704909?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3814564484566704909?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/VhGRPCQ2Lmo/clases-basicas-tileset.html" title="Clases básicas: TileSet" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_0_Lj8wUYfQM/Sa-yYHHqKgI/AAAAAAAAAKw/sruCz7V9tEI/s72-c/plataformas.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/03/clases-basicas-tileset.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEFSXs8eSp7ImA9WxJREE8.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-3218091888346820005</id><published>2009-03-06T01:33:00.000-08:00</published><updated>2009-05-10T23:33:38.571-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-10T23:33:38.571-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Clases básicas - Sprite</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/72xWGHcJYOEEwKUwSOBDdL5Sn1w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/72xWGHcJYOEEwKUwSOBDdL5Sn1w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/72xWGHcJYOEEwKUwSOBDdL5Sn1w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/72xWGHcJYOEEwKUwSOBDdL5Sn1w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;En nuestro NSMB vamos a empezar a definir una serie de clases que se encargarán, cada una de ellas, de un apartado propio del juego.&lt;br /&gt;&lt;p style="border: 1px green dotted;"&gt;NOTA:&lt;br /&gt;Aquí vamos a explicar como se han construido estas clases y como funcionan. Si no te interesa o tu nivel de programación aún no ha llegado a esto, podrías saltarte la explicación y únicamente aprender a usarlas.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Incluso podemos diferenciar la lógica del juego del apartado gráfico (las propias librerías PALib) por lo que sería más fácil pasar el juego a otro sistema. Vamos a presentar en este post la clase Sprite (vimos una primera versión en el post anterior).&lt;br /&gt;&lt;br /&gt;Esta clase será la encargada de cargar y mostrar los personajes o los objetos con los que interactuaremos en nuestros juegos. Podremos animar los Sprites, rotarlos, moverlos, etc.&lt;br /&gt;&lt;br /&gt;En C++ las clases se componen de dos ficheros, el .h y el .cpp.&lt;br /&gt;En el .h se almacena la definición de la clase, su nombre, las funciones públicas, las privadas y las variables miembro.&lt;br /&gt;En el .cpp está el código, la implementación de la propia clase.&lt;br /&gt;&lt;br /&gt;Sprite.h&lt;br /&gt;&lt;style&gt;.pclave {color: cyan;} .string {color: #FF3300;}&lt;/style&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;#ifndef&amp;nbsp;SPRITE_H&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;SPRITE_H&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;class&amp;nbsp;&lt;/span&gt;Sprite&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;index_sprites;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;index_sprites_pals;&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_index_sprite;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_index_pal;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_screen;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_background;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_size;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_firstframe;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_lastframe;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_speed;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;m_y;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sprite(unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;screen,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;background,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;size,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y);&lt;br /&gt;&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sprite(unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;screen,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;background,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;shape,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;size,&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;*palette,&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;*sprite,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;hflip&amp;nbsp;=&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;~Sprite();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;GetIndexSprite();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;GetScreen();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sprite&amp;nbsp;*Clone();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sprite&amp;nbsp;*Clone(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;SetAnim(unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;firstframe,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;lastframe,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;speed);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;StartAnim(unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;firstframe,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;lastframe,&amp;nbsp;unsigned&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;speed);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;StartAnim();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;StopAnim();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;RestartAnim();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;PauseAnim();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;Hflip(bool&amp;nbsp;hflip);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;SetX(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;SetY(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;SetXY(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;GetX();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;GetY();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;MoveRight(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;offset);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;MoveLeft(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;offset);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;MoveUp(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;offset);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;MoveDown(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;offset);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;#endif&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Las variables miembro son las que definen el estado de un objeto. En nuestro caso son las variables que tienen como prefijo una m_ :&lt;br /&gt;m_index_sprite, m_index_pal, m_screen, m_background, m_firstframe, m_lastframe, m_speed, m_x, m_y.&lt;br /&gt;&lt;br /&gt;Las variables miembro son las que almacenan el estado, es decir son las que diferencian un objeto de otro. Veamos cada una que hace:&lt;br /&gt;&lt;br /&gt;m_index_sprite, m_index_pal quedan ocultas a la programación. Son valores necesarios para PALib. Si os fijaís existen unas variables (index_sprites, index_sprites_pals) que son estáticas, es decir son únicas para todos los objetos, y son las encargadas de crear los índices para cada Sprite y cada Paleta). (&lt;a href="http://devnintendods.blogspot.com/2008/04/sprites.html"&gt;En el primer tutorial&lt;/a&gt; son los valores HEROE_PALLETE y HEROE_SPRITE, gracias a la POO nos olvidamos de ellas)&lt;br /&gt;&lt;br /&gt;Como siempre es más difícil explicarlo que verlo o hacerlo.&lt;br /&gt;&lt;br /&gt;El resto de variables miembro nos indican a que pantalla pertenece el Sprite y dentro de cada pantalla a que fondo, m_screen y m_background.&lt;br /&gt;&lt;br /&gt;m_firstFrame y m_lastFrame, sirven para realizar la animación. m_speed nos indica la velocidad de la misma.&lt;br /&gt;&lt;br /&gt;m_x y m_y almacenan las coordenadas del sprite.&lt;br /&gt;&lt;br /&gt;El resto del fichero .h son las declaraciones de las funciones. Tenemos un constructor, con el último campo puesto = 0. Esto significa que se puede no usar y por defecto es cero. Es decir al crear el sprite lo podemos rotar horizontalmente si ponemos un 1 en ese campo, si no queremos rotarlo,no ponemos nada.&lt;br /&gt;&lt;br /&gt;El resto son una serie de funciones que su nombre ya las explica.&lt;br /&gt;&lt;br /&gt;Ahora veamos como usarlo:&lt;br /&gt;&lt;br /&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;br /&gt;#define COIN OBJ_SIZE_16X16, (void*)coin_Pal, (void*)coin_Sprite&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sprite&amp;nbsp;coin_i(BACKGROUND_THREE,&amp;nbsp;COIN,&amp;nbsp;96,&amp;nbsp;32);&lt;br /&gt;coin_i.StartAnim(0,&amp;nbsp;3,&amp;nbsp;5);&lt;br /&gt;Sprite&amp;nbsp;coin_ii&amp;nbsp;=&amp;nbsp;coin_i.Clone(112,&amp;nbsp;16);&lt;br /&gt;Sprite&amp;nbsp;coin_iii&amp;nbsp;=&amp;nbsp;coin_ii.Clone();&lt;br /&gt;coin_iii.MoveRight(16);&lt;br /&gt;Sprite&amp;nbsp;coin_iv&amp;nbsp;=&amp;nbsp;coin_i.Clone(144,&amp;nbsp;32);&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;No creo que necesite más explicación, si no, nos vemos en los comentarios.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En cuanto a la librería PALib, en esta clase utilizo por primera vez la función PA_SpriteAnimPause. Esta función permite parar una animación y continuarla posteriormente. Utiliza como parámetros el fondo donde está el sprite, así como su índice (para saber cual parar) y el último parámetro es un 1 para parar la animación y 0 para reanudarla. Ejemplo de uso:&lt;br /&gt;&lt;br /&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;Sprite::RestartAnim()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SpriteAnimPause(m_screen,&amp;nbsp;m_index_sprite,&amp;nbsp;0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;Sprite::PauseAnim()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SpriteAnimPause(m_screen,&amp;nbsp;m_index_sprite,&amp;nbsp;1);&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;De esta forma al pulsar poco a poco el teclado, la animación se hace continua y no parece que esté andando a la pata coja.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Otra función que se utiliza por primera vez en este tutorial es la de Clonar un Sprite, PA_CloneSprite. Como parámetros se le pasa la pantalla de la DS donde está cargado el Sprite, el índice de este para saber cual clonar y, por último, el índice del nuevo Sprite. Clonar Sprites nos ahorra espacio en memoria, ya que comparten toda la información gráfica. En nuestro caso va a ser muy util para las monedas que aparecen a lo largo de todo el juego.&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;PD: Voy a dejar todo el proyecto, tal y como está ahora, en la siguiente dirección: &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb"&gt;http://sites.google.com/site/devnintendods/Home/nsmb&lt;/a&gt;. Lo que dejo ahí es todo lo que tengo hecho hasta ahora (SuperMarioDS_0.2). Es todo el montaje que estoy haciendo. Lo iré explicando en los siguientes Post. Sólo decir que main.cpp únicamente llama a NSMB.cpp que es el que lo hace todo.&lt;br /&gt;&lt;br /&gt;Aún así, se pueden usar las clases de forma independiente en cualquier otro proyecto.&lt;br /&gt;&lt;br /&gt;Enlaces patrocinados&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-3218091888346820005?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/sOIRkMsv-Mc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/3218091888346820005/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=3218091888346820005" title="6 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3218091888346820005?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/3218091888346820005?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/sOIRkMsv-Mc/clases-basicas-sprite.html" title="Clases básicas - Sprite" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/03/clases-basicas-sprite.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DRngzcCp7ImA9WxJSFEk.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-4824765219920660356</id><published>2009-02-27T01:00:00.000-08:00</published><updated>2009-05-04T07:06:17.688-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T07:06:17.688-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSMB" /><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>New Super Mario Bros</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/N7dLW3zipIwke-tQoMcEUdwHeyQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N7dLW3zipIwke-tQoMcEUdwHeyQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/N7dLW3zipIwke-tQoMcEUdwHeyQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N7dLW3zipIwke-tQoMcEUdwHeyQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;¡Cómo programar un juego tipo New Super Mario Bros (NSMB)!&lt;br /&gt;&lt;br /&gt;Pues no es muy difícil, pero tampoco es fácil. Ante la cantidad de elementos que intervienen en el juego yo me inclinaría más por programar con orientación a objetos. Por lo que se necesita un poco más de nivel de programación del que hemos empleado hasta ahora.&lt;br /&gt;&lt;br /&gt;Pero no nos desanimemos, utilizaremos la orientación a objetos de una forma sencilla y didáctica y, seguramente, tomaremos decisiones para que resulte lo más sencillo posible.&lt;br /&gt;&lt;br /&gt;Otra cosa, en algún comentario se apunta a la posibilidad de hacer pantallas desde donde se puedan elegir opciones, y de esta forma, dejar un acabado más elegante a los juegos. El problema para mi estriba en que todo lleva tiempo y el poco de que dispongo me gusta más emplearlo en hacer el motor propio del juego. Aún así, intentaremos hacer cosas en ese sentido.&lt;br /&gt;&lt;br /&gt;Empecemos con con la Orientación a objetos.&lt;br /&gt;&lt;br /&gt;A la hora de ir a compilar un fichero .cpp (c++) PALib puede que de algún que otro error de compilación. En mi caso esta fue la pantalla del error:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0_Lj8wUYfQM/SYcEeyec0II/AAAAAAAAAKY/lSH-lfyk8e4/s1600-h/error.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 162px;" src="http://1.bp.blogspot.com/_0_Lj8wUYfQM/SYcEeyec0II/AAAAAAAAAKY/lSH-lfyk8e4/s320/error.png" alt="" id="BLOGGER_PHOTO_ID_5298208413616754818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La solución fue poner lo siguiente en el fichero PA_Sound.h:&lt;br /&gt;&lt;br /&gt;línea 212: FS_wav[PA_Channel] =&lt;span style="color: rgb(255, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;(u32*)&lt;/span&gt;PA_Malloc(FS_wav[PA_Channel], PA_FSFile[PAFS_wav_number].Length+4);&lt;br /&gt;&lt;br /&gt;línea 430: FS_mod = &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;(u32*)&lt;/span&gt;PA_Malloc(FS_mod, PA_FSFile[PAFS_mod_number].Length+4);&lt;br /&gt;&lt;br /&gt;Antes de hacer este cambio mirar si os da error al compilar c++.&lt;br /&gt;&lt;br /&gt;Y ahora ¿Qué es la orientación a objetos?&lt;br /&gt;&lt;br /&gt;Pues es una forma de describir el mundo que estamos programando. Por ejemplo, en el primer tutorial de este blog presentamos un juego muy sencillo, un sprite moviéndose por un pueblecito. En este caso sólo era necesario las coordenadas de nuestro héroe y el mapa para las colisiones. Todo esto era lo único necesario para describir nuestro mundo.&lt;br /&gt;En el Tetris las cosas se complicaban un poco más, teníamos un tablero y unas fichas que giraban. Para describir ese mundo tendríamos dos clases, la del tablero y la de ficha.&lt;br /&gt;&lt;br /&gt;Ahora tenemos el NSMB, donde todo es mucho más complejo, no sólo en cantidad, si no en la forma de interactuar entre los distintos elementos del juego, los enemigos, las plataformas, las monedas, incluso nuestro héroe, Mario, puede cambiar de tamaño, salta, etc.&lt;br /&gt;&lt;br /&gt;La orientación a objetos permite describir cada parte de nuestro mundo en un fichero aparte, teniendo todo muy bien organizado. Nos permitirá tener personajes con distinto comportamiento moviéndose por el juego. Incluso las propias plataformas serán una clase, desde donde se describirá su aspecto, así como su comportamiento.&lt;br /&gt;&lt;br /&gt;Algunas de las clases que presentaremos podrían pasar perfectamente a un proyecto que se denominase PALib++, pero eso ya es harina de otro costal.&lt;br /&gt;&lt;br /&gt;Podéis acceder a un &lt;a href="http://sites.google.com/site/devnintendods/Home/nsmb"&gt;primer proyecto&lt;/a&gt; para probar el compilador de c++. Esto el lo que se verá si ponéis en marcha el proyecto:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0_Lj8wUYfQM/SYf7VuaZSgI/AAAAAAAAAKg/cx8BAs8Cylw/s1600-h/monedas.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 182px;" src="http://1.bp.blogspot.com/_0_Lj8wUYfQM/SYf7VuaZSgI/AAAAAAAAAKg/cx8BAs8Cylw/s320/monedas.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5298479837279242754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Este código contiene una clase llamada Sprite (en sprite.h está la definición de la clase y en Sprite.cpp el código) que es la responsable de cargar un sprite en la pantalla. Es mejorable, repite paletas y se puede simplificar, aún más, su utilización, pero lo dejaremos para el siguiente post.&lt;br /&gt;&lt;br /&gt;Una de las mejoras que nos da el uso de clases es el poder simplificar el algoritmo propio del juego. Main.cpp queda más sencillo, y eso mejora la legibilidad del código. Por ejemplo, si quiero añadir un nuevo Sprite, únicamente serían dos líneas de código.&lt;br /&gt;&lt;br /&gt;&lt;style&gt;.pclave {color: cyan;} .string {color: #FF3300;}&lt;/style&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;//Con&amp;nbsp;clases&lt;br /&gt;Sprite&amp;nbsp;koopa(SCREEN_TOP,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;OBJ_SIZE_32X32,&amp;nbsp;(void*)koopa_Pal,&amp;nbsp;(void*)koopa_Sprite,&amp;nbsp;128,&amp;nbsp;140);&lt;br /&gt;koopa.rotar_horizontal();&lt;br /&gt;koopa.animar(0,&amp;nbsp;15,&amp;nbsp;15);&lt;br /&gt;&lt;br /&gt;//Sin&amp;nbsp;clases&lt;br /&gt;PA_LoadSpritePal(SCREEN_TOP,&amp;nbsp;KOOPA_PALLETE,(void*)koopa_Pal);&lt;br /&gt;PA_CreateSprite(SCREEN_TOP,&amp;nbsp;KOOPA_SPRITE,&amp;nbsp;(void*)koopa_Sprite,&amp;nbsp;OBJ_SIZE_32X32,&amp;nbsp;COLOR_MODE_256,&amp;nbsp;KOOPA_PALLETE,&amp;nbsp;128,&amp;nbsp;140);&lt;br /&gt;PA_SetSpritePrio(SCREEN_TOP,&amp;nbsp;KOOPA_SPRITE,&amp;nbsp;BACKGROUND_THREE);&lt;br /&gt;PA_SetSpriteHflip(SCREEN_TOP,&amp;nbsp;KOOPA_SPRITE,&amp;nbsp;1);&lt;br /&gt;PA_StartSpriteAnim(SCREEN_TOP,&amp;nbsp;KOOPA_SPRITE,&amp;nbsp;0,&amp;nbsp;15,&amp;nbsp;15);&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;En las siguientes entregas iremos mejorando la clase Sprite. Estoy pensando en hacerla en Inglés para que se pueda distinguir bien del algoritmo del juego.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-4824765219920660356?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/H1LXMl1c17w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/4824765219920660356/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=4824765219920660356" title="5 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4824765219920660356?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4824765219920660356?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/H1LXMl1c17w/new-super-mario-bros.html" title="New Super Mario Bros" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_0_Lj8wUYfQM/SYcEeyec0II/AAAAAAAAAKY/lSH-lfyk8e4/s72-c/error.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/02/new-super-mario-bros.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DRngzcSp7ImA9WxJSFEk.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-4932233826388136565</id><published>2009-02-20T01:00:00.000-08:00</published><updated>2009-05-04T07:06:17.689-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T07:06:17.689-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="tetris" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>La ficha siguiente</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0mhMtbhycr0ssFnDUCSj6MmbeA8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0mhMtbhycr0ssFnDUCSj6MmbeA8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0mhMtbhycr0ssFnDUCSj6MmbeA8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0mhMtbhycr0ssFnDUCSj6MmbeA8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Para poder mostrar la siguiente ficha que va a salir tendremos que tener dos variables 'ficha' y 'ficha_siguiente'.&lt;br /&gt;&lt;br /&gt;Modificaremos la función 'obtener_ficha' para que en vez de asignar a la variable 'ficha' la ficha buscada de forma aleatoria, se le asigne a la variable 'ficha_siguiente'. La función 'obtener_ficha' quedará de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;style&gt;.pclave {color: cyan;} .string {color: #FF3300;}&lt;/style&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;obtener_ficha()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;tipo&amp;nbsp;=&amp;nbsp;PA_RandMax(6);&amp;nbsp;//0..6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color&amp;nbsp;=&amp;nbsp;PA_RandMinMax(2,&amp;nbsp;7);&amp;nbsp;//2..7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.y&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.x&amp;nbsp;=&amp;nbsp;TABLERO_ANCHO&amp;nbsp;/&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;copiar_ficha_siguiente();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;crear_ficha_t(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;crear_ficha_l(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;2)&amp;nbsp;crear_ficha_o(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;3)&amp;nbsp;crear_ficha_z(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;4)&amp;nbsp;crear_ficha_s(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;5)&amp;nbsp;crear_ficha_j(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;crear_ficha_i(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dibujar_ficha_siguiente();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;existe_colision(ficha.x,&amp;nbsp;ficha.y);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;copiar_ficha_siguiente()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.radio&amp;nbsp;=&amp;nbsp;ficha_siguiente.radio;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ALTO;&amp;nbsp;j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[i][j]&amp;nbsp;=&amp;nbsp;ficha_siguiente.ficha[i][j];&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Con esto ya dejamos más o menos el juego terminado. En está &lt;a href="http://sites.google.com/site/devnintendods/Home/tetris" target="_blank"&gt;página &lt;/a&gt;está disponible el código completo del proyecto.&lt;br /&gt;&lt;br /&gt;Hay un tema en cuanto a la forma de programar.&lt;br /&gt;&lt;br /&gt;En los dos juegos que hemos programado hasta la fecha, hemos utilizado una serie de variables globales y funciones que trabajan sobre ellas, siendo esto válido para juegos sencillos pero no tanto para juegos más complicados.&lt;br /&gt;&lt;br /&gt;Conceptos como el ámbito de las variables han de ser considerados a la hora de realizar este tipo de programas. Por ejemplo, la función obtener_ficha, así como las de rotar deberían de trabajar sobre un parámetro ficha, y no sobre las variables globales. Esto dejaría el código más limpio y daría mayor flexibilidad si se quisieran introducir más funcionalidades.&lt;br /&gt;&lt;br /&gt;Por ahora lo dejaremos así, pero si queremos hacer el New Super Mario Bros, deberemos empezar a hacer las cosas más limpias.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-4932233826388136565?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/W0sWS4GbBRE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/4932233826388136565/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=4932233826388136565" title="9 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4932233826388136565?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4932233826388136565?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/W0sWS4GbBRE/la-ficha-siguiente.html" title="La ficha siguiente" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/02/la-ficha-siguiente.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DRngzcSp7ImA9WxJSFEk.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-2853577392807628564</id><published>2009-02-13T01:00:00.000-08:00</published><updated>2009-05-04T07:06:17.689-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T07:06:17.689-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="tetris" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Volcar las fichas al tablero</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_ESco-9nVzJnbCrdF_OdOoOE-GU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_ESco-9nVzJnbCrdF_OdOoOE-GU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_ESco-9nVzJnbCrdF_OdOoOE-GU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_ESco-9nVzJnbCrdF_OdOoOE-GU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;En este post vamos a dar forma completamente al motor del juego. Lo que nos queda es pasar las fichas al tablero cuando estas colisiones. Una vez hecho esto mirar si se ha hecho una línea y posteriormente quitarla.&lt;br /&gt;&lt;br /&gt;Así que manos a la obra.&lt;br /&gt;&lt;br /&gt;Para pasar las fichas al tablero necesitaremos esta función:&lt;br /&gt;&lt;style&gt;.pclave {color: cyan;} .string {color: #FF3300;}&lt;/style&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;copiar_ficha_a_tablero()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ALTO;&amp;nbsp;j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha.ficha[i][j]&amp;nbsp;!=&amp;nbsp;CASILLA_VACIA)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tablero[ficha.x&amp;nbsp;+&amp;nbsp;i][ficha.y&amp;nbsp;+&amp;nbsp;j]&amp;nbsp;=&amp;nbsp;ficha.ficha[i][j];&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para saber si se ha hecho una o más líneas:&lt;br /&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;es_linea_completa(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;fila)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tablero[i][fila]&amp;nbsp;==&amp;nbsp;CASILLA_VACIA)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para quitar esa línea que se hallado:&lt;br /&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;quitar_linea(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;fila)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;fila;&amp;nbsp;j&amp;nbsp;&amp;gt;&amp;nbsp;0;&amp;nbsp;j--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tablero[i][j]&amp;nbsp;=&amp;nbsp;tablero[i][j&amp;nbsp;-&amp;nbsp;1];&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Por último, actualizaremos la puntuación, dependiendo del número de lineas que se hagan de una sola vez:&lt;br /&gt;&lt;br /&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;actualizar_puntuacion(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;lineas)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(lineas&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;puntos&amp;nbsp;+=&amp;nbsp;10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(lineas&amp;nbsp;==&amp;nbsp;2)&amp;nbsp;puntos&amp;nbsp;+=&amp;nbsp;30;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(lineas&amp;nbsp;==&amp;nbsp;3)&amp;nbsp;puntos&amp;nbsp;+=&amp;nbsp;60;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(lineas&amp;nbsp;==&amp;nbsp;4)&amp;nbsp;puntos&amp;nbsp;+=&amp;nbsp;100;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_OutputText(SCREEN_TOP,&amp;nbsp;25,&amp;nbsp;12,&amp;nbsp&lt;span class='string'&gt;"%d&amp;nbsp;&amp;nbsp;&amp;nbsp;"&lt;/span&gt;,&amp;nbsp;puntos);&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El último código lo podeis descargar, junto a todo el proyecto, desde esta &lt;a href="http://sites.google.com/site/devnintendods/Home/tetris" target="_blank"&gt;página&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En esta versión he puesto una pantalla de entrada, para ir decorando el juego. Se nota que no soy diseñador gráfico!!!&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-2853577392807628564?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/wZlZ_1zJuno" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/2853577392807628564/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=2853577392807628564" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/2853577392807628564?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/2853577392807628564?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/wZlZ_1zJuno/volcar-las-fichas-al-tablero.html" title="Volcar las fichas al tablero" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/02/volcar-las-fichas-al-tablero.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DRngzcSp7ImA9WxJSFEk.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-4347321574880519393</id><published>2009-02-06T01:00:00.000-08:00</published><updated>2009-05-04T07:06:17.689-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T07:06:17.689-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="tetris" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Controlar las fichas</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NYU6mv6n1YqEvFsePL7EbrNNxeE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NYU6mv6n1YqEvFsePL7EbrNNxeE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NYU6mv6n1YqEvFsePL7EbrNNxeE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NYU6mv6n1YqEvFsePL7EbrNNxeE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;El siguiente paso es crear las fichas y que empiecen a caer por el tablero. Las funciones ya las presentamos en los primeros post de este tutorial así que aquí se presentan todas las de las fichas.&lt;br /&gt;&lt;br /&gt;Hemos introducido el control el teclado, donde se puede ver la diferencia entre pulsar una tecla y tenerla pulsada.&lt;br /&gt;&lt;br /&gt;Usaremos Pad.Newpress.Right/Left para controlar que pulsen, y suelten, la tecla de ir a la derecha. Esto es para controlar el movimiento horizontal de la ficha de un modo más preciso. Sin embargo, la tecla de bajar se quiere que sea algo rápido, por lo que usaremos Pad.Held.Down (estar pulsado).&lt;br /&gt;&lt;br /&gt;Por último, merece la pena ver la función de existe_colision:&lt;br /&gt;&lt;br /&gt;&lt;style&gt;.pclave {color: cyan;} .string {color: #FF3300;}&lt;/style&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;01.&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;existe_colision(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y)&amp;nbsp;{&lt;br /&gt;02.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;03.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;04.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ALTO;&amp;nbsp;j++)&lt;br /&gt;05.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha.ficha[i][j]&amp;nbsp;!=&amp;nbsp;CASILLA_VACIA)&amp;nbsp;{&lt;br /&gt;06.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(x&amp;nbsp;+&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;07.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(x&amp;nbsp;+&amp;nbsp;i&amp;nbsp;&amp;gt;=&amp;nbsp;TABLERO_ANCHO)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;08.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(y&amp;nbsp;+&amp;nbsp;j&amp;nbsp;&amp;gt;=&amp;nbsp;TABLERO_ALTO)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;09.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tablero[x&amp;nbsp;+&amp;nbsp;i][y&amp;nbsp;+&amp;nbsp;j]&amp;nbsp;!=&amp;nbsp;CASILLA_VACIA)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;10.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;11.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;0;&amp;nbsp;//false&lt;br /&gt;12}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Se utiliza el tipo 'int' porque x puede ser negativo.&lt;br /&gt;En la línea 5 se puede ver que únicamente se mirará si alguna casilla de la ficha produce colisión si no está vacía.&lt;br /&gt;Las líneas 6, 7 y 8 miran los bordes del tablero y por fin la línea 9 es la que mira que si en el tablero hay ocupada una casilla se produzca colición.&lt;br /&gt;&lt;br /&gt;Otro tema es el de la variable ficha_timer y la constante VELOCIDAD_MINIMA. Se utilizan para que las fichas caigan a una velocidad controlada.&lt;br /&gt;&lt;br /&gt;El código:&lt;br /&gt;&lt;br /&gt;&lt;style&gt;.pclave {color: cyan;} .string {color: #FF3300;}&lt;/style&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;#include&lt;/span&gt;&amp;nbsp;&amp;lt;PA9.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"gfx/all_gfx.h"&lt;/span&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"gfx/all_gfx.c"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"devnintendods.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;TABLERO_ANCHO&amp;nbsp;10&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;TABLERO_ALTO&amp;nbsp;21&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;FICHA_ANCHO&amp;nbsp;4&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;FICHA_ALTO&amp;nbsp;4&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;CASILLA_VACIA&amp;nbsp;1&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;CASILLA_ROJA&amp;nbsp;2&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;CASILLA_AZUL&amp;nbsp;3&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;CASILLA_VERDE&amp;nbsp;4&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;VELOCIDAD_MINIMA&amp;nbsp;25&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;BORDE_IZQUIERDO&amp;nbsp;1&lt;br /&gt;&lt;br /&gt;//La&amp;nbsp;fila&amp;nbsp;0&amp;nbsp;es&amp;nbsp;la&amp;nbsp;de&amp;nbsp;más&amp;nbsp;arriba&amp;nbsp;y&amp;nbsp;la&amp;nbsp;16&amp;nbsp;la&amp;nbsp;de&amp;nbsp;la&amp;nbsp;base.&amp;nbsp;La&amp;nbsp;columna&amp;nbsp;0&amp;nbsp;es&amp;nbsp;la&amp;nbsp;de&amp;nbsp;la&amp;nbsp;izquierda.&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;tablero[TABLERO_ANCHO][TABLERO_ALTO];&amp;nbsp;&lt;br /&gt;&lt;br /&gt;typedef&amp;nbsp;struct&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;radio;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha[FICHA_ANCHO][FICHA_ALTO];&lt;br /&gt;}&amp;nbsp;tipo_ficha;&lt;br /&gt;&lt;br /&gt;tipo_ficha&amp;nbsp;ficha;&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha_timer&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;inicializar_tablero();&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_tablero();&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_casilla(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y,&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha);&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_ficha();&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;existe_colision(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y);&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;obtener_ficha();&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_t(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color);&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_l(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color);&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_o(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color);&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_z(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color);&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_i(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color);&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_s(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color);&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_j(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color);&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;girar_ficha_derecha();&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;girar_ficha_izquierda();&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;&lt;span class='pclave'&gt;main&lt;/span&gt;(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;argc,&amp;nbsp;&lt;span class='pclave'&gt;char&amp;nbsp;&lt;/span&gt;**&amp;nbsp;argv)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_Init();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_InitVBL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_InitText(SCREEN_TOP,&amp;nbsp;BACKGROUND_TWO);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_DualLoadBgPal(BACKGROUND_THREE,&amp;nbsp;(&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;*)tiles_Pal);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_DualLoadSimpleBg(BACKGROUND_THREE,&amp;nbsp;tiles_Tiles,&amp;nbsp;Blank,&amp;nbsp;BG_256X256,&amp;nbsp;0,&amp;nbsp;1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_EasyBgScrollXY(SCREEN_BOTTOM,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;0,&amp;nbsp;0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_EasyBgLoad(SCREEN_TOP,&amp;nbsp;BACKGROUND_ONE,&amp;nbsp;fondo_top);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_EasyBgLoad(SCREEN_BOTTOM,&amp;nbsp;BACKGROUND_ONE,&amp;nbsp;fondo_bottom);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inicializar_tablero();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dibujar_tablero();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obtener_ficha();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;while&amp;nbsp;&lt;/span&gt;&amp;nbsp;(1)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(Pad.Newpress.Left)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(!existe_colision(ficha.x&amp;nbsp;-&amp;nbsp;1,&amp;nbsp;ficha.y))&amp;nbsp;ficha.x--;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(Pad.Newpress.Right)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(!existe_colision(ficha.x&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;ficha.y))&amp;nbsp;ficha.x++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(Pad.Held.Down)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(!existe_colision(ficha.x,&amp;nbsp;ficha.y&amp;nbsp;+&amp;nbsp;1))&amp;nbsp;ficha.y++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(Pad.Newpress.Y)&amp;nbsp;{//girar&amp;nbsp;izquierda&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;girar_ficha_izquierda();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(existe_colision(ficha.x,&amp;nbsp;ficha.y))&amp;nbsp;girar_ficha_derecha();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(Pad.Newpress.A)&amp;nbsp;{//girar&amp;nbsp;derecha&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;girar_ficha_derecha();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(existe_colision(ficha.x,&amp;nbsp;ficha.y))&amp;nbsp;girar_ficha_izquierda();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha_timer++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha_timer&amp;nbsp;&amp;gt;&amp;nbsp;VELOCIDAD_MINIMA)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha_timer&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(!existe_colision(ficha.x,&amp;nbsp;ficha.y&amp;nbsp;+&amp;nbsp;1))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.y++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obtener_ficha();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dibujar_tablero();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dibujar_ficha();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_WaitForVBL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;inicializar_tablero()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ALTO;&amp;nbsp;j++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tablero[i][j]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_tablero()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ALTO;&amp;nbsp;j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dibujar_casilla(i,&amp;nbsp;j,&amp;nbsp;tablero[i][j]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_casilla(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y,&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;x1&amp;nbsp;=&amp;nbsp;x&amp;nbsp;*&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;y1&amp;nbsp;=&amp;nbsp;y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;screen&amp;nbsp;=&amp;nbsp;SCREEN_TOP;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(y1&amp;nbsp;&amp;gt;=&amp;nbsp;12)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;screen&amp;nbsp;=&amp;nbsp;SCREEN_BOTTOM;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1&amp;nbsp;=&amp;nbsp;y1&amp;nbsp;-&amp;nbsp;12;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1&amp;nbsp;=&amp;nbsp;y1&amp;nbsp;*&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x1&amp;nbsp;+=&amp;nbsp;BORDE_IZQUIERDO;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SetMapTileEx(screen,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;x1,&amp;nbsp;y1,&amp;nbsp;ficha,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SetMapTileEx(screen,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;x1,&amp;nbsp;y1&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;ficha,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SetMapTileEx(screen,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;x1&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;y1,&amp;nbsp;ficha,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SetMapTileEx(screen,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;x1&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;y1&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;ficha,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_ficha()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ALTO;&amp;nbsp;j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha.ficha[i][j]&amp;nbsp;!=&amp;nbsp;CASILLA_VACIA)&amp;nbsp;dibujar_casilla(ficha.x&amp;nbsp;+&amp;nbsp;i,&amp;nbsp;ficha.y&amp;nbsp;+&amp;nbsp;j,&amp;nbsp;ficha.ficha[i][j]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;existe_colision(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ALTO;&amp;nbsp;j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha.ficha[i][j]&amp;nbsp;!=&amp;nbsp;CASILLA_VACIA)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(x&amp;nbsp;+&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(x&amp;nbsp;+&amp;nbsp;i&amp;nbsp;&amp;gt;=&amp;nbsp;TABLERO_ANCHO)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(y&amp;nbsp;+&amp;nbsp;j&amp;nbsp;&amp;gt;=&amp;nbsp;TABLERO_ALTO)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tablero[x&amp;nbsp;+&amp;nbsp;i][y&amp;nbsp;+&amp;nbsp;j]&amp;nbsp;!=&amp;nbsp;CASILLA_VACIA)&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;0;&amp;nbsp;//false&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;obtener_ficha()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;tipo&amp;nbsp;=&amp;nbsp;PA_RandMax(6);&amp;nbsp;//0..6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color&amp;nbsp;=&amp;nbsp;PA_RandMinMax(2,&amp;nbsp;7);&amp;nbsp;//2..7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.y&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.x&amp;nbsp;=&amp;nbsp;TABLERO_ANCHO&amp;nbsp;/&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;crear_ficha_t(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;crear_ficha_l(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;2)&amp;nbsp;crear_ficha_o(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;3)&amp;nbsp;crear_ficha_z(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;4)&amp;nbsp;crear_ficha_s(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(tipo&amp;nbsp;==&amp;nbsp;5)&amp;nbsp;crear_ficha_j(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;crear_ficha_i(color);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;existe_colision(ficha.x,&amp;nbsp;ficha.y);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_t(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.radio&amp;nbsp;=&amp;nbsp;3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_l(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.radio&amp;nbsp;=&amp;nbsp;3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_j(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.radio&amp;nbsp;=&amp;nbsp;3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_o(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.radio&amp;nbsp;=&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_z(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.radio&amp;nbsp;=&amp;nbsp;3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_s(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.radio&amp;nbsp;=&amp;nbsp;3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;crear_ficha_i(&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;color)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.radio&amp;nbsp;=&amp;nbsp;4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;color;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;girar_ficha_derecha()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;nueva_ficha[FICHA_ANCHO][FICHA_ALTO];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ALTO;&amp;nbsp;j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nueva_ficha[i][j]&amp;nbsp;=&amp;nbsp;ficha.ficha[i][j];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha.radio&amp;nbsp;==&amp;nbsp;3)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha.radio&amp;nbsp;==&amp;nbsp;4)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;nueva_ficha[3][3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;nueva_ficha[3][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;nueva_ficha[3][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;nueva_ficha[3][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;girar_ficha_izquierda()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;nueva_ficha[FICHA_ANCHO][FICHA_ALTO];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;FICHA_ALTO;&amp;nbsp;j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nueva_ficha[i][j]&amp;nbsp;=&amp;nbsp;ficha.ficha[i][j];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha.radio&amp;nbsp;==&amp;nbsp;3)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span class='pclave'&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(ficha.radio&amp;nbsp;==&amp;nbsp;4)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[3][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[3][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[3][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][0]&amp;nbsp;=&amp;nbsp;nueva_ficha[3][3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][1]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[2][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][2]&amp;nbsp;=&amp;nbsp;nueva_ficha[1][3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[0][3]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[1][3]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[2][3]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ficha.ficha[3][3]&amp;nbsp;=&amp;nbsp;nueva_ficha[0][3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;En el próximo post hablaremos de como manejar el tablero.&lt;br /&gt;&lt;br /&gt;Saludos&lt;br /&gt;&lt;br /&gt;P.D.: Supongo que os estáis dando cuenta que el código se está haciendo muy grande. En el próximo post publicaremos un zip con todo el proyecto.&lt;br /&gt;&lt;br /&gt;Enlaces patrocinados:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-4347321574880519393?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/13QW35mwT4M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/4347321574880519393/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=4347321574880519393" title="5 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4347321574880519393?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/4347321574880519393?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/13QW35mwT4M/controlar-las-fichas.html" title="Controlar las fichas" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/01/controlar-las-fichas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DRngyeCp7ImA9WxJSFEk.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-8689101725643213507</id><published>2009-01-28T23:28:00.000-08:00</published><updated>2009-05-04T07:06:17.690-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T07:06:17.690-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="tetris" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Los tiles y cómo dibujar el Tablero</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZNaToHaFA7zPU6ws3k8EFZwOeXw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZNaToHaFA7zPU6ws3k8EFZwOeXw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZNaToHaFA7zPU6ws3k8EFZwOeXw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZNaToHaFA7zPU6ws3k8EFZwOeXw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Por fin vamos a ver una nueva técnica que nos ofrece las librerías PALib.&lt;br /&gt;&lt;br /&gt;A la hora de programar juegos de tablero, o a la hora de dibujar nuestros mundos, no es necesario cargar unos fondos enormes. PALib ofrece la posibilidad de poder dibujar tiles.&lt;br /&gt;&lt;br /&gt;Los tiles son pequeñas casillas que se pueden dibujar en la pantalla tantas veces como se quiera. Son casillas de 8x8 pixeles, por lo que una pantalla de la DS que tiene 256x192 tendrá 32x24 tiles.&lt;br /&gt;&lt;br /&gt;La siguiente imágen nos carga los tiles que vamos a usar en esta primera versión del Tetris:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SWzQ8L_p4pI/AAAAAAAAAJs/v_71GdGtHlw/s1600-h/tiles.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 192px;" src="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SWzQ8L_p4pI/AAAAAAAAAJs/v_71GdGtHlw/s320/tiles.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5290833394683994770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Si os fijáis bien, se han creado una serie de cuadraditos de 8x8 pixeles que serán las posibles casillas a dibujar. Cómo las fichas del Tetris tienen distintos colores pues hemos hecho casillas de diferentes colores.&lt;br /&gt;&lt;br /&gt;Ahora veamos el código poco a poco para ver cómo funciona todo:&lt;br /&gt;&lt;br /&gt;En primer lugar:&lt;br /&gt;&lt;br /&gt;Cargamos la imagen de los tiles en las dos pantallas mediante estas dos funciones de la API de PALib.&lt;br /&gt;PA_DualLoadBgPal(BACKGROUND_TWO, (void *)tiles_Pal);&lt;br /&gt;PA_DualLoadSimpleBg(BACKGROUND_TWO, tiles_Tiles, Blank, BG_256X256, 0, 1);&lt;br /&gt;&lt;br /&gt;La primera carga la paleta de la imagen, y la segunda carga, en las dos pantallas, la imagen como si fueran tiles y lo muestra en pantalla.&lt;br /&gt;¿Pero que muestra? Un array de ceros, Blank, de 32x24 en cada una de las pantallas. Como la primera casilla de la imagen (la casilla cero) de tiles es negra, mostrará una pantalla negra.&lt;br /&gt;&lt;br /&gt;Para dibujar por la pantalla los distintos tiles se puede utilizar la función PALib:&lt;br /&gt;PA_SetMapTileEx(screen, BACKGROUND_TWO, x1, y1, ficha, 0, 0, 0);&lt;br /&gt;donde x1,y1 serán las coordenadas del array de 32x24 en que está dividida cada pantalla de la DS. Los tres últimos parámetros ya los veremos más adelante.&lt;br /&gt;&lt;br /&gt;Para poder ver todo lo que se ha dicho aquí, probar el siguiente código quitando las dos líneas que cargan los fondos: PA_EasyBgLoad(SCREEN_TOP, BACKGROUND_ONE, fondo_top); y PA_EasyBgLoad(SCREEN_BOTTOM, BACKGROUND_ONE, fondo_bottom);.&lt;br /&gt;&lt;br /&gt;Dibujar_casilla:&lt;br /&gt;&lt;br /&gt;Esta función dibuja cada casilla del tablero y cada bloque de una ficha del tetris. Como 8x8 pixeles es muy pequeño, vamos a dibujar casillas de 16x16, es decir cuatro veces la casilla de 8x8.&lt;br /&gt;PA_SetMapTileEx(screen, BACKGROUND_THREE, x1, y1, ficha, 0, 0, 0);&lt;br /&gt;PA_SetMapTileEx(screen, BACKGROUND_THREE, x1, y1 + 1, ficha, 0, 1, 0);&lt;br /&gt;PA_SetMapTileEx(screen, BACKGROUND_THREE, x1 + 1, y1, ficha, 1, 0, 0);&lt;br /&gt;PA_SetMapTileEx(screen, BACKGROUND_THREE, x1 + 1, y1 + 1, ficha, 1, 1, 0);&lt;br /&gt;&lt;br /&gt;Los parámetros son:&lt;br /&gt;PA_SetMapTileEx(screen, background, x, y, tile, girar_horizontal, girar_vertical, paleta);&lt;br /&gt;&lt;br /&gt;Debido a un pequeño problema que ocurre en la pantalla inferior (la posición 0,0 se baja unos 16 pixeles), hay que poner el scroll de esta pantalla a 0 (!?!?!?!?!?) :&lt;br /&gt;&lt;br /&gt;PA_EasyBgScrollXY(SCREEN_BOTTOM, BACKGROUND_THREE, 0, 0);&lt;br /&gt;&lt;br /&gt;Por último dibujaremos la pantalla de la aplicación. Por ahora he usado estos dos fondos (fondo_top y fondo_bottom)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0_Lj8wUYfQM/SXhnt4StxeI/AAAAAAAAAKI/fpjhAhKvuxg/s1600-h/fondo_top.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 192px;" src="http://3.bp.blogspot.com/_0_Lj8wUYfQM/SXhnt4StxeI/AAAAAAAAAKI/fpjhAhKvuxg/s320/fondo_top.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294095399876675042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SXhn7r9X-bI/AAAAAAAAAKQ/Hya9JisDT5U/s1600-h/fondo_bottom.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 192px;" src="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SXhn7r9X-bI/AAAAAAAAAKQ/Hya9JisDT5U/s320/fondo_bottom.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5294095637084109234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El código es el siguiente:&lt;br /&gt;&lt;style&gt;.pclave {color: cyan;} .string {color: #FF3300;}&lt;/style&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;#include&lt;/span&gt;&amp;nbsp;&amp;lt;PA9.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"gfx/all_gfx.h"&lt;/span&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"gfx/all_gfx.c"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"devnintendods.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;TABLERO_ANCHO&amp;nbsp;10&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;TABLERO_ALTO&amp;nbsp;21&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;FICHA_ANCHO&amp;nbsp;4&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;FICHA_ALTO&amp;nbsp;4&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;CASILLA_VACIA&amp;nbsp;1&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;CASILLA_ROJA&amp;nbsp;2&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;CASILLA_AZUL&amp;nbsp;3&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;CASILLA_VERDE&amp;nbsp;4&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;VELOCIDAD_MINIMA&amp;nbsp;25&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;BORDE_IZQUIERDO&amp;nbsp;1&lt;br /&gt;&lt;br /&gt;//La&amp;nbsp;fila&amp;nbsp;0&amp;nbsp;es&amp;nbsp;la&amp;nbsp;de&amp;nbsp;más&amp;nbsp;arriba&amp;nbsp;y&amp;nbsp;la&amp;nbsp;16&amp;nbsp;la&amp;nbsp;de&amp;nbsp;la&amp;nbsp;base.&amp;nbsp;La&amp;nbsp;columna&amp;nbsp;0&amp;nbsp;es&amp;nbsp;la&amp;nbsp;de&amp;nbsp;la&amp;nbsp;izquierda.&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;tablero[TABLERO_ANCHO][TABLERO_ALTO];&amp;nbsp;&lt;br /&gt;&lt;br /&gt;typedef&amp;nbsp;struct&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;radio;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha[FICHA_ANCHO][FICHA_ALTO];&lt;br /&gt;}&amp;nbsp;tipo_ficha;&lt;br /&gt;&lt;br /&gt;tipo_ficha&amp;nbsp;ficha;&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;inicializar_tablero();&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_tablero();&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_casilla(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y,&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha);&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;&lt;span class='pclave'&gt;main&lt;/span&gt;(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;argc,&amp;nbsp;&lt;span class='pclave'&gt;char&amp;nbsp;&lt;/span&gt;**&amp;nbsp;argv)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_Init();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_InitVBL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_InitText(SCREEN_TOP,&amp;nbsp;BACKGROUND_TWO);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_DualLoadBgPal(BACKGROUND_THREE,&amp;nbsp;(&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;*)tiles_Pal);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_DualLoadSimpleBg(BACKGROUND_THREE,&amp;nbsp;tiles_Tiles,&amp;nbsp;Blank,&amp;nbsp;BG_256X256,&amp;nbsp;0,&amp;nbsp;1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_EasyBgScrollXY(SCREEN_BOTTOM,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;0,&amp;nbsp;0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_EasyBgLoad(SCREEN_TOP,&amp;nbsp;BACKGROUND_ONE,&amp;nbsp;fondo_top);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_EasyBgLoad(SCREEN_BOTTOM,&amp;nbsp;BACKGROUND_ONE,&amp;nbsp;fondo_bottom);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inicializar_tablero();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dibujar_tablero();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;while&amp;nbsp;&lt;/span&gt;&amp;nbsp;(1)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_WaitForVBL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;inicializar_tablero()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ALTO;&amp;nbsp;j++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tablero[i][j]&amp;nbsp;=&amp;nbsp;CASILLA_VACIA;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_tablero()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;i,&amp;nbsp;j;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ANCHO;&amp;nbsp;i++)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;for&lt;/span&gt;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;TABLERO_ALTO;&amp;nbsp;j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dibujar_casilla(i,&amp;nbsp;j,&amp;nbsp;tablero[i][j]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;void&amp;nbsp;&lt;/span&gt;dibujar_casilla(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;y,&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;x1&amp;nbsp;=&amp;nbsp;x&amp;nbsp;*&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;y1&amp;nbsp;=&amp;nbsp;y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;screen&amp;nbsp;=&amp;nbsp;SCREEN_TOP;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;if&amp;nbsp;&lt;/span&gt;(y1&amp;nbsp;&amp;gt;=&amp;nbsp;12)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;screen&amp;nbsp;=&amp;nbsp;SCREEN_BOTTOM;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1&amp;nbsp;=&amp;nbsp;y1&amp;nbsp;-&amp;nbsp;12;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1&amp;nbsp;=&amp;nbsp;y1&amp;nbsp;*&amp;nbsp;2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x1&amp;nbsp;+=&amp;nbsp;BORDE_IZQUIERDO;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SetMapTileEx(screen,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;x1,&amp;nbsp;y1,&amp;nbsp;ficha,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SetMapTileEx(screen,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;x1,&amp;nbsp;y1&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;ficha,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SetMapTileEx(screen,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;x1&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;y1,&amp;nbsp;ficha,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_SetMapTileEx(screen,&amp;nbsp;BACKGROUND_THREE,&amp;nbsp;x1&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;y1&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;ficha,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;0);&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;La programación con 'tiles' nos permitirá crear el juego de plataformas. Si nos da tiempo volveremos sobre el juego de Pokemon para poder hacer mundos más grandes, sin ocupar demasiado espacio en memoria.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-8689101725643213507?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/1O1nByWhYHc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/8689101725643213507/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=8689101725643213507" title="6 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/8689101725643213507?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/8689101725643213507?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/1O1nByWhYHc/los-tiles-y-como-dibujar-el-tablero.html" title="Los tiles y cómo dibujar el Tablero" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SWzQ8L_p4pI/AAAAAAAAAJs/v_71GdGtHlw/s72-c/tiles.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/01/los-tiles-y-como-dibujar-el-tablero.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DRngyeCp7ImA9WxJSFEk.&quot;"><id>tag:blogger.com,1999:blog-5100734726665546220.post-8261428372495657686</id><published>2009-01-23T23:45:00.000-08:00</published><updated>2009-05-04T07:06:17.690-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T07:06:17.690-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Nintendo DS" /><category scheme="http://www.blogger.com/atom/ns#" term="homebrew" /><category scheme="http://www.blogger.com/atom/ns#" term="programar" /><category scheme="http://www.blogger.com/atom/ns#" term="tetris" /><category scheme="http://www.blogger.com/atom/ns#" term="PALib" /><category scheme="http://www.blogger.com/atom/ns#" term="programación" /><title>Empezamos a crear el Tetris</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6E5upJjzs8-Xjimm--a0nA7erqo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6E5upJjzs8-Xjimm--a0nA7erqo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6E5upJjzs8-Xjimm--a0nA7erqo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6E5upJjzs8-Xjimm--a0nA7erqo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Con los post anteriores veíamos cosas de la programación pero nada tangible. Así que en este post empezaremos a crear el juego.&lt;br /&gt;&lt;br /&gt;Lo primero el fondo del juego. Por ahora no vamos a hacer nada de puntuación y ficha siguiente, así que por ahora el fondo serán estas dos imágenes:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SWzHcoxfoSI/AAAAAAAAAJc/gU_GH7xenG8/s1600-h/fondo_top.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 192px;" src="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SWzHcoxfoSI/AAAAAAAAAJc/gU_GH7xenG8/s320/fondo_top.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5290822957048766754" /&gt;&lt;/a&gt;&lt;br /&gt;fondo_top y &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SWzHibiKXUI/AAAAAAAAAJk/3FgPdrqnyA4/s1600-h/fondo_bottom.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 192px;" src="http://2.bp.blogspot.com/_0_Lj8wUYfQM/SWzHibiKXUI/AAAAAAAAAJk/3FgPdrqnyA4/s320/fondo_bottom.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5290823056574012738" /&gt;&lt;/a&gt;&lt;br /&gt;fondo_bottom&lt;br /&gt;&lt;br /&gt;Las imágenes deben pasar por el PAGX, como se indica &lt;a href="http://devnintendods.blogspot.com/2008/03/cargar-fondos.html"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;PALib nos da estas dos funciones para cargar dichos fondos:&lt;br /&gt;PA_EasyBgLoad(SCREEN_TOP, BACKGROUND_ONE, fondo_top);&lt;br /&gt;PA_EasyBgLoad(SCREEN_BOTTOM, BACKGROUND_ONE, fondo_bottom);&lt;br /&gt;&lt;br /&gt;El código sería:&lt;br /&gt;&lt;style&gt;.pclave {color: cyan;} .string {color: #FF3300;}&lt;/style&gt;&lt;div style='border: solid 1px rgb(255, 255, 255);background: black;color: white;'&gt;&lt;div style='padding: 1em'&gt;&lt;span class='pclave'&gt;#include&lt;/span&gt;&amp;nbsp;&amp;lt;PA9.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"gfx/all_gfx.h"&lt;/span&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"gfx/all_gfx.c"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#include&amp;nbsp&lt;span class='string'&gt;"devnintendods.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;TABLERO_ANCHO&amp;nbsp;10&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;TABLERO_ALTO&amp;nbsp;20&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;FICHA_ANCHO&amp;nbsp;4&lt;br /&gt;&lt;span class='pclave'&gt;#define&lt;/span&gt;&amp;nbsp;FICHA_ALTO&amp;nbsp;4&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;tablero[TABLERO_ANCHO][TABLERO_ALTO];&amp;nbsp;&lt;br /&gt;&lt;br /&gt;typedef&amp;nbsp;struct&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;x,&amp;nbsp;y,&amp;nbsp;radio;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha[FICHA_ANCHO][FICHA_ALTO];&lt;br /&gt;}&amp;nbsp;tipo_ficha;&lt;br /&gt;&lt;br /&gt;tipo_ficha&amp;nbsp;ficha;&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;u8&amp;nbsp;&lt;/span&gt;ficha_timer&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&lt;br /&gt;&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;&lt;span class='pclave'&gt;main&lt;/span&gt;(&lt;span class='pclave'&gt;int&amp;nbsp;&lt;/span&gt;argc,&amp;nbsp;&lt;span class='pclave'&gt;char&amp;nbsp;&lt;/span&gt;**&amp;nbsp;argv)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_Init();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_InitVBL();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_EasyBgLoad(SCREEN_TOP,&amp;nbsp;BACKGROUND_ONE,&amp;nbsp;fondo_top);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_EasyBgLoad(SCREEN_BOTTOM,&amp;nbsp;BACKGROUND_ONE,&amp;nbsp;fondo_bottom);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;while&amp;nbsp;&lt;/span&gt;&amp;nbsp;(1)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PA_WaitForVBL();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='pclave'&gt;return&amp;nbsp;&lt;/span&gt;0;&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para los que no han seguido el tutorial desde el principio &lt;span style="font-style:italic;"&gt;devnintendods.h&lt;/span&gt; lo podeís encontrar &lt;a href="http://2783306072781995157-a-1802744773732722657-s-sites.googlegroups.com/site/devnintendods/Home/devnintendods.h?attredirects=0&amp;auth=ANoY7coljNh3BXB_FvFkPR37tEsd5ubsKgPiFXFwD0ysfRfyqyX30XC2xqGJZDRTW1q4q3924b0L5oEQTooqX7qjvZtgDEdwgv5xk6cftfVksh5QScEQ-YSxZd-EQu-vg2o920DWhN4A5DAUhrnJ61Ab1etahE6IUSFluWKMUfpSYsoDj1n8AHvzzdG6fIiQSKgQUeH-x7-mL9hTSBUiZcK65uXwGXuxSA%3D%3D"&gt;aquí&lt;/a&gt;, y se debe guardar en la carpeta source.&lt;br /&gt;&lt;br /&gt;Bueno, esto va tomando forma. En el próximo post veremos como programar el pintado del tablero en pantalla.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100734726665546220-8261428372495657686?l=devnintendods.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ProgramarParaNintendoDS/~4/kWVSyLk5maQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://devnintendods.blogspot.com/feeds/8261428372495657686/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5100734726665546220&amp;postID=8261428372495657686" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/8261428372495657686?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5100734726665546220/posts/default/8261428372495657686?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProgramarParaNintendoDS/~3/kWVSyLk5maQ/empezamos-crear-el-tetris.html" title="Empezamos a crear el Tetris" /><author><name>Iñigo</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="01012063864159029461" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_0_Lj8wUYfQM/SWzHcoxfoSI/AAAAAAAAAJc/gU_GH7xenG8/s72-c/fondo_top.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://devnintendods.blogspot.com/2009/01/empezamos-crear-el-tetris.html</feedburner:origLink></entry></feed>
