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

<channel>
	<title>AQuA.it &#187; j2me</title>
	<atom:link href="http://blog.aquait.info/tag/j2me/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aquait.info</link>
	<description>Blog técnico de AQuA.it</description>
	<lastBuildDate>Mon, 17 Oct 2011 12:15:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Juegos en JME (o cómo convertir tu celular en una mini consola de video juegos)</title>
		<link>http://blog.aquait.info/2010/06/juegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos/</link>
		<comments>http://blog.aquait.info/2010/06/juegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 22:39:02 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[j2me]]></category>
		<category><![CDATA[jme]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=224</guid>
		<description><![CDATA[Con el poder de procesamiento que tienen los dispositivos móviles hoy en día y en particular los celulares, se puede -con un poco de esfuerzo, paciencia y muchas ganas- implementar juegos interesantes en Java para el celular. El “celular” de hoy en día es como una computadora con un montón de periféricos integrados: cámara, teclado, [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Con el poder de procesamiento que tienen los dispositivos móviles hoy en día y en particular los celulares, se puede -con un poco de esfuerzo, paciencia y muchas ganas- implementar juegos interesantes en Java para el celular.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">El “celular” de hoy en día es como una computadora con un montón de periféricos integrados: cámara, teclado, pantalla, teléfono celular, lector de memoria externa, wifi, gps, gsm, etc. Y todo esto en la palma de la mano.<span id="more-224"></span></span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Algunos de estos dispositivos móviles traen sistemas operativos propietarios, otros utilizan alguna versión de Windows, Linux o Symbian OS. Pero hay una características que la gran mayoría tienen en común: Java. Obviamente no es la versión de Java full power que se instala en nuestro desktop, laptop o servidor. Se trata de una versión adaptada a dispositivos móviles en los cuales no se cuenta con Gigas de RAM, o múltiples CPUs con frecuencias de reloj del orden de los Giga Hetrz.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Sorprendentemente, Java Micro Edition (JME, A.K.A. J2ME) tiene las características que la hacen una plataforma bien interesante para desarrollar aplicaciones y particularmente juegos. Y estos últimos son los que vamos a explorar.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"><br />
</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"><strong>Primero un poco de teoría</strong></span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Dada la cantidad de dispositivos móviles -todos con características diferentes- se inventaron los “perfiles de capacidades”: MIDP por Mobile Information Device Profile. Dependiendo de la versión de MIDP, el dispositivo va a tener más o menos capacidades de: comunicación, presentación, audio, etc.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Además de MIDP, existe otra especificación llamada CLDC por Connected Limited Device Configuration, que define capacidades de bajo nivel del dispositivo, por ejemplo, si tiene la capacidad de manejar número con punto flotante.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">MIDP se apoya en CLDC para formar la plataforma Java ME. La idea es desarrollar en la plataforma más compatible que se pueda. Hoy por hoy, la mayoría de los celulares soportan MIDP 2.0 y CLDC 1.1, pero si podemos restringirnos a CLDC 1.0 mejor. El Motorola V360 es un ejemplo de teléfono móvil con MIDP 2.0 y CLDC 1.0.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Entonces cuando empecemos a desarrollar, tenemos que elegir que versión de MIDP y CLDC vamos a utilizar. En la página de Oracle (http://java.sun.com/javame/technology/index.jsp), se puede encontrar más información y el SDK (http://java.sun.com/javame/downloads/index.jsp).</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Bien, tenemos el SDK instalado, tenemos nuestra IDE de confianza configurada. ¿Y ahora qué? ¡A programar! Bueno, no tan rápido. ¿Cómo se programa un juego? Esto es algo que los que venimos haciendo IT desde ya hace años, no tenemos muy claro. En Internet hay mucha documentación, pero la realmente buena es escasa.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Primero que nada, veremos como es el esqueleto de un juego -en pseudocódigo-:</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"> </span></span></p>
<pre class="brush: java">proceso entrada del usuario
actualizo el estado del juego
dibujo la pantalla
goto 1
</pre>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"> </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Santo patrono de la informática, perdón por el goto.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">No hay nada revelador en estas 4 lineas, pero lo que si se pueden empezar a ver algunos problemas. Por ejemplo: este juego va a ejecutar a distinta velocidad según de la potencia del celular. Algo claramente no deseable. Obviamente queremos que nuestro juego funcione a la misma velocidad en cualquier celular, sin importar la potencia del mismo.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Para esto, hacemos un pequeño cambio:</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"></p>
<pre class="brush: java">proceso entrada del usuario
actualizo el estado del juego
dibujo la pantalla
esperar X milisegundos
goto 1
</pre>
<p></span></span><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"></span></span></p>
<ul></ul>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Ahora variando X, podemos variar la velocidad del juego. Fácil&#8230; ¿no? Queda en manos del usuario elegir X mediante, por ejemplo, el menú el juego. Pero, ¿no se podría determinar X automáticamente? Mejor aún, ¿no se podría determinar X dinámicamente en cada vuelta del ciclo?  Claro que sí. Ahora vemos como:</span></span></p>
<pre class="brush: java">ciclos_por_segundo = 30
milisegundos_por_ciclo = 1000 / ciclos_por_segundo
t_inicial = ahora()
proceso entrada del usuario
actualizo el estado del juego
dibujo la pantalla
t_ciclo = ahora() - t_inicial
si (t_ciclo &lt; milisegundos_por_ciclo) entonces
    esperar (milisegundos_por_ciclo - t_ciclo) milisegundos
goto 3
</pre>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"> </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Nota: La función ahora() devuelve la hora actual en milisegundos, algo como lo que hace System.currentTimeMillis() en Java.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Lo que se hace es, tomar el tiempo que toma un ciclo completo (4, 5 y 6). Si ese tiempo es menor que la cantidad de tiempo que establecimos para cada ciclo en 1 y 2, entonces esperamos esa diferencia de tiempo. Así, todos los ciclos demoran lo mismo y el tiempo de espera se ajusta dinámicamente. </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">De esta forma logramos un rendimiento igual entre celulares de distinta potencia. Este método se puede mejorar implementando saltos de ciclos (frame skipping) cuando el celular es de muy baja potencia, pero corremos el riesgo de que el juego se vuelva injugable. Así, el juego ejecutará más lento en celulares de poca potencia, ya que todo el tiempo se consumirá en los puntos 4, 5 y 6 y nunca entrará en espera.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Es sorprendente la cantidad de cosas interesantes que se pueden hacer utilizando esta sencilla técnica.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"><strong>A la práctica</strong></span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Vamos a implementar, con esta técnica, el “hola mundo” de los juegos: el PONG de a uno.</span></span></p>
<div id="attachment_225" class="wp-caption aligncenter" style="width: 219px"><a href="http://blog.aquait.info/wp-content/uploads/2010/06/Screenshot.png"><img class="size-full wp-image-225" title="Pong" src="http://blog.aquait.info/wp-content/uploads/2010/06/Screenshot.png" alt="Pong" width="209" height="202" /></a><p class="wp-caption-text">Pong</p></div>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Es como si fuera un Arkanoid, pero sin los ladrillos. Es verdad, no es muy divertido.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">La implementación en Java del bucle principal sería algo así:</span></span></p>
<pre class="brush: java">final int CICLOS_POR_SEGUNDO = 30;
final int MILISEGUNDOS_POR_CICLO = 1000 / CICLOS_POR_SEGUNDO;
while (true) {
    long tInicial = System.currentTimeMillis();
    procesarEntradaDelUsuario();
    actualizarEstadoDelJuego();
    dibujarLaPantalla();
    long tCiclo = System.currentTimeMillis() - tInicial;
    if (tCiclo &lt; MILISEGUNDOS_POR_CICLO) {
        Thread.sleep(MILISEGUNDOS_POR_CICLO - tCiclo);
    }
}
</pre>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Notar que hasta ahora no hay nada hecho particularmente para el PONG. Lo particular estará en las funciones procesarEntradaDelUsuario(), actualizarEstadoDelJuego() y dibujarLaPantalla().</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">La primera tiene la responsabilidad de tomar la entrada del usuario y modificar algo en el juego, en este caso sería la posición de la paleta. Sí, la paleta es ese rectángulo verde.. hay que tener imaginación <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">La segunda debe actualizar el estado interno del juego. En este juego, esta función tiene dos objetivos: a) mover la pelota y b) si la pelota se va hacia abajo, entonces el juego termina con el fatídico “Game Over”. </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">La tercer y última función, debe tomar el estado del juego y dibujarlo en la pantalla.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">El código fuente se puede bajar desde acá: <a href="http://blog.aquait.info/wp-content/uploads/2010/06/pong-scr.tar.gz">pong-scr.tar</a>. En esta implementación, nunca se pierde. Cuando la pelota se va para abajo, aparece nuevamente en el medio de la pantalla. Un buen ejercicio, sería agregarle vidas, que aumente la velocidad de la pelota, darle aceleración a la paleta, mejorar los gráficos, agregarle ladrillitos, sonidos, powerups y ponerle un nombre marketinero (que no sea Arkanoid, claro <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) y de ahí, a la fama!</span></span></p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Enjoy!</span></span></p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;linkname=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;linkname=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;linkname=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;linkname=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;title=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" id="wpa2a_2"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2010/06/juegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

