programacion java me

100
 Programación de juegos para móviles con J2ME Autor: Alberto García Serrano [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me ]  Descubre miles de cursos como éste en www.mailxmail.com 1 mailxmail - Cursos para compartir lo que sabes

Upload: nicolas-hernandez-chavez

Post on 07-Oct-2015

11 views

Category:

Documents


0 download

TRANSCRIPT

  • Programacin de juegos paramviles con J2ME

    Autor: Alberto Garca Serrano

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me]

    Descubre miles de cursos como ste en www.mailxmail.com 1

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2mehttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Presentacin del curso

    Hoy en da se pueden realizar infinidad de cosas con el mvil. Desde la tradicionalllamada telefnica hasta conectarse a Internet. Sin embargo, una de las msdivertidas en programar juegos. En este curso te ofrecemos las bases para quepuedas aadir juegos a tu mvil y disfrutar en tus ratos libres.

    Visita ms cursos como este en mailxmail:[http://www.mailxmail.com/cursos-informatica][http://www.mailxmail.com/cursos-programacion]

    Tu opinin cuenta! Lee todas las opiniones de este curso y djanos la tuya:[http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/opiniones]

    Cursos Valoracin Alumnos Vdeo

    Conmutacin. Lneas de acceso (primera parte)En este curso sobre lneas de acceso conmutado aprenders qu es la conmutacin y porqu surge. conocers la evolucin histrica de estas tecnologas y los principales s... [31 /10/08]

    4 6

    Primeros pasos con XML y XSLXml es el acrnimo del ingls extensible markup language cuyo objetivo principal esconseguir una pgina web ms semntica. inicialmente nace como sucesor del html,separ... [10 /09/04]

    6.118

    Algoritmos y lenguaje CEste curso pretende dar a conocer las explicaciones ms simples del trabajo de losordenadores.puedes descubrir cada paso que realizan, cmo lo realizan, qu es l... [13 /01/06]

    2.840

    JavaJava naci con el deseo por parte de sun de buscar un lenguaje de programacin enfocadoa electrodomsticos. se necesitaba alg&uacu... [23 /04/04]

    22.677

    Introduccin a OracleEn el curso se introducen los conceptos bsicos para saber que es un gestor de bases dedatos relacional, y la utilidad de oracle para este cometido.... [01 /02/06]

    14.487

    Cursos similares

    Descubre miles de cursos como ste en www.mailxmail.com 2

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/cursos-informaticahttp://www.mailxmail.com/cursos-programacionhttp://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/opinioneshttp://www.mailxmail.com/curso-conmutacionhttp://www.mailxmail.com/curso-primeros-pasos-xml-xslhttp://www.mailxmail.com/curso-primeros-pasos-xml-xsl/opinioneshttp://www.mailxmail.com/curso-algoritmos-lenguaje-chttp://www.mailxmail.com/curso-algoritmos-lenguaje-c/opinioneshttp://www.mailxmail.com/curso-javahttp://www.mailxmail.com/curso-java/opinioneshttp://www.mailxmail.com/curso-introduccion-oraclehttp://www.mailxmail.com/curso-introduccion-oracle/opinioneshttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 1. Introduccin

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/introduccion]

    Los telfonos mviles son ya parte esencial en nuestra forma de vida. Cada da sonms los usuarios de estos terminales, y cada vez ms pequeos. Hasta ahora, noshan acompaado a todas partes y nos han permitido comunicarnos con cualquierotro terminal, ya sea fijo o mvil. Aunque la comunicacin telefnica por voz es elprincipal uso de estos terminales, pronto se han desarrollado nuevas formas decomunicacin y otras capacidades en torno a nuestros pequeos telfonos.

    El primero, y quizs ms lucrativo hasta la fecha, fue el uso de la mensajera SMS(Short Message Service). Nuestros pequeos terminales nos permiten enviarmensajes cortos de texto (hasta un tamao de 160 caracteres) que son enviadosdesde el terminal al centro servidor de mensajes cortos o SMSC (Short MessageService Centre), que a su vez se encarga de hacer llegar el mensaje al mvildestinatario.

    Ms tarde, aparecieron los terminales capaces de navegar por Internet, pero laslimitaciones de la pantalla y de los teclados hacan inviable su uso con pginas webnormales. As naci la tecnologa WAP, que nos permiten navegar por pginasespeciales creadas en WML en lugar de en HTML. Sin embargo, las limitaciones deeste medio, y quizs tambin por el elevado precio y la baja velocidad del servicio,han hecho que la tecnologa WAP no se haya extendido tanto como su hermanamayor, la WEB. Para paliar las bajas velocidades -sin contar con la baja fiabilidad- dela tecnologa GSM para la transmisin de datos, apareci la tecnologa GPRS (GeneralPacket Radio Service). GPRS nos ofrece una red de transferencia de datos sin hilos auna velocidad aceptable, tanto es as, que ahora se puede enviar grandes paquetesde informacin, como fotografas, msica, e incluso video. A partir de aqu, se hacepatente la necesidad de una nueva generacin de mviles capaces de reproducirmsicas ms complejas y mostrar grficos y fotografas en color. A la vez queaparecen estos mviles en el mercado, aparece el nuevo servicio de mensajes cortosllamado MMS (Multimedia Message Service). Gracias a MMS, adems de texto,podemos enviar fotografas, sonidos, grficos, etc. Pero an estaba por llegar laverdadera revolucin.

    Sun Mycrosystems da un paso adelante dentro de su tecnologa Java, y nos presentaJ2ME (Java 2 Micro Edition): un entorno de produccin para pequeos dispositivosque permite la ejecucin de programas creados en Java. Una de las principalescapacidades que aade esta tecnologa a nuestros terminales es la posibilidad dedescargar y ejecutar juegos con una calidad razonable. Hoy, nuestros telfonosmviles corren autnticos sistemas operativos. El ms conocido quizs es Symbian,que es el corazn de gran cantidad de mviles, como los Nokia, Sony-Ericsson,Motorola y otros.

    Este libro trata sobre como programar juegos para estos dispositivos utilizandoJ2ME. La primera versin de la especificacin MIDP (Movile Information DeviceProfile), defina los requerimientos mnimos para poder ejecutar programas J2ME,sin embargo, ofrecan poca ayuda a la hora de crear juegos, por lo que haba querecurrir a libreras propias de cada fabricante, haciendo necesario crear diferentesversiones de un juego para cada fabricante. La versin 2.0. subsana de algunamanera este problema, y nos ofrece una API mucho ms adecuada para laprogramacin de juegos. De cualquier forma, siempre que usemos las caractersticas

    Descubre miles de cursos como ste en www.mailxmail.com 3

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/introduccionhttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • programacin de juegos. De cualquier forma, siempre que usemos las caractersticasnuevas de la segunda versin, se indicar convenientemente. No quisiera terminarsin agradecer a Ari Feldman (http://www.arifeldman.com/) sus grficos con licenciaGPL, que se han utilizado para realizar el juego M1945. Espero que disfrutes coneste libro.

    Descubre miles de cursos como ste en www.mailxmail.com 4

    mailxmail - Cursos para compartir lo que sabes

    http://www.arifeldman.com/http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 2. Breve introduccin al lenguaje Java - J2ME[http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/breve-introduccion-lenguaje-java-j2me]

    En este captulo quiero presentarte, de forma general, J2ME y encuadrarla dentro de la tecnologaJava. Tambin vamos a hacer una breve introduccin al lenguaje Java, al menos en sus aspectosbsicos para poder adentrarte sin problemas en la programacin con J2ME.

    J2EE.- Cuando Sun decidi lanzar su nuevo standard Java, llamado Java2, cre tres diferentes entornospara desarrollo y ejecucin de aplicaciones. Estos fueron J2SE, J2EE y J2ME.

    J2SE (Java 2 Standard Edition) es, por decirlo de alguna manera, la base de la tecnologa Java. Permiteel desarrollo de applets (aplicaciones que se ejecutan en un navegador web) y aplicacionesindependientes (standalone). J2SE es el heredero directo del Java inicial (antes de Java 2). J2EE (Java 2Enterprise Edition) est basado en J2SE, pero aade una serie de caractersticas necesarias en entornosempresariales, relativos a redes, acceso a datos y entrada/salida que requieren mayor capacidad deproceso, almacenamiento y memoria. La decisin de separarlos es debida a que no todas estascaractersticas son necesarias para el desarrollo de aplicaciones standard.

    Al igual que J2EE cubre unas necesidades ms amplias que J2SE, se hace patente la necesidad de unsubconjunto de J2SE para entornos ms limitados. La respuesta de Sun es J2ME (Java 2 Micro Edition).

    J2ME se basa en los conceptos de configuracin y perfil. Una configuracin describe lascaractersticas mnimas en cuanto a la configuracin hardware y software. La configuracin que usaJ2ME es la CLDC (Connected Limited Device Configuration). Concretamente CLDC define:

    -Cules son las caractersticas del lenguaje Java incluidas.-Qu funcionalidad ser incluida en la mquina virtual Java.-Las APIs necesarias para el desarrollo de aplicaciones en mviles.-Los requerimientos Hardware de los dispositivos.

    Debido a las limitaciones del hardware en el que correr la mquina virtual, algunas de lascaractersticas del lenguaje Java han sido recortadas. En concreto, se ha omitido el soporte deoperaciones matemticas en punto flotante, y por lo tanto, los tipos de datos que manejan esta deinformacin. La otra gran diferencia es que la mquina virtual tampoco dar soporte al mtodofinalize() encargado de eliminar los objetos de la memoria. Tambin se limita el nmero deexcepciones disponibles para el control de errores.

    J2ME est formado por la configuracin CLDC y por el perfil MID (conocido por MIDP o MID Profile).CLDC es una especificacin general para un amplio abanico de dispositivos, que van desde PDAs atelfonos mviles y otros. Un perfil define las caractersticas del dispositivo de forma ms especifica.MIDP (Mobile Information Device Profile) define las APIs y caractersticas hardware y softwarenecesarias para el caso concreto de los telfono mviles. Las caractersticas concretas de la versin1.0 y 2.0 de MIDP pueden ser consultadas en la pgina web de Sun (http:// java.sun.com/j2me/).

    Descubre miles de cursos como ste en www.mailxmail.com 5

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/breve-introduccion-lenguaje-java-j2mehttp://java.sun.com/j2me/http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 3. El lenguaje Java

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/lenguaje-java]

    El lenguaje Java es un lenguaje completamente orientado a objetos. Todo en Java esun objeto. Durante el resto del captulo vamos a ver las caractersticas generales dellenguaje Java (slo las necesarias en J2ME), lo que nos permitir entrar en elsiguiente captulo con la base necesaria para empezar a programar MIDlets. UnMIDlet es un programa capaz de correr en un dispositivo mvil. El nombre guardacierta similitud (no casual) con los programas capaces de correr en un navegador(applets). Si quieres ampliar conocimientos sobre el lenguaje Java, puedes consultarla bibliografa en los apndices de este libro.

    Variables y Tipos de Datos.- Las variables nos permiten almacenar informacin y talcomo indica su propio nombre, pueden variar a lo largo de la ejecucin delprograma. Una variable se define a partir de un nombre y un tipo.

    El nombre de una variable puede ser cualquiera, aunque conviene utilizar nombresclaros y relacionados con el cometido de la variable. Slo hemos de tener en cuentaalgunas reglas en los nombres de variables:

    -No pueden contener espacios en blanco.-Dos variables no pueden tener el mismo nombre.-No podemos utilizar palabras reservadas de Java.

    Los programadores en Java suelen seguir una serie de convenciones a la hora denombrar las variables. Esto facilita la lectura de cdigo de terceros.

    -Las variables comienzan con una letra minscula.-Si la variable est compuesta por dos o ms palabras, la segunda (y las siguientestambin) comienzan por letra mayscula. Por ejemplo numeroDeVidas.-Los nombres de las clases comienzan por letra mayscula.-Las variables tienen asociado un tipo. El tipo de la variable define qu dato escapaz de almacenar. Los tipos de datos vlidos en Java son los siguientes:

    byte. Ocho bits.short. Nmero entero de 16 bits.int. Nmero entero de 32 bits.long. Nmero entero de 64 bits.float. Nmero en punto flotante de 32 bits.double. Nmero en punto flotante de 64 bits.char. Carcter ASCII.boolean. Valor verdadero o falso.

    Hay que aclarar que los tipos float y double, an formando parte del standard Java,no estn disponibles en J2ME.

    Antes de poder utilizar una variable, hay que declararla, es decir, darle un nombre yun tipo. La siguiente lnea declara una variable llamada vidas de tipo entero de 32bits.

    int vidas; Una variable por s misma no es muy til, a no ser que podamos realizaroperaciones con ellas. Estas operaciones se realizan por medio de operadores. Hay

    Descubre miles de cursos como ste en www.mailxmail.com 6

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/lenguaje-javahttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • operaciones con ellas. Estas operaciones se realizan por medio de operadores. Haycinco tipos de operadores.

    -De asignacin-Aritmticos-Relacinales-Lgicos-A nivel de bit

    Cuando declaramos una variable sta no contiene ningn valor (realmente si, tieneel valor null). Para darle un valor a la variable utilizamos el operador de asignacin =(signo de igualdad). As, para asignar el valor 3 a la variable vidas, procedemos de lasiguiente forma.

    vidas = 3; Observa el punto y coma (;) al final de la lnea. En Java cada instruccin acaba con unpunto y coma.

    Tenemos disponibles otros operadores de asignacin:

    Operador Significadoa += b a = a + ba -= b a = a - ba *= b a = a * ba /= b a = a / ba %= b a = a % ba &= b a = a & ba |= b a = a | b

    Los siguientes operadores que vamos a ver son los operadores aritmticos. Hay dostipos, los operadores unarios y los binarios. Los operadores aritmticos unarios son + + y - - .+ + y - - . Pueden ir delante o detrs de una variable, y su misin es incrementar (odecrementar) en una unidad el valor de la variable. Si se sitan tras la variablehablamos de postincremento (o postdecremento), es decir, la variable esincrementada (o decrementada) despus de haberse hecho uso de ella. Si por elcontrario va delante hablamos de preincremento (o predecremento), es decir,primero se modifica su valor y despus se hace uso de la variable. Veamos unejemplo:

    nuevasVidas = + +vidas; En este ejemplo, primero incrementamos el valor de la variable vidas, y despus selo asignamos a la variable nuevasVidas.

    enemigoActual = enemigos--; Aqu, primero asignamos a la variable enemigoActual el valor de la variableenemigos, y despus decrementamos el valor de esta ltima variable.

    El otro tipo de operadores aritmticos son los binarios.

    Operador Significadoa + b Suma de a y ba - b Diferencia de a y ba * b Producto de a por ba / b Diferencia entre a y ba % b Resto de la divisin entre a y b

    Descubre miles de cursos como ste en www.mailxmail.com 7

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Los operadores relacionales nos permiten comparar dos variables o valores. Unoperador relacional devuelve un valor de tipo boolean, es decir, verdadero (true) ofalso (false).

    Operador Significadoa > b true si a es mayor que ba < b true si a es menor que ba >= b true si a es mayor o igual que ba > b Desplaza los bits de a hacia la derecha b vecesa > >7 relacionales < > = instanceof8> igualdad = = ! =9 bitwise AND & 10 bitwise exclusive OR ^11 bitwise inclusive OR | 12 AND lgico && 13 OR lgico | |14 condicional ? :

    Descubre miles de cursos como ste en www.mailxmail.com 8

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 15 asignacin = + = - = * = / = % = ^ = & = | = < < = > > => > > =

    Descubre miles de cursos como ste en www.mailxmail.com 9

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 4. Clases y Objetos

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/clases-objetos] Qu es un objeto? Tratar de explicarlo de la forma ms intuitiva posible sin entraren demasiados formalismos. Si te pido que pienses en un objeto, seguramentepensars en un lpiz, una mesa, unas gafas de sol, un coche o cualquier otra cosaque caiga dentro de tu radio de visin. sta es la idea intuitiva de objeto: algo fsicoy material. En POO, el concepto de objeto no es muy diferente. Una de lasdiferencias bsicas evidentes es que un objeto en Java puede hacer referencia a algoabstracto.

    Como en el ejemplo del coche, un objeto puede estar compuesto por otra clase deobjeto, como rueda, carrocera, etc... Este concepto de clase de objeto esimportante. Un objeto siempre pertenece a una clase de objeto. Por ejemplo, todaslas ruedas, con independencia de su tamao, pertenecen a la clase rueda. Haymuchos objetos "rueda" diferentes que pertenecen a la clase rueda y cada uno deellos forman una instancia de la clase rueda. Tenemos, pues, instancias de la claserueda que son ruedas de camin, ruedas de coches o ruedas de motocicleta.

    Volvamos al ejemplo del coche. Vamos a definir otra clase de objeto, la clase coche.Esta clase define a "algo" que est compuesto por objetos (instancias) de la claserueda, la clase carrocera, la clase volante, etc... Ahora vamos a crear un objeto de laclase coche, al que llamaremos coche_rojo. En este caso hemos instanciado unobjeto de la clase coche y hemos definido uno de sus atributos, el color, al quehemos dado el valor de rojo. Vemos pues, que un objeto puede poseer atributos.Sobre el objeto coche podemos definir tambin acciones u operaciones posibles. Porejemplo, el objeto coche, entre otras cosas, puede realizar las operaciones deacelerar, frenar, girar a la izquierda, etc... Estas operaciones que pueden serejecutadas sobre un objeto se llaman mtodos del objeto.

    Podramos hacer ya una primera definicin de lo que es un objeto. Es la instancia deuna clase de objeto concreta, que est compuesta por atributos y mtodos. Estadefinicin nos muestra una de las tres principales caractersticas que definen a laPOO. Me refiero al encapsulamiento, que no es, ni ms ni menos, que la capacidadque tiene un objeto de contener datos (atributos) y cdigo (mtodos).

    Clases y Objetos en Java.- Antes de poder crear un objeto hay que definirlo. Unobjeto, tal como decamos antes, pertenece a una clase, as que antes de crearnuestro objeto, hay que definir una clase (o utilizar una clase ya definida en las APIsde Java). La forma bsica para declarar una clase en Java es.

    class nombre_clase {// variables de la clase (atributos)...// mtodos de la clase} En Java, utilizamos las dos barras inclinadas (//) para indicar que lo que sigue es uncomentario. Una vez definida la clase, podemos ya crear un objeto de la clase quehemos declarado. Lo hacemos as.

    clase_objeto nombre_objeto; Las variables de la clase o atributos son variables como las que vimos en la seccinanterior.

    Descubre miles de cursos como ste en www.mailxmail.com 10

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/clases-objetoshttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Los mtodos, son similares a las funciones de otros lenguajes. La declaracin de unmtodo tiene la siguiente forma.

    tipo NombreMetodo(tipo arg1, tipo arg2, ...) {// cuerpo del mtodo (cdigo)

    }El mtodo tiene un tipo de retorno (tipo que devuelve al ser llamado). Tambin tieneuna lista de argumentos o parmetros.

    Vamos a clarificar lo visto hasta ahora con un ejemplo.

    class Coche { // variables de clase int velocidad;

    // mtodos de la clase void acelerar(int nuevaVelocidad) { velocidad = nuevaVelocidad; }

    void frenar() { velocidad = 0; }}Hemos declarado la clase coche, que tiene un slo atributo, la velocidad, y dosmtodos, uno para acelerar y otro para frenar. En el mtodo acelerar, simplementerecibimos como parmetro una nueva velocidad, y actualizamos este atributo con elnuevo valor. En el caso del mtodo frenar, ponemos la velocidad a 0. Veamos ahoracmo declaramos un objeto de tipo coche y cmo utilizar sus mtodos.

    // declaracin del objetoCoche miCoche = new Coche();

    // acelerar hasta 100 km/hmiCoche.acelerar(100);

    / / f renarmiCoche.frenar();

    En primer lugar, hemos creado el objeto miCoche que pertenece a la clase Cochemediante el operador new. Despus, podemos acceder tanto a los mtodos como alas variables miembro usando su nombre precedido de un punto y el nombre delobjeto. Tambin podramos haber accedido a la variable miembro:miCoche.velocidad = 100; sta no es una prctica aconsejable. Lo ptimo es que laclase ofrezca los mtodos necesarios para acceder a las variables miembro paratener as control sobre el acceso a los atributos. No queremos que nadie haga algocomo miCoche.velocidad = 1200; sin que podamos controlarlo.

    Si nuestro mtodo tiene algn tipo de retorno, quiere decir que ha de devolver unvalor de dicho tipo. Esto se hace mediante la palabra reservada return.

    return vidas; Esta lnea al final del mtodo devuelve el valor de la variable vidas.

    Hay un tipo especial de mtodo que se llama constructor. Un constructor es un

    Descubre miles de cursos como ste en www.mailxmail.com 11

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • mtodo que se llama exactamente igual que la clase a la que pertenece. Cuandocreamos un objeto con new, el mtodo constructor es ejecutado de formaautomtica.

    Hay cuatro tipos de modificadores que permiten especificar qu tipo de claseestamos declarando. Los tipos de modificadores son los siguientes.

    -abstract. Una clase abstract tiene al menos un mtodo abstracto. Una claseabstracta slo puede ser heredada para implementar los mtodos abstractos quecontiene. En ningn caso podemos instanciar un objeto de este tipo.-final. Una clase final no puede ser heredada por ninguna otra.-public. Una clase public puede ser accedida por otras clases pertenecientes almismo paquete, o por cualquier otra siempre que sea importada o heredada.-synchronizable. Significa que esta clase slo puede ser accedida por un slothread a la vez. Se utiliza en aplicaciones multihebra para asegurar que no hayproblemas de sincronizacin entre hilos.Al igual que tenemos modificadores para las clases, tambin tenemos modificadoresde acceso a las variables miembro y a los mtodos.

    - public. Se puede acceder desde fuera de la clase a la que pertenece.-protected. Slo las subclases pueden acceder a este miembro de la clase.-private. Slo se puede acceder a la variable o al mtodo desde el interior de laclase.-friendly. Es la opcin por defecto si no se especifica nada. Permite slo el accesodesde las clases pertenecientes al mismo paquete.

    Un paquete nos permite agrupar clases bajo un nombre comn, por ejemplo, sihiciramos una librera capaz de manejar grficos, tendramos un montn de clasesencargadas de manejar el color, pxeles, imgenes, etc... Tiene lgica agrupar todasestas clases dentro de un paquete. Cuando creamos un paquete, las clases queestn incluidas se almacenan en un mismo directorio con el nombre del paquete.Indicamos que una clase pertenece a un paquete concreto mediante la palabrareservada package al principio del archivo fuente.

    package nombre_paquete; Si quisiramos utilizar este paquete que acabamos de crear, hay que importarlo.Para ello utilizamos la palabra reservada import.

    import nombre_paquete; J2ME dispone de multitud de paquetes, por ejemplo, si queremos utilizar el interfazde usuario propio de J2ME, debemos importar el paquete lcdui.

    import javax.microedition.lcdui.*;El punto se utiliza para indicar la jerarqua de paquetes, es decir, la jerarqua dedirectorios donde estn almacenadas las clases. El asterisco indica que debenimportarse todas las clases pertenecientes al paquete.

    Descubre miles de cursos como ste en www.mailxmail.com 12

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 5. Herencia

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/herencia] No s de color tienes los ojos, pero puedo asegurar que del mismo color quealguno de tus ascendientes. Este mecanismo biolgico fue descrito por Mendel(armado con una buena dosis de paciencia y una gran cantidad de guisantes) y sellama herencia. La herencia se transmite de padres a hijos, nunca al revs. En Java laherencia funciona igual, es decir, en un slo sentido. Mediante la herencia, una clasehija (llamada subclase) hereda los atributos y los mtodos de su clase padre.

    Imaginemos -volviendo al ejemplo del coche- que queremos crear una clasellamada CochePolicia, que adems de acelerar y frenar pueda activar y desactivaruna sirena. Podramos crear una clase nueva llamada CochePolicia con los atributosy clases necesarios tanto para frenar y acelerar como para activar y desactivar lasirena. En lugar de eso, vamos a aprovechar que ya tenemos una clase llamadaCoche y que ya contiene algunas de las funcionalidades que queremos incluir enCochePolicia. Vemoslo sobre un ejemplo.

    Class CochePolicia extends Coche {

    / / variables int sirena;

    / / mtodos void sirenaOn() { sirena=1; } void sirenaOff() { sirena=0; }}Lo primero que nos llama la atencin de la declaracin de la clase es su primeralnea. Tras el nombre de la clase hemos aadido la palabra extends seguido de laclase padre, es decir, de la cual heredamos los mtodos y atributos. La clase CochePoliciaCochePolicia posee dos atributos, velocidad, que ha sido heredado y sirena, queha sido declarada dentro de la clase CochePolicia. Con los mtodos sucedeexactamente igual. La clase hija ha heredado acelerar() y frenar(), adems le hemosaadido los mtodos sirenaOn() y sirenaOff(). Un objeto instancia de CochePoliciapuede utilizar sin ningn problema los mtodos acelerar() y frenar() tal y comohacamos con los objetos instanciados de la clase Coche.

    No es posible heredar de dos o ms clases a la vez (al contrario que en C++). Estose llama herencia mltiple, y suele conllevar ms problemas que ventajas, as que losdiseadores de Java prefirieron no incluir esta caracterstica.

    Polimorfismo.- El polimorfismo es otra de las grandes caracterstica de la POO. Lapalabra polimorfismo deriva de poli (mltiples) y del trmino griego morfos (forma).Es decir, mltiples formas.

    Supongamos que queremos dotar al mtodo frenar de ms funcionalidad. Queremosque nos permita reducir hasta la velocidad que queramos. Para ello le pasaremoscomo parmetro la velocidad, pero tambin sera til que frenara completamente sino le pasamos ningn parmetro. El siguiente cdigo cumple estos requisitos.

    Descubre miles de cursos como ste en www.mailxmail.com 13

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/herenciahttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • // Declaracin de la clase cocheclass Coche { // Atributos de la clase cocheint velocidad;

    // Mtodos de la clase coche void acelerar(int velocidad); void frenar() { // Ponemos a 0 el valor del atributo velocidad velocidad = 0;} void frenar(int velocidad) { // Reducimos la velocidad if (velocidad < this.velocidad)this.velocidad = velocidad;

    }}

    Como ves tenemos dos mtodos frenar. Cuando llamemos al mtodo frenar(), Javasabr cual tiene que ejecutar dependiendo de si lo llamamos con un parmetro detipo entero o sin parmetros. Esto que hemos hecho se llama sobrecarga demtodos. Podemos crear tantas versiones diferentes del mtodo siempre y cuandosean diferentes. El constructor de una clase tambin puede ser sobrecargado. En elejemplo, encontramos la palabra reservada this. sta se utiliza para indicar que a lavariable que nos referimos es la de la clase, y no la que se ha pasado comoparmetro. Hay que hacer esta distincin, ya que tienen el mismo nombre.

    Descubre miles de cursos como ste en www.mailxmail.com 14

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 6. Estructuras de control

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/estructuras-control]

    Las estructuras de control de Java son similares a las de C. Tenemos las estructurasde control condicionales y repetitivas clsicas de la programacin estructurada.

    La estructura de control ms bsica es if /else, que tiene la siguiente forma:

    if (condicin) { sentencias;} else { sentencias;}Mediante esta estructura condicional, podemos ejecutar un cdigo u otrodependiendo de si se cumple una condicin concreta. La segunda parte de laestructura (else) es opcional. Las siguientes lneas muestran un ejemplo de uso dela estructura if /else.

    if (vidas == 0) { terminar = true;} else { vidas--;}En este ejemplo, si la variable vidas vale 0, la variable terminar tomar el valor true.En otro caso, se decrementa el valor de la variable vidas.

    La otra estructura condicional es switch, que permite un control condicionalmltiple. Tiene el formato siguiente.

    switch (expresin) { case val1: sentencias; break; case val2: sentencias; break; case valN: sentencias; break; default: sentencias; break;} Dependiendo del valor que tome la expresin, se ejecutar un cdigo determinadopor la palabra reservada case. Observa como al final de las sentencias se incluye lapalabra reservada break, que hace que no se siga ejecutando el cdigo pertenecienteal siguiente bloque. Si el valor de la expresin no coincide con ninguno de losbloques, se ejecuta el bloque default. Lo veremos mejor con un ejemplo.

    switch (posicion) {

    Descubre miles de cursos como ste en www.mailxmail.com 15

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/estructuras-controlhttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • case 1: medalla = "oro"; break; case 2: medalla = "plata"; break; case 3: medalla = "bronce"; break; default: medalla = "sin medalla"; break;}Las estructuras que hemos visto hasta ahora nos permiten tomar decisiones. Lassiguientes que vamos a ver nos van a permitir realizar acciones repetitivas. Son losllamados bucles. El bucle ms sencillo es el bucle for.

    for (inicializacin_contador ; control ; incremento) { sentencias;} Este bucle ejecuta el bloque de sentencias un nmero determinado de veces.

    [for (i=1 ; i 0) { vueltas--;} A la entrada del bucle, la variable vueltas tiene el valor 10. Mientras el valor de estavariable sea mayor que 0, se va a repetir el bloque de cdigo que contiene. En estecaso, el bloque de cdigo se encarga de decrementar la variable vuelta, por lo quecuando su valor llegue a 0, no volver a ejecutarse. Lo que estamos haciendo essimular un bucle for que se ejecuta 10 veces.

    El bucle do/while funciona de forma similar al anterior, pero hace la comprobacin a

    Descubre miles de cursos como ste en www.mailxmail.com 16

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • la salida del bucle.

    do { sentencias;} while (condicin); El siguiente ejemplo, es igual que el anterior. La diferencia entre ambos es que conel bucle do/while, el cdigo se ejecutar siempre al menos una vez, ya que lacomprobacin se hace al final, mientras que con el bucle while, es posible quenunca se ejecute el cdigo interno si no se cumple la condicin.

    vueltas = 10;do { vueltas--;} while(vueltas > 0); Veamos una ltima estructura propia de Java (no existe en C) y que nos permiteejecutar un cdigo de forma controlada. Concretamente nos permite tomar accionesespecficas en caso de error de ejecucin en el cdigo.

    try { sentencias;} catch (excepcin) { sentencias;} Si el cdigo incluido en el primer bloque de cdigo produce algn tipo de excepcin,se ejecutar el cdigo contenido en el segundo bloque de cdigo. Una excepcin esun tipo de error que Java es capaz de controlar por decirlo de una forma sencilla,realmente, una excepcin es un objeto de la clase Exception. Si por ejemplo, dentrodel primer bloque de cdigo intentamos leer un archivo, y no se encuentra en lacarpeta especificada, el mtodo encargado de abrir el archivo lanzar una excepcindel tipo IOException.

    Estructuras de datosYa hemos visto los tipos de datos que soporta Java. Ahora vamos a ver un par deestructuras muy tiles. Concretamente la cadena de caracteres y los arrays.

    Una cadena de caracteres es una sucesin de caracteres continuos. Van encerradossiempre entre comillas. Por ejemplo:

    "En un lugar de La Mancha..."Es una cadena de caracteres. Para almacenar una cadena, Java dispone del tipoString.

    String texto;Una vez declarada la variable, para asignarle un valor, lo hacemos de la formahabitual.

    texto = "Esto es un texto";Podemos concatenar dos cadenas utilizando el operador +. Tambin podemosconcatenar una cadena y un tipo de datos distinto. La conversin a cadena se hacede forma automtica.

    String texto;int vidas;

    Descubre miles de cursos como ste en www.mailxmail.com 17

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • texto = "Vidas:" + vidas;Podemos conocer la longitud de una variable de tipo String (realmente un objeto detipo String) haciendo uso de su mtodo lenght.

    longitud = texto.lenght();El otro tipo de datos que veremos a continuacin es el array. Un array nos permitealmacenar varios elementos de un mismo tipo bajo el mismo nombre. Imagina unjuego multijugador en el que pueden participar cinco jugadores a la vez. Cada unollevar su propio contador de vidas. Mediante un array de 5 elementos de tipoentero (int) podemos almacenar estos datos. La declaracin de un array se hace as.

    public int[] vidas;vidas = new int[5];o directamente:

    public int[] vidas = new int[5];Hemos declarado un array de cinco elementos llamado vidas formado por cinconmeros enteros. Si quisiramos acceder, por ejemplo, al tercer elemento del array,lo haramos de la siguiente manera.

    v = vidas[3];La variable v tomar el valor del tercer elemento del array. La asignacin de un valores exactamente igual a la de cualquier variable.

    vidas[3] -= 1;El siguiente ejemplo muestra el uso de los arrays.

    tmp = 0;for (i=1 ; i

  • 7. Nuestro primer MIDlet

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/nuestro-primer-midlet]

    En este captulo vamos a construir y ejecutar nuestro primer MIDlet. Existendiferentes herramientas vlidas para construir programas bajo el standard J2ME,como el propio "Sun One Studio" de Sun Microsystems o "Jbuilder" de Borland.Nosotros vamos a valernos del "J2ME Wireless Toolkit 2.0" que proporciona Sun. Esteentorno es el ms sencillo de utilizar, y aunque no nos ofrece una gran potencia a lahora de desarrollar aplicaciones, no nos distraer con grandes complejidades delprincipal objetivo que es aprender a hacer aplicaciones (juegos) en J2ME.

    Para instalar J2ME Wireless Toolkit, primero hemos de instalar el entorno deprogramacin de J2SE (JDK). Puedes descargar la ltima versin de JDK desde la URL http://java.sun.com/j2se/downloads.htmlhttp://java.sun.com/j2se/downloads.html. Una vez descargado e instalado,estaremos en condiciones de descargar e instalar J2ME desde la URL http:// java.sun.com/j2me/download.html. El entorno de desarrollo que nos proveeel Wireless Toolkit se llama KToolBar.

    Compilando el primer MIDlet.- Vamos a construir paso a paso nuestro primer MIDletusando esta herramienta. Tras la instalacin del wireless toolkit, tendremos unnuevo submen en el men inicio con un aspecto similar a ste:

    Selecciona la aplicacin KToolBar e inicializa el entorno. Vers aparecer la ventanadel entorno.

    Descubre miles de cursos como ste en www.mailxmail.com 19

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/nuestro-primer-midlethttp://java.sun.com/j2se/downloads.htmlhttp://java.sun.com/j2se/downloads.htmlhttp://java.sun.com/j2me/download.htmlhttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Vamos a crear un nuevo proyecto, as que pulsamos el botn New Project. Nossolicitar un nombre para el proyecto y otro para la clase principal de la aplicacin.

    Tanto el proyecto como la clase principal se llamarn HelloWorld, as queintroducimos este nombre en ambos cuadros de texto y pulsamos el botn CreateProject. En este momento KToolBar crea la estructura de directorios necesaria paraalbergar el proyecto.

    Descubre miles de cursos como ste en www.mailxmail.com 20

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Cada una de las carpetas creadas tiene una misin concreta. Por ahora nos bastarsaber que nuestros archivos fuente irn emplazados en el directorio src, y losrecursos necesarios como grficos, sonidos, etc... se alojarn en el directorio res.

    A diferencia de otros entornos de programacin, KToolBar no cuenta con un editorintegrado para editar los programas, por lo tanto vamos a utilizar uno externo.Puedes utilizar el bloc de notas de Windows o tu editor favorito. Personalmenteutilizo Crimson Editor (http://www.crimsoneditor.com/), que tiene soporte para Java.

    Utilizando tu editor favorito introduce el programa siguiente:

    import javax.microedition.midlet.*;import javax.microedition.lcdui.*;

    public class HelloWorld extends MIDlet implements CommandListener { private Command exitCommand; private Display display; private Form screen; public HelloWorld() { // Obtenemos el objeto Display del midlet. display = Display.getDisplay(this); // Creamos el comando Salir. exitCommand = new Command("Salir", Command.EXIT,2); // Creamos la pantalla principal (un formulario) screen = new Form("HelloWorld"); // Creamos y aadimos la cadena de texto a la pantalla

    Descubre miles de cursos como ste en www.mailxmail.com 21

    mailxmail - Cursos para compartir lo que sabes

    http://www.crimsoneditor.com/http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • StringItem saludo = new StringItem("","Hola Mundo..."); screen.append(saludo); // Aadimos el comando Salir e indicamos que clase lo manejar screen.addCommand(exitCommand); screen.setCommandListener(this); }

    public void startApp() throws MIDletStateChangeException { // Seleccionamos la pantalla a mostrar display.setCurrent(screen); } public void pauseApp() { } public void destroyApp(boolean incondicional) { } public void commandAction(Command c, Displayable s) { / / Salir if (c == exitCommand) { destroyApp(false); notifyDestroyed(); } }}

    No es necesario que trates de comprender el programa ahora. Entraremos en msdetalles un poco ms adelante. Por ahora simplemente lo vamos a almacenar en eldirectorio src que ha creado KToolBar con el nombre HelloWorld.java. Es importanteque el nombre sea exactamente ste incluidas maysculas y minsculas. Esto es as,ya que el nombre de la clase principal tiene que ser idntico al nombre del archivoque lo contiene. Una vez hecho esto, volvemos al entorno KTooBar y pulsamos elbotn Build. Si todo va bien, aparecer el texto Build Complete. Ya tenemos nuestroprograma compilado y podemos ejecutarlo en el emulador. En el desplegable Devicepuedes seleccionar el emulador que quieres utilizar. El DefaultColorPhone tienesoporte de color, as que te resultar ms atractivo. Pulsa el botn Run. Versaparecer un emulador con forma de telfono mvil. En la pantalla del mvil apareceun men con un slo programa llamado HelloWorld. Pulsa select para ejecutarlo.

    Descubre miles de cursos como ste en www.mailxmail.com 22

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Deberas ver como aparece la frase Hola Mundo... en la pantalla.

    Ahora que hemos comprobado que el programa funciona en el emulador, estamoslistos para empaquetar el programa y dejarlo listo para descargar a un dispositivoreal. En KToolBar despliega el men project, y selecciona create package delsubmen package. KToolBar nos informa de que ha creado los archivosHelloWorld.jar y HelloWorld.jad dentro del directorio bin. Estos son los archivos quehabremos de transferir al telfono mvil.

    Descubre miles de cursos como ste en www.mailxmail.com 23

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 8. Desarrollo de MIDlets

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/desarrollo-midlets] Lo que acabamos de hacer es crear un MIDlet desde cero, aunque sin saber muybien que es lo que estbamos haciendo. Vamos a profundizar en los pasos quehemos seguido hasta conseguir nuestro MIDlet. El ciclo de desarrollo de un MIDletes el siguiente:

    1.Editar2.Compilar3.Preverificar MIDlet4.Ejecucin en el emulador5.Ejecucin en el dispositivo

    Como hemos visto en la primera parte del captulo, utilizamos un editor de textoscomn para editar el programa. La compilacin la llevamos a cabo con el comandoBuild de la herramienta KTooBar. Cuando compilamos un programa Java, y por lotanto un MIDlet, se genera un archivo con la extensin .class por cada clase, quecontiene el cdigo intermedio que es capaz de ejecutar la mquina virtual de Java.Estos archivos son almacenados en el directorio classes. El paso que sigue a lacompilacin es preverificar las clases que se han generado. Sin esta preverificacinno ser posible la ejecucin del MIDlet. Pero, para qu sirve este paso? Lapreverificacin nos asegura que no existe ningn tipo de cdigo malintencionadoque pueda daar o crear un comportamiento extrao en nuestro dispositivo o en lamquina virtual. Lo habitual es que la mquina Java sea lo suficientemente robustacomo para que no haya ningn problema en este sentido, pero debido a que losdispositivos J2ME no tienen demasiada capacidad de proceso, es necesario que lamquina virtual sobre la que se ejecutan los MIDlets (llamada K Virtual Machine oKVM) sea lo ms eficiente posible, por lo que se han eliminado muchas de lascomprobaciones que realizan las mquinas virtuales habitualmente.

    Ahora que hemos compilado y preverificado nuestro MIDlet, ya podemos ejecutarloen el emulador. Esto lo hacemos con el comando Run de la herramienta KTooBar. Siahora queremos ejecutarlo en el dispositivo real, hemos de realizar un paso ms.Los MIDlets tienen que ser distribuidos en dos archivos especiales. Son los archivosJAR y los archivos JAD. Un archivo JAR es un archivo comprimido (en formato ZIP)que contiene las clases (.class) que ha generado la compilacin de nuestroprograma. Adems puede contener los recursos necesarios para el MIDlet comosonidos, grficos, etc... Finalmente, contiene un archivo con extensin .mf., es loque se llama un archivo de manifiesto. Este archivo contiene informacin sobre lasclases contenidas en el archivo JAR.

    El segundo archivo necesario para la distribucin de MIDlets son los archivos JAD. Elarchivo JAD contiene informacin necesaria para la instalacin de los MIDletscontenidos en el archivo JAR. Un archivo puede contener ms de un MIDlet. Cuandoocurre esto, hablamos de un MIDlet suite. Podemos editar los parmetroscontenidos en el archivo JAD mediante el botn Settings de KTooBar. Aqu podemoseditar informacin del MIDlet como el nombre, la versin o el autor del MIDlet (o delos MIDlets).

    Slo nos resta transferir los archivos JAR y JAD al dispositivo J2ME. Hay variasformas de hacerlo dependiendo de la marca y modelo del dispositivo. Si el telfono

    Descubre miles de cursos como ste en www.mailxmail.com 24

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/desarrollo-midletshttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • tiene soporte de infrarrojos o bluetooth, y tu ordenador tiene puerto IrDA obluetooth, podrs transferirlo fcilmente sin necesidad de cable alguno. Si no,tendrs que recurrir a un cable de datos (consulta el manual de tu telfono). Otraposibilidad es poner los archivos JAR y JAD en un servidor wap o un espacio web ydescargarlo desde tu mvil. Para ello es necesario que el dispositivo tenga unnavegador wap o web y soporte GPRS para una descarga fiable.

    Anatoma de un MIDlet.- Si estas familiarizado con la programacin de applets, conoces las diferencias quetiene con respecto a una aplicacin Java normal. La primera es que un applet seejecuta sobre un navegador web. Otra importante es que, a diferencia de unprograma Java estndar, un applet no tiene un mtodo main(), adems, un applettiene que ser una subclase de la clase Applet, e implementar unos mtodosconcretos (init, start, stop, destroy). En este sentido, un MIDlet es ms parecido a unapplet que a una aplicacin Java estndar. Un MIDlet tiene que ejecutarse en unentorno muy concreto (un dispositivo con soporte J2ME), y tampoco cuenta con unmtodo main(). Un MIDlet tiene que heredar de la clase MIDlet e implementar unaserie de mtodos de dicha clase.

    Concretamente, la clase de la que ha de heredar cualquier MIDlet esjavax.microedition.midlet.MIDlet Hay tres mtodos heredados que sonparticularmente importantes:

    -startApp()-pauseApp()-destroyApp()

    Un MIDlet puede estar en tres estados diferentes: en ejecucin, en pausa ofinalizado. Dependiendo del estado en el que est, la mquina virtual llamar almtodo correspondiente, es decir, startApp() cuando entre en ejecucin, pauseApp()cuando el MIDlet entre en pausa y destroyApp() a la finalizacin del MIDlet. Fjate ennuestro ejemplo cmo hemos implementado los tres mtodos. Incluso si no vamos ahacer uso de ellos, es obligatorio declararlos.

    En nuestro programa de ejemplo, no slo importamos la clase MIDlet, tambinhemos importado las clases de javax.microedition.lcdui.*. Estas clases dan soportepara la interfaz de usuario. Nos va a permitir controlar la pantalla del dispositivo ytambin la entrada/salida desde el teclado. En el siguiente captulo nosintroduciremos en ms profundidad en la interfaz de usuario

    Descubre miles de cursos como ste en www.mailxmail.com 25

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 9. La interfaz de usuario de alto nivel

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/interfaz-usuario-alto-nivel]

    Como vimos en el anterior captulo, J2ME se sustenta en dos APIs, por un lado CLDC quehereda algunas de las clases de J2SE, y MIDP que aade nuevas clases que nos permitirncrear interfaces de usuario.

    Las clases que nos ofrece CLDC, son las ms importantes de los siguientes paquetes de J2SE:

    java.langjava.utiljava.io Adems cuenta con el "Generic Conection Framework" que ofrece posibilidades de conexiny comunicacin.

    Por su parte la API MIDP tambin hereda de J2SE las clases:

    TimerTimerTask

    Adems MIDP aade los siguientes paquetes:

    javax.microedition.midletjavax.microedition.lcduijavax.microedition.iojavax.microedition.rms

    El paquete javax.microedition.midlet, es el ms importante de todos. Slo contiene unaclase: la clase MIDlet, que nos ofrece un marco de ejecucin para nuestras aplicacionessobre dispositivos mviles.

    El paquete javax.microedition.lcdui nos ofrece una serie de clases e interfaces de utilidadpara crear interfaces de usuario. Es algo as como un pequeo entorno grfico similar alAWT, pero, evidentemente, mucho ms limitado. Bsicamente, nos permite dos tipos deentorno, por un lado podremos trabajar con 'Screens' sobre las que podremos colocarelementos de la interfaz de usuario, como textos, menus, etc., por otro, podremos basarnuestras aplicaciones en 'Canvas' sobre las que podemos trabajar a nivel grfico, es decir, ams bajo nivel. Tanto Screen como Canvas son objetos que heredan de la clase 'Displayable'.

    Todo aquello que puede ser mostrado por la pantalla del dispositivo hereda de formadirecta o indirecta de la clase Displayable.

    Para el desarrollo de juegos, el objeto Canvas es el que nos va a resultar ms interesante, yes el que usaremos ms intensivamente a partir del captulo siguiente.

    Descubre miles de cursos como ste en www.mailxmail.com 26

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/interfaz-usuario-alto-nivelhttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 10. Cmo funciona un MIDlet?

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/como-funciona-midlet]

    Vamos a entrar directamente en materia analizando el programa de ejemplo delcaptulo anterior.

    import javax.microedition.midlet.*;import javax.microedition.lcdui.*;

    Con estas dos lneas importamos las clase MIDlet, que es obligatoria para quenuestro programa se ejecute en el dispositivo mvil, y tambin importamos (con lasegunda lnea) los elementos que vamos a utilizar el la interfaz de usuario.

    public class HelloWorld extends MIDlet implements CommandListener { private Command exitCommand; private Display display; private Form screen;

    En la primera lnea declaramos la clase principal del programa, que es pblica.Hereda de la clase MIDLet e implementa la interfaz CommandListener (en concretoimplementaremos el mtodo commandAction()). Tambin declaramos una serie devariables que utilizaremos a continuacin.

    public HelloWorld() { // Obtenemos el objeto Display del midlet. display = Display.getDisplay(this);

    Este es el constructor de la clase. Observa que tiene el mismo nombre que la clase(maysculas y minsculas incluidas) y adems no tiene tipo de retorno, ni siquieravoid.

    Al ejecutarse un MIDlet, ste crea un objeto display, que es el encargado de mostrarinformacin en la pantalla. Para poder utilizarlo, tenemos que obtener unareferencia a este objeto. Esto es lo que hace precisamente la siguiente lneamediante el mtodo getDisplay() del objeto esttico Display.

    // Creamos el comando Salir. exitCommand = new Command("Salir", Command.EXIT,2);

    Un comando es un elemento que nos permite interaccionar con el usuario y lepermite introducir comandos. Para crear un comando creamos una instancia (connew) de la clase Command(). Como parmetro le pasamos el texto del comando, eltipo de comando y la prioridad.

    Disponemos de los siguientes tipos de comandos:

    Comando FuncinOK Confirma una seleccinCANCEL Cancela la accin actualBACK Traslada al usuario a la pantalla anteriorSTOP Detiene una operacinHELP Muestra una ayudaSCREEN Tipo genrico para uso del programador referente a la pantalla actual

    Descubre miles de cursos como ste en www.mailxmail.com 27

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/como-funciona-midlethttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • SCREEN Tipo genrico para uso del programador referente a la pantalla actualITEM Tipo genrico para uso del programador referente a un elementode la pantalla actual

    A veces, y dependiendo del modelo y marca del dispositivo, slo se pueden mostrarun nmero limitado de comandos en la pantalla. Al resto se acceder mediante unmen.

    El tercer parmetro nos permite dar ms prioridad a unos comandos que a otros a lahora de mostrarlos en la pantalla.

    // Aadimos el comando Salir e indicamos que clase lo manejar screen.addCommand(exitCommand); screen.setCommandListener(this);

    Nos resta aadir el comando (mediante el mtodo addCommand() del objetoscreen) a la lista de comandos y establecer que clase permanece a la "escucha" deesos comandos utilizando la clase setCommandListener(). En este caso, el mtodoencargado de procesar los comandos estn dentro de la propia clase HelloWorld,por lo que utilizamos el operador this. Si quisiramos tener una clase separadaencargada de procesar los comandos, la indicaramos aqu. En concreto, el mtodoque se encarga de procesar los comandos es commandAction(). Para eliminar uncomando podemos utilizar removeCommand(Command cmd).

    public void commandAction(Command c, Displayable s) { / / Salir if (c == exitCommand) { destroyApp(false); notifyDestroyed(); } }Cuando el usuario genera un comando, se llama al mtodo commandAction(). Estemtodo recibir dos parmetros. El comando que se gener, y un objeto de la claseDisplayable, que contiene la pantalla del comando.

    Cerraremos la aplicacin con los mtodos destroyApp() y notifyDestroyed().

    // Creamos la pantalla principal (un formulario) screen = new Form("HelloWorld"); // Creamos y aadimos la cadena de texto a la pantalla StringItem saludo = new StringItem("","Hola Mundo..."); screen.append(saludo); Dentro de la pantalla podemos situar diversos elementos grficos. Vamos a crear unobjeto de tipo Form (formulario) como elemento principal de la pantalla. Veremosdentro de este captulo cules son estos elementos.

    Seguidamente creamos una cadena de texto (StringItem) y la aadimos a la pantallaprincipal mediante el mtodo append().

    public void startApp() throws MIDletStateChangeException { // Seleccionamos la pantalla a mostrar display.setCurrent(screen); } Mediante el mtodo setCurrent() del objeto display (aquel del que obtuvimos la

    Descubre miles de cursos como ste en www.mailxmail.com 28

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • referencia al principio del constructor) seleccionamos la pantalla actual para sermostrada. Lo hacemos en el mtodo startApp() que es el que se ejecuta en primerlugar.

    public void pauseApp() {}public void destroyApp(boolean unconditional) {}

    Estas dos lneas pueden parecer extraas, ya que son mtodos vacos (sin cdigo).Como ya vimos, hay que implementar todas las clases heredadas de MIDlet(pauseApp, destroyApp y startApp), por lo que, aunque no contengan cdigo, hayque declararlas.

    Descubre miles de cursos como ste en www.mailxmail.com 29

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 11. Elementos de la interfaz de usuario

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/elementos-interfaz-usuario]

    Ahora que tenemos una idea bsica sobre el funcionamiento de un MIDlet, pasaremos adescribir los elementos grficos de los que disponemos para crear interfaces de usuario.

    Como ya vimos, la clase Screen hereda directamente de Displayable y permite crear lasinterfaces grficas de alto nivel. Un objeto que herede de la clase Screen ser capaz de sermostrado en la pantalla. Disponemos de cuatro clases que heredan de Screen y que nossirven de base para crear las interfaces de usuario. Son Alert, Form, List y TextBox.

    Un MIDlet tpico estar compuesto de varios de estos elementos. Por desgracia, y debido alpequeo tamao de la pantalla, no pueden mostrarse ms de un elemento a la vez, por loque tendremos que ir mostrando el elemento que necesitemos que ocupar toda la pantalla.

    Podemos imaginarlo como una serie de fichas de las cuales slo podemos mostrar una cadavez.

    Para cambiar de una pantalla a otra usamos el mtodo setCurrent de la clase Display (comoya vimos en nuestro ejemplo):

    display.setCurrent(list1); Cada uno de las cuatro clases anteriores dispone de los mtodos (realmente los heredan deScreen):

    - String getTitle() - Devuelve el ttulo de la pantalla-v-oid setTitle(String s) - Establece el ttulo de la pantalla- Ticker getTicker() - Devuelve el ticker de la pantalla-void setTicker(Ticker ticker) - Establece el ticker de la pantalla

    Estos mtodos nos permiten establecer y recoger el Ttulo y el ticker de la pantalla. Un

    Descubre miles de cursos como ste en www.mailxmail.com 30

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/elementos-interfaz-usuariohttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Estos mtodos nos permiten establecer y recoger el Ttulo y el ticker de la pantalla. Unticker es una lnea de texto que aparece en la parte superior de la pantalla con un scrolllateral.

    Descubre miles de cursos como ste en www.mailxmail.com 31

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 12. La clase Alert

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/clase-alert]

    Permiten mostrar una pantalla de texto durante un tiempo o hasta que se produzcaun comando de tipo OK. Se utiliza para mostrar errores u otro tipo de mensajes alusuario.

    Para crear una alerta utilizamos su constructor que tiene la siguiente forma:

    Alert (String ttulo, String texto_alerta, Image imagen_alerta, AlertTypetipo_alerta) El ttulo aparecer en la parte superior de la pantalla. El texto de alerta contiene elcuerpo del mensaje que queremos mostrar. El siguiente parmetro es una imagenque se mostrar junto al mensaje. Si no queremos imagen le pasamos null comoparmetro. El tipo de alerta puede ser uno de los siguientes:

    ALARMCONFIRMATIONERRORINFOWARNING

    La diferencia entre uno y otro tipo de alerta es bsicamente el tipo de sonido oefecto que produce el dispositivo. Vemos un ejemplo:

    Alert alerta = new Alert ("Error","El dato no es vlido", null, AlertType.ERROR);Y la siguiente lnea mostrar la alerta:

    display.setCurrent(alerta); Lo har durante 1 2 segundos. Se puede establecer el tiempo del mensaje con elmtodo

    setTimeout(int tiempo) donde podemos especificar el tiempo en milisegundos. Tambin podemos hacer queel mensaje se mantenga hasta que se pulse un botn del dispositivo de la siguientemanera:

    alerta.setTimeout(Alert.FOREVER);

    Descubre miles de cursos como ste en www.mailxmail.com 32

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/clase-alerthttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • La clase List.- Mediante la clase List podemos crear listas de elementosseleccionables.

    Veamos el constructor:

    List (String ttulo, int tipo_lista, String[] elementos, image[] imgenes)Los posibles tipos de lista son:

    EXCLUSIVE - Slo se puede seleccionar un elementoIMPLICIT - Se selecciona el elemento que tiene el focoMULTIPLE - Permite la seleccin mltipleUn ejemplo real:

    String[] ciudades = {"Mlaga", "Madrid", "Melilla"};List lista = new List ("Seleccione una ciudad", List.EXCLUSIVE, ciudades, null);

    En las listas de tipo EXCLUSIVE e IMPLICIT se puede utilizar el mtodogetSelectedIndex() que retorna el ndice del elemento seleccionado. Pasando comoparmetro el ndice al mtodo getString() nos devuelve el texto del elementoseleccionado. En listas de tipo MULTIPLE podemos utilizar el mtodo:

    int getSelectedFlags(boolean[] array_seleccionados)

    Esta funcin rellenar el array de tipo booleano que le pasamos como parmetrocon valores true o false segn el elemento correspondiente est seleccionado.Evidentemente, el array debe tener una correspondencia uno a uno en nmero deelementos con la lista.

    Descubre miles de cursos como ste en www.mailxmail.com 33

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 13. La clase TextBox

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/clase-textbox]

    La clase TextBox permite introducir y editar texto a pantalla completa. Es como unpequeo editor de textos.

    Veamos el constructor:

    TextBox (String ttulo, String texto, int tamao_max, int limitacin) Las limitaciones pueden ser alguna de los siguientes:

    ANY - Sin limitacinEMAILADDR - Slo una direccin de emailNUMERIC - Slo se permiten nmerosPASSWORD - Los caracteres no sern visiblesPHONENUMBER - Slo nmeros de telefonoURL - Slo direcciones URL

    El parmetro tamao_max indica el mximo nmero de caracteres que se puedenintroducir. El parmetro texto es el texto inicial que mostrar la caja.

    TextBox texto = new TextBox ("Mensaje", "", 256, TextField.ANY); Para conocer el texto que contiene la caja puede usarse los mtodos siguientes:

    String getString()

    int getChars (char[] texto) En el caso de getChars(), el texto ser almacenado en la variable texto en forma dearray de caracteres.

    La clase Form.- Un Form es un elemento de tipo contenedor, es decir, es capaz decontener una serie de elementos visuales con los que podemos construir interfacesms elaboradas. Los elementos que podemos aadir a un formulario son:

    StringItemImageItemTextFieldDateFieldChoiceGroupGauge

    Descubre miles de cursos como ste en www.mailxmail.com 34

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/clase-textboxhttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Como vemos en el diagrama, la clase Form es capaz de manejar objetos derivadosde la clase Item. La clase Item representa a un elemento visual que no ocupar todala pantalla, sino que formar parte de la interfaz de usuario junto con otroselementos.

    Ya hemos visto un ejemplo de la clase Form en el programa de ejemplo del anteriorcaptulo. En el ejemplo, creamos un elemento de tipo StringItem y lo aadimos alformulario con el mtodo append().

    Los mtodos de la clase Form que nos permiten aadir, eliminar y modificarelementos del formulario son las siguientes:

    int append(Item elemento) Como ya sabes, append() aade al formulario un elemento. Cada vez que aadimosalgo al formulario, a ste se le asocia un nmero de ndice para poder hacerreferencia a l posteriormente. El primer elemento que aadamos tendr el valorcero, y as sucesivamente. Si todo va bien, el mtodo retornar el ndice del elemento.

    void delete(int ndice) El mtodo delete() elimina un elemento del formulario.

    void insert(int ndice, Item elemento) El mtodo insert() inserta un elemento en la posicin que indiquemos en el primerparmetro.

    Si lo que queremos es sustituir un elemento por otro utilizaremos el mtodo set():

    void set(int ndice, Item elemento) En algn momento es posible que necesitemos conocer el nmero de elementos delformulario. El mtodo size() nos muestra esta informacin:

    int size() Por ltimo, necesitaremos algn mecanismo que nos permitan responder a cambiosen los elementos como, por ejemplo, un cambio de valor. El mecanismo es similar alde los comandos que vimos algunas lneas atrs. Hemos de implementar la interfaceItemStateListener. Concretamente el mtodo siguiente:

    void itemStateChanged(Item elemento) Para indicar al formulario cul ser la clase que responder a los eventos podemosutilizar:

    Descubre miles de cursos como ste en www.mailxmail.com 35

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • formulario.setItemStateListener(this); Si la clase que manejar los eventos es distinta a la que contiene el formulariosustituiremos el operando this por la clase deseada.

    La clase StringItem.- Esta clase ya la conocemos del ejemplo del captulo anterior.Su funcin es aadir etiquetas de texto al formulario.

    El constructor de la clase StringItem es el siguiente:

    StringItem (String etiqueta, String texto) Si slo queremos mostrar un texto, sin etiqueta, paramos una cadena vaca comoprimer parmetro ("").

    Como vimos antes, slo hay que utilizar el mtodo append() de la clase Form paraaadir el texto.

    La clase StringItem nos provee adems de dos mtodos:

    String getText()

    void setText(String texto)

    El primer mtodo devuelve el texto de un StringItem, el segundo, establece el textoque le pasamos como parmetro.

    La clase ImageItem.- Con esta clase podemos aadir elementos grficos a unformulario. El constructor tiene la siguiente forma:

    ImageItem (String etiqueta, Image img, int layout, String texto_alternativo) El parmetro texto_alternativo es un texto que se mostrar en el caso en el que nosea posible mostrar el grfico. El parmetro layout indica cmo se posicionar elgrfico en la pantalla. Sus posibles valores son:

    LAYOUT_DEFAULTLAYOUT_LEFTLAYOUT_RIGHTLAYOUT_CENTERLAYOUT_NEWLINE_BEFORELAYOUT_NEWLINE_AFTER

    Las cuatro primeras son auto explicativas. LAYOUT_NEWLINE_BEFORE aade unsalto de lnea antes de colocar la imagen. LAYOUT_NEWLINE_AFTER hace

    Descubre miles de cursos como ste en www.mailxmail.com 36

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • precisamente lo contrario, primero aade la imagen y despus un salto de lnea.

    Para cargar una imagen, utilizamos el mtodo createImage() de la clase Image.Veamos un ejemplo:

    Image img;try { img = Image.createImage("/logo.png");} catch (IOException e) { System.err.println("Error: " + e);}Aadir la imagen al formulario es similar a cmo lo hacemos con un StringItem:

    ImageItem img = new ImageItem ("", "/logo.png" ,ImageItem.LAYOUT_DEFAULT,"logotipo");

    formulario.append(img); Hay que tener en cuenta que las imgenes han de almacenarse en el directorio 'res'que crea KToolBar, por lo tanto la barra ( / ) hace referencia a la raz de estedirectorio.

    La clase TextField.- La clase TextField es muy similar a la clase TextBox que yavimos anteriormente. La principal diferencia es que TextField est diseada paraintegrarse dentro de un formulario en vez de ocupar toda la pantalla.

    El constructor de esta clase es similar al de TextBox:

    TextField (String etiqueta, String texto, int tamao_max, int limitacin)Los parmetros tienen el mismo significado que TextBox, exepto el primero, quepermite especificar una etiqueta.

    La clase DateField.- Con DateField tenemos una herramienta muy intuitiva quepermite la entrada de datos de tipo fecha o tipo hora.

    DateField (String etiqueta, int modo) El parmetro modo puede tomar cualquiera de los siguientes valores:

    DATETIMEDATE_TIMEPara seleccionar la entrada de una fecha o una hora.

    Descubre miles de cursos como ste en www.mailxmail.com 37

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • DateField fecha=new DateField("fecha",DateField.DATE);formulario.append (fecha); La clase DateField nos provee estos dos mtodos:

    Date getDate()void setDate (Date fecha)El primer mtodo recupera el valor del elemento DateField, y el segundo loestablece.

    La clase ChoiceGroup.- Este elemento es similar a la clase List, pero al igual que DateField, puede incluirse en un formulario, de hecho, su constructor esbsicamente el mismo que el de List:

    ChoiceGroup (String etiqueta, int tipo_lista, String[] elementos, image[]imgenes) Excepto el primer parmetro (que ya conocemos), el resto es exactamente el mismoque el de la clase List.

    String[] estados = {"Casado","Soltero","Divorciado","Viudo"};

    ChoiceGroup estado = new ChoiceGroup ("Estado", List.EXCLUSIVE, estados,null);

    screen.append(estado);

    La clase Gauge.- La clase Gauge representa un elemento tipo barra de estados quepermite indicar un valor grficamente.

    El constructor tiene la siguiente forma:

    Gauge (String etiqueta, bolean interactivo, int val_max, int val_ini) Los parmetros val_ini y val_max indican el valor inicial y el valor mximo de la barragrfica. El parmetro interactivo si est a true, permitir al usuario modificar el valorde la barra, si no, slo podr mostrar informacin.

    Descubre miles de cursos como ste en www.mailxmail.com 38

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • La clase Gauge nos ofrece cuatro mtodos muy tiles:

    int getValue()void setValue(int valor)int getMaxValue()void setMaxValue(int valor)

    Las dos primeros para establecer y recoger el valor del Gauge, y las otras tienen elcometido de establecer y recoger el valor mximo del Gauge.

    Gauge estado = new Gauge ("estado", false, 1, 100);fomulario.append(estado);

    El siguiente programa muestra el uso de varios elementos en un formulario a la vez.

    import javax.microedition.midlet.*;import javax.microedition.lcdui.*;

    public class UI extends MIDlet implements CommandListener { private Command exitCommand; private Display display; private Form screen; public UI() { String[] estados = {"Casado","Soltero","Divorciado","Viudo"}; // Obtenemos el objeto Display del midlet.

    Descubre miles de cursos como ste en www.mailxmail.com 39

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • // Obtenemos el objeto Display del midlet. display = Display.getDisplay(this); // Creamos el comando Salir. exitCommand = new Command("Salir", Command.EXIT,2); // Creamos la pantalla principal (un formulario) screen = new Form("Interfaz de usuario"); // Creamos y aadimos los elemento que vamos a utilizar TextField nombre = new TextField("Nombre","",30,TextField.ANY); DateField fecha_nac = new DateField("Fecha de nacimiento", DateField.DATE); ChoiceGroup estado = new ChoiceGroup("Estado",List.EXCLUSIVE,estados,null); screen.append(nombre); screen.append(fecha_nac); screen.append(estado); // Aadimos el comando Salir e indicamos que clase lo manejar screen.addCommand(exitCommand); screen.setCommandListener(this); }

    public void startApp() throws MIDletStateChangeException { // Seleccionamos la pantalla a mostrar display.setCurrent(screen); } public void pauseApp() { } public void destroyApp(boolean incondicional) { } public void commandAction(Command c, Displayable s) { / / Salir if (c == exitCommand) { destroyApp(false); notifyDestroyed(); } }}

    Descubre miles de cursos como ste en www.mailxmail.com 40

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 14. La interfaz grfica de bajo nivel

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/interfaz-grafica-bajo-nivel]

    Cuando se dise J2ME, los ingenieros de Sun ya saban que una de las claves para que sutecnologa tuviera xito era que tena que ser capaz de hacer funcionar juegos, y hacerlo deforma medianamente decente. Para ello deban dotar a los MIDlets de la capacidad decontrolar la pantalla al ms bajo nivel posible, es decir, a nivel grfico.

    En el captulo anterior, hemos profundizado en las clases que nos permitan trabajar coninterfaces de usuario. Todas ellas derivaban de la clase Screen, que a su vez derivaba deDisplayable. Si nos fijamos en el diagrama de clases vemos como de Displayable tambinderiva la clase Canvas. Esta clase es capaz de mostrar informacin grfica a nivel de pxel.Es por ellos que la llamamos interfaz de bajo nivel.

    Bsicamente podemos realizar tres operaciones sobre un Canvas:

    Dibujar primitivas grficasEscribir textoDibujar imgenesEs este captulo vamos a cubrir estas operaciones, y as sentar las bases necesarias paraabordar las materias concretas relativas a la programacin de videojuegos.

    Tal y como hicimos en el anterior captulo utilizaremos un cdigo de ejemplo para irexplicando sobre l los conceptos bsicos.

    import javax.microedition.midlet.*;import javax.microedition.lcdui.*;

    public class Canvas1 extends MIDlet implements CommandListener {

    private Command exitCommand; private Display display; private SSCanvas screen;

    public Canvas1() { display=Display.getDisplay(this); exitCommand = new Command("Salir",Command.SCREEN,2);

    screen=new SSCanvas(); screen.addCommand(exitCommand); screen.setCommandListener(this); } public void startApp() throws MIDletStateChangeException {

    Descubre miles de cursos como ste en www.mailxmail.com 41

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/interfaz-grafica-bajo-nivelhttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • display.setCurrent(screen); }

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {}

    public void commandAction(Command c, Displayable s) {

    if (c == exitCommand) { destroyApp(false); notifyDestroyed(); }

    } }

    class SSCanvas extends Canvas {

    public void paint(Graphics g) {

    g.setColor(255,255,255); g.fillRect (0, 0, getWidth(), getHeight());

    q.setColor(10,200,100); g.drawLine (0, 0, 100, 100); g.fillRect (50, 50, 30, 30); }}

    La Primera parte del cdigo, es decir, la clase Canvas1 debe ya sernos familiar. La nicadiferencia con el cdigo del captulo anterior, es que, en lugar de utilizar un objeto de laclase Form como pantalla principal de la aplicacin, utilizamos uno derivado de la claseSSCanvas que implementamos justo debajo.

    private SSCanvas screen;Como puedes observar, la clase SSCanvas hereda de la clase Canvas. Es por ello quepodemos utilizarla como pantalla principal (recuerda que Canvas es una clase derivada deDisplayable).

    class SSCanvas extends Canvas {La clase SSCanvas implementa el mtodo paint(), que hereda de la clase Canvas. ste es elmtodo que se invoca cada vez que la pantalla necesita ser redibujada. Por lo tanto, todo elcdigo encargado de pintar en la pantalla ha de situarse aqu.

    public void paint(Graphics g) { El parmetro g, es el llamado contexto grfico, que es de tipo Graphics. Esta clase posee losmtodos necesarios para dibujar en pantalla, mostrar grficos y mostrar textos. Lassiguientes lneas se ocupan de borrar la pantalla y dibujar una lnea y un rectnguloutilizando los mtodos de la clase Graphics.

    Vamos a entrar a continuacin en detalles sobre los mtodos de esta clase.

    Primitivas Grficas.-

    Colores: en la naturaleza hay millones de posibles tonalidades de color. necesitamos puesun mtodo que nos permita expresar un color concreto de una gama muy amplia. Newton,experimentando con un prisma de vidrio, constat como la luz poda descomponerse enuna serie de colores bsicos. Lo cierto es que este experimento slo trataba de reproducir loque en la naturaleza conocemos como arco iris, que se produce por la difraccin de la luz alatravesar las gotas de agua. Un color, por lo tanto, se forma a partir de las distintasaportaciones de los colores bsicos. Segn predomine ms o menos cada color bsico, el

    Descubre miles de cursos como ste en www.mailxmail.com 42

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • aportaciones de los colores bsicos. Segn predomine ms o menos cada color bsico, elcolor resultante ser distinto. Utilizando esta misma tcnica, en informtica utilizamos trescolores bsicos para especificar colores complejos. Estos colores son el Rojo, el Verde y elAzul, y abreviamos con RGB (de Red, Green y Blue).

    Cdigo RGB Color255, 0, 0 Rojo0, 255, 0 Verde0, 0, 255 Azul128, 0, 0 Rojo oscuro255, 255, 0 Amarillo0, 0, 0 Negro255, 255, 255 Blanco128, 128, 128 Gris

    Para especificar el color que queremos utilizar al dibujar en la pantalla utilizamos el mtodo setColor() de la clase Graphics.

    void setColor(int rojo, int verde, int azul) Los parmetros de color tienen un rango de 0 a 255.

    Pero, no todos los dispositivos poseen pantalla a color. El siguiente mtodo establece untono de gris dentro de la grama de grises de una pantalla monocromo.

    void setGrayScale(int tono) El parmetro tono puede tomar un valor entre 0 y 255.

    Primitivas.- Aunque no vamos a necesitarlas muy a menudo para desarrollar nuestrosjuegos, es interesante que conozcamos las primitivas bsicas con las que contamos paradibujar.

    void drawLine (int x1, int y1, int x2, int y2) Este mtodo dibuja una lnea que une los puntos de la coordenada (x1, y1) de la pantalla yla coordenada (x2, y2).

    void drawRect (int x, int y, int ancho, int alto) Con drawRect() podemos dibujar rectngulos. Los parmetros x e y indican cual ser laesquina superior izquierda del rectngulo, mientras que los otros dos parmetros nosindican el ancho y el alto que tendr el rectngulo en pxeles.

    En nuestro programa de ejemplo, adems de utilizarlo para dibujar un cuadrado, le hemosasignado la misin de borrar la pantalla. Esto se hace dibujando un rectngulo del tamaode la pantalla del dispositivo y de color blanco.

    void drawRoundRect (int x, int y, int ancho, int alto, int ancho_arco, int alto_arco) Este mtodo es similar a drawRect(), excepto porque sus esquinas son redondeadas. Losotros dos parmetros son al ancho y el alto del arco de las esquinas.

    void drawArc(int x, int y, int ancho, int alto, int ngulo_inicial, int ngulo) Con drawArc() seremos capaces de dibujar secciones de arco. Los cuatro primerosparmetros no deberan necesitar ya explicacin. El permetro ngulo_inicial indica cualser el ngulo a partir del que se comenzar a dibujar el segmento de arco. El parmetrongulo indica la longitud de arco (en grados) que ser dibujado.

    void fillRect (int x, int y, int ancho, int alto)

    void fillRoundRect (int x, int y, int ancho, int alto, int ancho_arco, int alto_arco)

    void fillArc(int x, int y, int ancho, int alto, int ngulo_inicial, int ngulo) Estos tres mtodos son iguales que los anteriores con la diferencia de que la primitiva quedibujan estar rellena. Es decir, dibuja las primitivas como slidas en lugar de huecas.

    Descubre miles de cursos como ste en www.mailxmail.com 43

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Texto.- Aunque estemos trabajando a nivel grfico, es muy probable que necesitemosmostrar informacin textual en pantalla. Un ejemplo claro es el marcador de puntuacin deun juego.

    El mtodo que nos permite escribir texto en un Canvas es:

    void drawString (String texto, int x, int y, int ancla) El primer parmetro es el texto que queremos mostrar. Los parmetros x e y es la posicindonde queremos situar el texto dentro de la pantalla. El cuarto parmetro indica cul es elpunto de referencia para situar el texto en las coordenadas deseadas. Los valores posiblesson TOP, BASELINE y BUTTOM para la posicin vertical del texto y LEFT, HCENTER y RIGHTpara la posicin horizontal del texto. Por ejemplo, si quisiramos posicionar un texto en laposicin 100,100 y con centro en la esquina superior izquierda utilizaremos la siguientelnea:

    g.drawString ("Hola.", 100, 100, Graphics.LEFT | Graphics.TOP);

    Ahora que tenemos control sobre la posicin del texto, nos falta por controlar el tipo deletra que queremos utilizar.

    void setFont(Font fuente)Esta funcin selecciona la fuente a utilizar. El mtodo getFont() de la clase Font nosdevuelve un objeto de tipo Font que podemos utilizar con setFont().

    static Font getFont (int espaciado, int estilo, int tamao) Los valores posibles para estos parmetros son:

    Para... VariablesTamao SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGEEstilo STYLE_PLAIN, STYLE_ITALICS, STYLE_BOLD, STYLE_UNDERLINEDEspaciado FACE_SYSTEM, FACE_MONOSPACE, FACE_PROPORTIONAL

    Veamos un ejemplo:

    Font fuente = Font.getFont (Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,Font.SIZE_MEDIUM);

    g.setFont(fuente);

    Imgenes.- Las primitivas grficas nos permiten ya cierta capacidad de dibujar grficos,pero para crear un videojuego, necesitamos algo ms elaborado. La clase Graphics nosofrece dos mtodos:

    public static Image createImage(String name) throws IOException El mtodo createImage() carga un archivo grfico en formato .PNG. Dependiendo deldispositivo podr soportar ms formatos grficos, pero en principio, al menos, debesoportar el formato .PNG. Recuerda que los grficos (y el resto de recursos, como sonidos,etc...) han de estar en el directorio `res.

    boolean drawImage(Image img, int x, int y, int ancla)

    Descubre miles de cursos como ste en www.mailxmail.com 44

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • El ltimo parmetro es similar al de drawString(). Sus posibles valores son TOP, VCENTER yBUTTON para la posicin vertical y LEFT, HCENTER, RIGHT para la posicin horizontal.

    Veamos un ejemplo:

    Image img = Image.createImage("\logo.png");

    g.drawImage (img, 10, 10, Graphics.HCENTER, Graphics.VCENTER); El siguiente cdigo es un ejemplo real de lo que hemos visto en ste captulo.

    import javax.microedition.midlet.*;import javax.microedition.lcdui.*;

    public class Canvas2 extends MIDlet implements CommandListener {

    private Command exitCommand; private Display display; private SSCanvas screen;

    public Canvas2() { display=Display.getDisplay(this); exitCommand = new Command("Salir",Command.SCREEN,2);

    screen=new SSCanvas(); screen.addCommand(exitCommand); screen.setCommandListener(this); } public void startApp() throws MIDletStateChangeException { display.setCurrent(screen); }

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {}

    public void commandAction(Command c, Displayable s) {

    if (c == exitCommand) { destroyApp(false); notifyDestroyed(); }

    } }

    class SSCanvas extends Canvas {

    Descubre miles de cursos como ste en www.mailxmail.com 45

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • public void paint(Graphics g) {

    Image img=null; // Borrar la pantalla g.setColor(255,255,255); g.fillRect (0, 0, getWidth(), getHeight());

    // Dibujar lnea g.setColor(10,200,100); g.drawLine (0, 80, getWidth(), 80); // Poner texto Font fuente = Font.getFont (Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,Font.SIZE_MEDIUM); g.setFont(fuente); g.drawString("J2ME", getWidth()/2, 10,Graphics.BASELINE|Graphics.HCENTER); // Cargar y mostrar grfico try { img = Image.createImage("/logo.png"); } catch (Exception e) { System.err.println("error: " + e); }

    g.drawImage (img, getWidth()/2, 40, Graphics.HCENTER|Graphics.VCENTER); }}

    Descubre miles de cursos como ste en www.mailxmail.com 46

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 15. Sprites

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/sprites]

    Durante los captulos siguientes se profundiza en los diferentes aspectosconcernientes a la programacin de videojuegos. Ya dispones de las herramientasnecesarias para emprender la aventura, as que sintate cmodamente, flexiona tusdedos y preprate para la diversin. Para ilustrar las tcnicas que se describirn enlos prximos captulos desarrollaremos un pequeo videojuego. Va a ser un juegosin grandes pretensiones, pero que nos va a ayudar a entender los diferentesaspectos que encierra este fascinante mundo. Nuestro juego va a consistir en lo quese ha dado en llamar shooter en el argot de los videojuegos. Quizs te resulte msfamiliar "matamarcianos". En este tipo de juegos manejamos una nave que tiene queir destruyendo a todos los enemigos que se pongan en su camino. En nuestro caso,va a estar ambientado en la segunda guerra mundial, y pilotaremos un avin quetendr que destruir una orda de aviones enemigos. El juego es un homenaje almtico 1942.

    Este captulo lo vamos a dedicar a los sprites. Seguro que alguna vez has jugado aSpace Invaders. En este juego, una pequea nave situada en la parte inferior de lapantalla dispara a una gran cantidad de naves enemigas que van bajando por lapantalla hacia el jugador. Pues bien, nuestra nave es un sprite, al igual que losenemigos, las balas y los escudos. Podemos decir que un sprite es un elementogrfico determinado (una nave, un coche, etc...) que tiene entidad propia y sobre laque podemos definir y modificar ciertos atributos, como la posicin en la pantalla, sies o no visible, etc... Un sprite, pues, tiene capacidad de movimiento. Distinguimosdos tipos de movimiento en los sprites: el movimiento externo, es decir, elmovimiento del sprite por la pantalla, y el movimiento interno o animacin.

    Para posicionar un sprite en la pantalla hay que especificar sus coordenadas. Escomo el juego de los barquitos, en el que para identificar un cuadrante hay queindicar una letra para el eje vertical (lo llamaremos eje Y) y un nmero para el ejehorizontal (al que llamaremos eje X). En un ordenador, un punto en la pantalla serepresenta de forma parecida. La esquina superior izquierda representa el centro decoordenadas. La figura siguiente muestra el eje de coordenadas en una pantalla conuna resolucin de 320 por 200 pxeles.

    Descubre miles de cursos como ste en www.mailxmail.com 47

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/spriteshttp://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • Un punto se identifica dando la distancia en el eje X al lateral izquierdo de lapantalla y la distancia en el eje Y a la parte superior de la pantalla. Las distancias semiden en pxeles. Si queremos indicar que un sprite est a 100 pxeles de distanciadel eje vertical y 150 del eje horizontal, decimos que est en la coordenada(100,150).

    Imagina ahora que jugamos a un videjuego en el que manejamos a un hombrecillo.Podremos observar cmo mueve las piernas y los brazos segn avanza por lapantalla. ste es el movimiento interno o animacin. La siguiente figura muestra laanimacin del sprite de un gato.

    Otra caracterstica muy interesante de los sprites es que nos permiten detectarcolisiones entre ellos. Esta capacidad es realmente interesante si queremos conocercuando nuestro avin ha chocado con un enemigo o con uno de sus misiles.

    Descubre miles de cursos como ste en www.mailxmail.com 48

    mailxmail - Cursos para compartir lo que sabes

    http://www.mailxmail.comhttp://www.mailxmail.comhttp://www.mailxmail.com

  • 16. Control de sprites

    [http://www.mailxmail.com/curso-programacion-juegos-moviles-j2me/control-sprites]

    Vamos a realizar una pequea librera (y cuando digo pequea, quiero decirrealmente pequea) para el manejo de los sprites. Luego utilizaremos esta libreraen nuestro juego, por supuesto, tambin puedes utilizarla en tus propios juegos, ascomo ampliarla, ya que cubrir slo los aspectos bsicos en lo referente a sprites.

    Dotaremos a nuestra