Memoria del proyecto Autor: Mario Macas Lloret Tutor: Agustn Trujillo Pino Facultad de Informtica !niversidad de "as Palmas de #ran $anaria $urso %&&'(&) Prlogo *ste proyecto de fin de carrera trata sobre la creacin de aplicaciones de entretenimiento para aparatos de telefona mvil u otros dispositivos de recursos computacionales limitados+ como PDAs, -e .a .ec.o .incapi/ en aplicaciones multimedia y de entretenimiento+ tales como videojuegos+ ya 0ue son las 0ue .oy en da disfrutan de una mayor e1tensin dentro del sector de la telefona mvil+ con un mercado 0ue ao a ao se incrementa enormemente, *l proyecto se .a dividido en dos partes diferenciadas: la primera+ donde se estudian las diferentes metodologas y .erramientas para la creacin de aplicaciones mviles+ y segunda+ donde se entra de lleno en las t/cnicas de programacin de videojuegos+ desde un punto de vista principalmente de la ingeniera del soft2are, Tras el primer captulo+ 0ue pretende mostrar al lector en las motivaciones del proyecto+ viene la primera parte+ donde se estudian los diferentes sistemas disponibles para la programacin de aplicaciones mviles 3captulo %4+ se comenta la tecnologa 5%6*+ escogida para la reali7acin del proyecto 3captulo 84+ los entornos de desarrollo disponibles 3captulo '4+ y las .erramientas 0ue Sun Microsystems+ creador de 5ava+ pone a disposicin de los programadores 3captulo )4, *n la segunda parte se entra de lleno en la programacin en 5ava para mviles+ partiendo de 0ue se conoce el lenguaje 5ava y sus caractersticas+ pero se tiene un conocimiento nulo acerca de las API 0ue Sun proporciona para tal tarea, *l captulo 9 es una introduccin+ con un pe0ueo tutorial en el 0ue se e1plican los conocimientos bsicos de las API de 5%6* para la reali7acin de aplicaciones bsicas e interfaces de usuario, *n el captulo : se entra de lleno en la reali7acin de videojuegos+ donde se comentan las caractersticas deseables de una aplicacin de entretenimiento para un tel/fono mvil+ desde el punto de vista t/cnico+ de ergonoma y de diseo de un videojuego, Todos estos conocimientos se pretenden aplicar en el captulo ;+ con la creacin del primer videojuego+ de corte sencillo+ pero 0ue es un primer intento de sacar a la lu7 las posibilidades creativas de la plataforma, *sto no debe ser suficiente en un proyecto ambicioso como este+ por ello en el captulo < se crea un videojuego de un aspecto ms avan7ado y profesional, -e e1plica la estructura de la aplicacin propuesta y algunas t/cnicas para la reali7acin de $reacin de videojuegos con 5%6* videojuegos avan7ados, #racias a la estructura modular de la aplicacin creada en el captulo <+ en el siguiente captulo se decidi reaprovec.ar gran parte del cdigo+ modificndolo mnimamente+ para crear una librera 0ue permitiera comen7ar nuevos videojuegos con una estructura predefinida+ con el objetivo de facilitar y agili7ar el proceso de creacin, A lo largo del proyecto se .an descubierto m=ltiples campos de utili7acin de las plataformas mviles como .erramientas de ocio, Debido a la imposibilidad de abarcarlos todos+ en el =ltimo captulo+ junto con las conclusiones del proyecto+ se .an descrito numerosas lneas de estudio y desarrollo en las cuales podran dirigirse futuros proyectos, > ' > ndice Prlogo,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8 $aptulo ?,Introduccin al proyecto,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,< ?,?*volucin de la telefona mvil,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,< ?,%*l caso de los videojuegos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,< ?,8-ituacin de *spaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ?,'@Au/ .ace la universidad al respectoB,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ?,)$onclusin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?8 Parte I. Java 2, Micro Edition (J2ME)...............................................................................15 $aptulo %,-istemas de desarrollo y ejecucin de aplicaciones,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?: %,?Ceprogramacin de la CD6 del terminal,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?: %,%Programacin en lenguajes compilados con las API del sistema operativo,,,,,,,,,,,,,,,,,,,,,,,,,,,,?: %,8Programacin en 5%6*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?; %,8,?Programacin mediante libreras estndar de 5%6*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?< %,8,%Programacin con 5%6* estndar E API del fabricante,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%& %,8,8$reacin de interfaces entre el programa y las API,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%& %,'$onclusiones,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%? $aptulo 8,Introduccin a 5%6*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%8 8,?Introduccin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%8 8,%"a ar0uitectura 5%6*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%' 8,8$onfiguraciones,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%' 8,'Perfiles,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%' 8,)Pa0uetes Dpcionales,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%) 8,9$aractersticas de 5%6* frente a 5%-*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%) 8,:Descriptor+ 6anifiesto y 6IDlet,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%: $aptulo ',*ntornos de desarrollo,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%< ',?Intellij ID*A,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%< ',%FetGeans ID*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8? ',8*clipse,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8% ','*l elemento esencial: 5%6* Hireless ToolIit 3HTJ4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,88 ',)$onclusin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8' $aptulo ),!tili7acin de 5%6* Hireless ToolJit 3HTJ4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8: ),?Default Device -election,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8: ),%Preferences,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8: ),8Cun 6IDP application,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8: ),'JToolbar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8; Parte II. Programacin de videojego!..........................................................................."# $aptulo 9,Programacin en 5%6*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'? 9,?Introduccin a los 6IDlets,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'? 9,?,?$iclo de vida de un 6IDlet,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'? 9,%Interfaces de usuario,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'% 9,%,?Interfa7 de alto nivel,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'% 9,%,%Interfa7 de bajo nivel,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'' 9,8!n ejemplo prctico,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,') 9,8,?$reacin y configuracin del proyecto,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,') 9,8,%$lase *jemplo,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'9 9,8,8$lase 6enuPrincipal,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,': 9,8,'$lase $onfiguracion,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'; 9,8,)$lase "ien7o,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'< 9,8,9$ompilacin+ prueba y empa0uetado,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)? $aptulo :,$riterios de diseo de un videojuego sobre una plataforma mvil,,,,,,,,,,,,,,,)8 :,?$rear un buen videojuego,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)8 :,%Factores t/cnicos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)8 :,8Factores de ergonoma,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)' :,8,?$ontroles,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)' :,8,%Pantalla,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)9 :,'$onsejos para la mejora de la jugabilidad,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,): $aptulo ;,*l primer juego,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)< ;,?*structura de la aplicacin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)< ;,%"a clase Tarea5uego,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9? $aptulo <,$reacin de un videojuego avan7ado,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9: <,?$aractersticas 3deseables4 de un videojuego,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9; <,%*structura de la aplicacin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9< <,8*l contenedor de todo: #estor*lementos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:& <,'#estor#rafico+ lien7o de pintura y manejador de eventos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:8 <,)*l n=cleo de todo: #estor5uego,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:8 <,),?-incroni7acin avan7ada,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:' <,9"os niveles del juego: la clase Fase,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:: <,:$lase Dbjeto6ovil y derivadas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:< <,:,?$aractersticas de Dbjeto6ovil,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;& <,:,%$lase *nemigo,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;& <,:,8$lase Disparo,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;? <,:,'$lase Dption,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;? <,;"a gestin del sonido,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;? <,;,?"a clase 6ediaPlayer,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;? <,;,%"a clase #estor-onidos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;% $aptulo ?&,$reacin de una librera para la programacin de videojuegos,,,,,,,,,,,,,,,,,,;8 ?&,?$ambios reali7ados,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;' ?&,?,?$lase #estor5uego,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;' ?&,?,%$lase #estor*lementos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;' ?&,?,8$lase #estor-onidos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;' ?&,?,'$lase Protagonista,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;' ?&,?,)$lase Fase,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;' ?&,%!tili7acin de la librera para la creacin de videojuegos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;) $aptulo ??,$onclusiones y lneas abiertas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;: ??,?$onclusiones,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;: ??,%"neas abiertas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;; ??,%,?$reacin de un entorno de desarrollo de videojuegos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;; ??,%,%Dtras lneas abiertas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<? Parte III. Java 2, Micro Edition (J2ME).............................................................................#" Ap/ndice A, 5avaDoc de la librera para la creacin de videojuegos,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<) Ap/ndice G, $digo fuente del videojuego K*scabec.inaL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?%) Ap/ndice $, $digo fuente del videojuego de demostracin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?8) Gibliografa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?9: $ap%tlo 1. $ap%tlo 1. Introdccin al proyecto Introdccin al proyecto *ste captulo+ a modo de introduccin+ pretende describir la evolucin de la telefona mvil a nivel mundial, 1.1 Evolcin de la tele&on%a mvil Fue en ?<<)+ cuando en nuestro pas empe7aron a implantarse las primeras operadoras de telefona mvil de segunda generacin, Al principio era un servicio principalmente utili7ado en el ambiente empresarial y por una minora de particulares, Fue a partir de ?<<< 0ue el mercado de la telefona mvil sufri un brutal incremento: el tel/fono mvil empe7 a populari7arse de tal manera 0ue .oy en da es un elemento .abitual y casi indispensable en el estilo de vida de los pases desarrollados, *ste boom en las ventas+ estrec.amente relacionado con una gran evolucin tecnolgica 3mviles cada da ms pe0ueos+ baratos y con ms funcionalidades4 .a dado pie a 0ue cada da se introdu7can ms empresas en el mercado de los servicios a mviles, *n la figura ?,? se muestra una evolucin apro1imada de los ingresos y reas de negocio de los servicios de datos para usuarios dom/sticos bajo telefona mvil, 1.2 El ca!o de lo! videojego! *ste proyecto estar dedicado a la creacin de videojuegos para tel/fonos mviles+ por lo 0ue a.ora nos centraremos en los datos econmicos de dic.o rea, Me a0u unos Figura 1.1: evolucin de las reas de negocio de los servicios de datos de la telefona mvil $reacin de videojuegos con 5%6* datos de inter/s: -eg=n los estudios de FoIia+ los ingresos de las operadoras mediante la venta de videojuegos mviles pasara del 8N en %&&8 al ??N en %&&;, *stamos .ablando de un incremento del "'() en cinco a*o!, -un public los siguientes datos en la Java E+po ,(-: -eg=n estimaciones+ se producen mundialmente ms de ?) millones de descargas de juegos 5ava cada mes, Masta %&&%+ Oodafone 5apn report %) millones de descargas de juegos, *n mayo de %&&8+ la compaa japonesa FTT>Do$o6o reportaba entre ?&&,&&& y %&&,&&& descargas diarias, Desde su creacin en octubre de %&&8+ .asta mediados de %&&'+ el servicio Oodafone "iveP Ceport 8 millones de descargas, Durante %&&8+ Telefnica 6viles vendi 8 millones de aplicaciones 5ava, Debido al fuerte y continuo crecimiento de la telefona mvil+ estos datos son actualmente obsoletos+ pero si los combinamos con las e1pectativas de crecimiento anteriormente e1puestas+ estamos ante un gran mercado emergente 0ue mueve varios miles de millones de euros al ao+ y 0ue proporciona miles de puestos de trabajo, Aparte de estos datos+ est contabili7ado 0ue la industria del videojuego en general 3no slo de telefona mvil4+ .oy en da mueve ms dinero 0ue la propia industria cinematogrfica, $omo =ltimo apunte de este apartado+ es digno de tener en consideracin el siguiente artculo periodstico e1trado de LaFlecha.net: El mercado de juegos en mviles superar los 1.000 millones de dlares Las compaas de videojuegos y de telefona mvil estn destinadas a hacer dinero este ao gracias a la creciente tendencia de los clientes a utilizar sus mviles para destruir a invasores del espacio o golpear olas en campos de golf virtuales! llevando a este mercado a superar los 1.000 millones de dlares! seg"n un estudio. 12:00 - 29/10/2004 | Fuente: REUTERS Segn la consultora Screen Digest, con see en !onres, el "uego en los tel#$onos %&'iles > ?& > Introduccin al proyecto ta%(i#n crecer) %)s e seis 'eces, *asta los +,400 %illones e &lares, entre el a-o 2004 . el $inal e la #caa, /ctual%ente, 0a1&n . 2orea 'an (astante 1or elante e 3ortea%#rica . Euro1a en ta%a-o e %ercao, . su1onen casi el 40 1or ciento e toos los ingresos eri'aos e los "uegos . las escargas, i"o el "ue'es Screen Digest, Un con$uso la(erinto e tari$as 1ara escargas . "uegos co(raas 1or las o1eraoras %&'iles en Euro1a est) reucieno el creci%iento en la regi&n, i"o Screen Digest, 56ensa%os 7ue las o1eraoras %&'iles en Euro1a an no tienen las estrategias aecuaas 1ara e81lotar este %ercao *asta su co%1leto 1otencial5, i"o el analista "e$e e Screen Digest, 9en :een, !a co%1a-;a a-ai& 7ue se 1re'# 7ue 3ortea%#rica, 1ese a tener un %ercao e tele$on;a %&'il %enos so$isticao 7ue el e Euro1a . /sia, cre<ca a un %a.or rit%o 7ue esas regiones, Frente al 1r&s1ero negocio e los 'ieo"uegos, el naciente %ercao e los "uegos en %&'iles aca(a e e%1e<ar a ar se-ales e 'ia con la llegaa e una nue'a generaci&n e a1aratos . el esarrollo 1or 1arte e co%1a-;as e "uegos e t;tulos e calia 1ara la 1e7ue-a 1antalla, Este %is%o a-o, el gigante e los "uegos Electronic /rts i"o 7ue re$or<ar;a su 1roucci&n e "uegos 1ara %&'iles el 1r&8i%o a-o, sacano cuatro n%eros uno en 'entas co%o 5Fi$a Foot(all5 . 5T*e Si%s5 1ara a1aratos %&'iles, Sus ri'ales Eios, U(iso$t . T=> *an estao ta%(i#n in'irtieno caa 'e< %)s inero en el 1ro%eteor %ercao, 1." .itacin de E!pa*a *spaa+ salvo algunas e1cepciones+ siempre .a sido un pas bastante atrasado en la creacin de videojuegos, -in embargo+ debido a 0ue la creacin de videojuegos para mviles no necesita de los grandes recursos 0ue re0uieren los videojuegos para P$ o consola+ estn empe7ando a aparecer empresas 0ue crean y distribuyen sus videojuegos dentro y fuera de nuestras fronteras, $laros ejemplos de este tipo de empresas son #aelco 6viles 3222,gaelcomoviles,com4+ 6icro5ocs 3222,microjocs,com4+ o #ame"oft Ib/rica 3222,gameloft,com4+ entre otras, A=n as+ es posible 0ue la situacin pudiera ampliarse todava ms si se dispusiera de emprendedores y profesionales suficientemente formados para tal tarea, 1.- /01 2ace la niver!idad al re!pecto3 Tradicionalmente+ el desarrollo de videojuegos .a sido considerado como algo poco > ?? > $reacin de videojuegos con 5%6* serioQ ms un hobbie de informticos 0ue una profesin real, *s por ello 0ue dic.o campo est prcticamente olvidado en los planes de estudio de las ingenieras, *sto provoca un d/ficit de buenos profesionales a la .ora de cubrir los puestos de trabajo 0ue+ si no cambia+ .ar 0ue nuestro pas pierda la oportunidad de posicionarse internacionalmente ante una nueva+ rica y creciente industria, A=n as+ en los =ltimos aos .an empe7ado a surgir asignaturas y cursos en la propia universidad, Me a0u algunos: Curso de rogramacin de video!uegos con "#M$ y M%&' ara mviles+ curso de ?%& .oras impartido por la !niversidad de -alamanca a trav/s de Internet, Curso de rogramacin de video!uegos ara 'C+ curso semi>presencial de <& .oras impartido por la !niversidad de -alamanca, Master en creacin de video!uegos+ de '&& .oras+ impartido por el Institut de Formaci $ontnua de Garcelona y la !niversitat Pompeu Fabra, Master en dise(o y roduccin de video!uegos+ impartido por la !niversidad *uropea de 6adrid, Curso de desarrollo de !uegos or ordenador+ de ?&& .oras+ impartido por la !niversidad $omplutense de 6adrid, &ise(o y creacin de video!uegos+ asignatura de la !niversidad de Dviedo, )raduado Multimedia+ diplomatura de ttulo propio impartida por la !niversitat Dberta de $atalunya y la !niversitat PolitRcnica de $atalunya, Tal y como se observa+ apenas .ay en la universidad espaola asignaturas 0ue permitan aprender las t/cnicas de programacin de videojuegos, *l ingeniero o alumno 0ue desee introducirse o profundi7ar en este campo+ deber .acerlo mediante cursillos o masters respectivamente+ si tiene la suerte de 0ue /stos se impartan en alguna universidad cercana a /l, Dtro dato a tener en cuenta es 0ue estos cursos estn impartidos principalmente por profesores universitarios+ con una escasa presencia de profesionales del mundo empresarial, $onsidero esto como un grave error+ ya 0ue mientras la universidad no se impli0ue ms en el estudio y la ensean7a de los videojuegos+ este campo seguir estando principalmente dominado por el al mundo de la empresa+ donde los profesionales con e1periencia son 0uienes ms puedan aportar a la ensean7a de los conceptos > ?% > Introduccin al proyecto relacionados con la creacin de videojuegos, 1.5 $oncl!in $onsiderando lo e1puesto en este captulo de introduccin+ este proyecto nace con la finalidad de dar un pe0ueo paso ms en la introduccin del desarrollo de videojuegos en el mundo acad/mico, Todo el contenido nace de la investigacin de un alumno de ingeniera informtica en las t/cnicas y m/todos para crear videojuegos+ desde un punto de vista principalmente dedicado a la ingeniera del soft2are+ recogiendo informacin de programadores con e1periencia e intentando aportar nuevas ideas y mejoras, Fo se 0uiere profundi7ar en el diseo grfico o sonoro+ perteneciente a ramas artsticas+ ni en el tema de la computacin grfica+ debido a 0ue en la universidad espaola ya e1isten departamentos 0ue imparten asignaturas de calidad sobre este campo, > ?8 > Parte I, 5ava %+ 6icro *dition 35%6*4 $ap%tlo 2. $ap%tlo 2.
.i!tema! de de!arrollo y .i!tema! de de!arrollo y
ejeccin de aplicacione! ejeccin de aplicacione! *l siguiente captulo es un breve compendio sobre los diferentes m/todos de los 0ue se dispone .oy en da para el desarrollo y ejecucin de aplicaciones sobre aparatos de telefona mvil, 2.1 4eprogramacin de la 45M del terminal *ste es m/todo a utili7ar para los tel/fonos mviles ms antiguos+ los cuales constan de un sencillo sistema operativo y diversas aplicaciones encastadas en una CD6, *n la mayora de los casos+ las .erramientas soft2are necesarias no son ms 0ue un ensamblador y un compilador cru7ado, *ste es un m/todo complicado+ ya 0ue es necesario conocer a fondo el terminal 0ue se est programando y las compaas no suelen facilitar datos t/cnicos sobre el .ard2are de los terminales, Adems+ un simple error puede estropear irreversiblemente el terminal+ .aciendo incluso 0ue /ste pierda la garanta del fabricante, Por todos estos motivos+ este m/todo 0ueda totalmente descartado, 2.2 Programacin en lengaje! compilado! con la! 6PI del !i!tema operativo "os tel/fonos mviles actuales poseen un sistema operativo medianamente sofisticado+ con el 0ue se puede acceder a todas las funciones del terminal mediante unas API proporcionadas por el mismo fabricante, Adems+ suelen disponer de funciones para la carga sencilla de aplicaciones e1ternas desde un P$ dom/stico o desde una red, Para crear aplicaciones con este m/todo+ las .erramientas necesarias son un compilador cru7ado 0ue soporte el sistema operativo y el microprocesador del tel/fono mvil+ y las API de dic.o sistema, *stas .erramientas suelen ser proporcionadas por el fabricante+ en muc.os casos de manera gratuita, *l diagrama de la figura %,% muestra+ de manera simplificada+ la estructura mediante la cual funcionara un programa creado seg=n el presente m/todo, $reacin de videojuegos con 5%6* -on varias las ventajas 0ue pueden decantarnos a reali7ar aplicaciones mediante esta metodologa: -encille7 de programacin+ debido a las facilidades de los lenguajes de alto nivel y la e1tensa documentacin 0ue los fabricantes suelen proporcionar sobre las APIs, Al ser un lenguaje compilado+ podremos acceder a todas las funciones del dispositivo mvil obteniendo un rendimiento muy alto, -in embargo+ tambi/n .ay inconvenientes 0ue .acen 0ue esta metodologa pueda no ser la ms adecuada para nuestra aplicacin: Fo todos los dispositivos mviles disponen de .erramientas y libreras para ser programados a tan bajo nivel, 6uc.os fabricantes actuales se decantan por dar soporte a aplicaciones 5ava en los mviles y descartan 0ue puedan ser programados a un nivel ms bajo de la m0uina virtual, "as API con las 0ue se programa suelen ser =nicamente vlidas para una familia reducida de terminales+ siendo totalmente necesario reescribir gran parte del programa si se desea e1portar a otro modelo o familia de terminales, 2." Programacin en J2ME Actualmente+ la gran mayora de modelos 0ue se fabrican incluyen soporte para tecnologa 5ava % 6icro *dition 35%6*4, *ste es una versin del lenguaje 5ava con ciertas limitaciones para poder ser ejecutado en un dispositivo pe0ueo 3y por tanto+ menos potente4+ y algunas libreras aadidas para poder acceder a las funciones de telefona mvil, Todo esto se ejecuta sobre una m0uina virtual adaptada a estas caractersticas, *n captulos posteriores se describen las caractersticas ms importantes de 5%6*, > ?; > Figura #.1: comilacin y e!ecucin de un rograma ara un sistema oerativo* un hard+are y unas ,'% determinadas. 5ava %+ 6icro *dition 35%6*4 *n este captulo+ clasificaremos las posibilidades de desarrollo de aplicaciones 5%6* en dos distintas: utili7ando =nicamente las libreras estndar de 5%6* 36IDP+ $"D$4+ o utili7ando libreras estndar con libreras especficas del dispositivo, A continuacin sern descritas y estudiados sus pros y sus contras, !na ve7 .ec.o esto+ se propondr una tercera posibilidad: una posibilidad mi1ta+ 0ue intente aprovec.ar las ventajas y minimi7ar los problemas de ambos m/todos de desarrollo, 2.3.1 Programacin mediante libreras estndar de J2ME !tili7ando slo los pa0uetes y libreras estndar de 5ava+ podemos crear aplicaciones 0ue funcionen en cual0uier dispositivo con una configuracin determinada, *n la figura %,? se representa la estructura de un dispositivo mvil ejecutando aplicaciones con este m/todo, *sta configuracin tiene la ventaja de 0ue una ve7 creada una aplicacin para una configuracin determinada de mvil 3especificada en el arc.ivo manifest.mf4+ /sta puede ejecutarse en cual0uier dispositivo 0ue soporte dic.a configuracin, -in embargo+ son varias las desventajas de usar 5ava estndar: -i se compara la figura %,? con la figura %,%+ se podr observar 0ue entre el programa compilado y el .ard2are+ a.ora .ay una capa de soft2are ms gruesa, -i a esto le aadimos las caractersticas de interpretacin del bytecode 5ava+ se obtiene una aplicacin ms lenta 0ue si estuviera programada en $EE 3seg=n algunos autores+ entre ) y %& veces ms lenta4, "a tecnologa de los aparatos de telefona aumenta muc.o ms deprisa 0ue las versiones de 5%6*, *ntonces+ programando con 5%6* estndar no es posible acceder a todas las capacidades multimedia y de conectividad de los terminales ms modernos, Para subsanar esto+ apareci la versin %,& del 6IDP, *sto subsana en parte este problema+ proporcionando nuevas capacidades multimedia y > ?< > Figura #.#: e!ecucin de una alicacin "#M$ estndar sobre un disositivo mvil. $reacin de videojuegos con 5%6* facilidades para la creacin de videojuegosQ el problema es 0ue+ en el momento de ser reali7ado este proyecto+ el porcentaje de tel/fonos con 6IDP %,& es escaso, Adems+ 6IDP %,& se desfasar con el tiempo+ y ser necesario un 6IDP 8,&+ etc,,, 2.3.2 Programacin con J2ME estndar + API del fabricante $on este m/todo 3ver figura %,84 se subsanan los problemas de aprovec.amiento del .ard2are comentados en el apartado anterior, A.ora se consigue acceder a todas las funcionalidades del .ard2are 0ue el fabricante especifi0ue en las API+ pero se vuelve de manera un tanto est=pida a la siguiente situacin: se acaba con la compatibilidad entre dispositivos de diferentes familias, Por tanto+ @de 0u/ sirve programar en un lenguaje lento como es 5ava+ si su principal ventaja es la compatibilidad+ y de esta manera 0ueda eliminadaB $on este m/todo+ cada ve7 0ue se 0uiera e1portar la aplicacin a una familia diferente+ deberemos revisar todo el cdigo y cambiarlo para .acerlo compatible con las nuevas API, *n este proyecto se propone una tercera alternativa para la creacin de aplicaciones 0ue intente minimi7ar el problema comentado anteriormente, 2.3.3 Creacin de interfaces entre el rograma ! las API A menudo+ los terminales de diferentes familias y compaas incluyen funcionalidades similares+ aun0ue a la .ora de programar se utilicen de manera diferente, Aprovec.ando esta caracterstica+ se propone crear un pa0uete 0ue .aga de interfa7 entre el programa y las libreras a la .ora de programar, *ste pa0uete podr ser aprovec.ado en futuras creaciones, De esta manera+ se puede acceder a las funcionalidades comunes avan7adas 0ue > %& > Figura #.-: e!ecucin de una alicacin "#M$ utili.ando las ,'% roorcionadas or el fabricante 5ava %+ 6icro *dition 35%6*4 5%6* no define y+ cada ve7 0ue se 0uiera crear una versin del soft2are para otra familia o fabricante+ tan slo .ay 0ue crear un pa0uete Kinterfa7L nuevo y recompilarlo, *sto no acaba totalmente con el problema de la compatibilidad+ pero permite acceder a funciones avan7adas del .ard2are y se elimina gran parte del coste de crear aplicaciones para el mayor numero de terminales posibles, "a figura %,' muestra de manera simplificada la metodologa a seguir, 2.- $oncl!ione! Descartando la primera alternativa 3reprogramacin de la CD64+ no se puede considerar 0ue ninguna de las opciones propuestas sea mejor 0ue las dems, Todo es cuestin de estudiar caso a caso 0u/ aplicaciones se van a desarrollar y sobre 0u/ dispositivos deben funcionar, A continuacin se describen 0u/ casos pueden ser adecuados para cada metodologa: Desarrollo en $EE o 5ava con las API del fabricante > %? > Figura #./: metodologa de desarrollo de alicaciones multilataforma utili.ando las ,'% de los fabricantes $reacin de videojuegos con 5%6* Fabricacin de aplicaciones a medida para un dispositivo concreto 0ue re0uieran un alto aprovec.amiento de la m0uina, Fabricacin de aplicaciones comerciales para un dispositivo concreto+ como por ejemplo+ una compaa 0ue obtiene una licencia de desarrollo para la consola n>#age y desarrolla un producto 0ue a priori slo va a ser ejecutado en ese dispositivo, *sta metodologa es adecuada para este tipo de aplicaciones+ ya 0ue se considera 0ue la portabilidad es una caracterstica secundaria y 0ueremos obtener el m1imo rendimiento, Desarrollo en 5%6* estndar Aplicaciones 0ue no re0uieran un gran aprovec.amiento de las capacidades del dispositivo, Aplicaciones 0ue re0uieran una portabilidad total de un dispositivo a otro, *n este caso+ y en el momento de ser escrito este documento+ se recomienda la utili7acin de 6IDP ?,&+ ya 0ue la versin %,& es aceptada por un porcentaje todava pe0ueo de dispositivos 5%6*, Desarrollo con 5%6*EAPI utili7ando interfaces Aplicaciones con caractersticas multimedia y de conectividad avan7adas+ 0ue re0uieran caractersticas multimedia y 0ue puedan ser e1portadas a el mayor n=mero posible de dispositivos, *l mejor ejemplo para esto podra ser el de una compaa de videojuegos para tel/fonos mviles+ a la cual le interesa 0ue el producto sea de buena calidad y 0ue pueda ser vendido al mayor n=mero de personas+ las cuales+ obviamente+ poseern dispositivos de familias diferentes, !na ve7 compiladas las aplicaciones para los distintos modelos y familias+ el usuario slo debera especificar su modelo de tel/fono y obtener el videojuego totalmente compatible, > %% > $ap%tlo ". $ap%tlo ".
Introdccin a J2ME Introdccin a J2ME
".1 Introdccin "a plataforma 5ava % 6icro *dition 35%6*4 proporciona un entorno robusto y fle1ible para aplicaciones ejecutadas en dispositivos de escasos recursos+ como tel/fonos mviles+ PDAs+ u otros sistemas encastados, Al igual 0ue el resto de plataformas 5ava+ 5%6* incorpora una m0uina virtual de 5ava y un conjunto de APIs estndar definidas por e1pertos de la comunidad 5ava+ como pueden ser desarrolladores de soft2are+ .ard2are+ o proveedores de servicios, 5%6* dota a los sistemas encastados de las caractersticas de 5ava: portabilidad+ interfaces de usuario fle1ibles+ un robusto sistema de seguridad+ protocolos de red+ y soporte para todo tipo de aplicaciones+ 0ue pueden ser descargadas dinmicamente, "as aplicaciones basadas en las especificaciones 5%6* se escriben una sola ve7 para ser ejecutadas en un amplio rango de dispositivos+ utili7ando las caractersticas particulares de cada uno, Moy en da+ se podra considerar 0ue es la tecnologa de aplicaciones mviles lder del mundo+ en cuanto a dispositivos 0ue la utili7an: prcticamente el ?&&N de los dispositivos mviles de fabricacin reciente, Figura -.1: "#M$ dentro del resto de tecnologas "ava 0fuente: Sun1 $reacin de videojuegos con 5%6* ".2 7a ar8itectra J2ME $omprende una variedad de configuraciones+ perfiles y pa0uetes opcionales para elegir por los desarrolladores, *sto permite construir un entorno 5ava adecuado a los re0uerimientos de la aplicacin y caractersticas del dispositivo, $ada combinacin est optimi7ada para un determinado a.orro de memoria+ potencia de clculo y capacidad de entrada(salida+ seg=n la categora del dispositivo, *l resultado es una plataforma com=n 0ue intenta aprovec.ar todo lo posible las caractersticas de cada dispositivo, "." $on&igracione! "as configuraciones estn formadas por una m0uina virtual y un conjunto mnimo de libreras, Sstas proporcionan la funcionalidad base para un rango particular de dispositivos de similares caractersticas, Actualmente .ay dos configuraciones: Connected Limited &evice Configuration 3$"D$4 :orientada a dispositivos pe0ueos+ como tel/fonos mviles y PDA, Sstos presentan restricciones en cuanto a caractersticas .ard2are+ pero lo ms importante es su reducida conectividad+ ya 0ue poseen una cone1in inalmbrica restringida 3de a. lo de Limited4+ de baja velocidad e intermitente, *ste perfil .ace uso de la JO6 debido a las restricciones de memoria 0ue presentan los dispositivos, Connected &evice Configuration 3$D$4 : basada en la 60uina Oirtual de 5ava clsica, Apta para dispositivos con conectividad de red permanente y robusta+ y sin las limitaciones de tamao y prestaciones de los dispositivos pe0ueos, -e asume un mnimo de )?%Jb de memoria CD6 y %)9Jb de CA6, Dispositivos 0ue cumplen esta configuracin son los -istemas de Favegacin y PDA de gama alta+ entre otros, ".- Per&ile! !na configuracin debe combinarse con un perfil para proporcionar un entorno de ejecucin para una categora de dispositivos especfica, !n perfil es un conjunto de APIs de alto nivel 0ue definen aspectos como el ciclo de vida de la aplicacin+ las interfaces de usuario+ y las propiedades de acceso especficas para el dispositivo, "os perfiles son los siguientes: Foundation rofile 3FP4 : es el perfil de ms bajo nivel, Proporciona una > %' > 5ava %+ 6icro *dition 35%6*4 implementacin con capacidad de cone1in a red+ y es usado por sistemas encastados 0ue no necesiten interfa7 de usuario, Para aplicaciones 0ue re0uieran de interfaces+ se puede combinar con 'ersonal 2asis 'rofile+ e1plicado ms adelante, Mobile %nformation &evice 'rofile 36IDP4 : Diseado para tel/fonos mviles y PDA de gama baja, Dfrece la funcionalidad bsica 0ue re0uieren las aplicaciones mviles+ incluyendo interfa7 de usuario+ conectividad en red+ almacenamiento local de datos y administracin de aplicaciones, $ombinado con $"D$+ proporciona un entorno de ejecucin completo+ aprovec.ando las capacidades de los dispositivos de mano+ y minimi7ando tanto memoria como consumo de energa, 'ersonal 'rofile 3PP4 :utili7ado en dispositivos 0ue necesiten interfaces grficas de usuario o soporte para applets+ como PDAs de gama alta o consolas de videojuegos, Incluye la librera AHT de 5ava y soporta aplicaciones y applets diseados para ejecutarse en entornos de ventanas, 'ersonal 2asis 'rofile 3PGP4 : es un subconjunto de PP+ 0ue proporciona un entorno de aplicacin para dispositivos en red 0ue re0uieran de un nivel bsico de presentacin grfica o 0ue re0uiera el uso de .erramientas grficas especiali7adas para las aplicaciones especficas+ como puedan ser televisores+ ordenadores de a bordo+ o pantallas de informacin, Tanto PP como PGP estn situadas como capas encima de FP, ".5 Pa8ete! 5pcionale! "a plataforma 5%6* puede e1pandirse mediante pa0uetes opcionales, Sstos ofrecen APIs estndar para usar tecnologas como conectividad con bases de datos+ mensajera 2ireless+ multimedia+ Gluetoot.+ servicios 2eb+ etc, ".9 $aracter%!tica! de J2ME &rente a J2.E "as novedades ms importantes 0ue incluye 5%6* frente a la edicin estndar de 5ava 35%-*4 son las siguientes: Tipos de datos : en muc.os casos+ se limitan o eliminan tipos de datos como float o double+ debido al alto coste de memoria y proceso 0ue estos re0uieren, $ada configuracin de terminal dispone de una lista de tipos soportados y cmo se > %) > $reacin de videojuegos con 5%6* comportan respecto a la implementacin original, Preverificacin de cdigo : en 5%-*+ el cdigo se verifica en tiempo de ejecucin, *s decir+ mientras el programa se ejecuta+ la 5O6 3"ava 3irtual Machine4 verifica el tipo de los objetos a los 0ue accedemos+ 0ue no accedamos a objetos null+ 0ue se accede correctamente a los elementos de un array+ y un largo etc/tera,,, De esta manera+ podemos ejecutar cdigo de manera segura, Por cuestiones de rendimiento+ en 5%-* se .a dividido en dos etapas esta verificacin: etapa de preverificacin+ 0ue se reali7a en tiempo de compilacin+ y verificacin online+ 0ue ser reali7a en tiempo de ejecucin, De esta manera+ se aumenta la velocidad de ejecucin de los programas+ pero se rebajan las condiciones de seguridad en las 0ue se trabaja, "ibreras grficas : se .an creado unas libreras grficas ms sencillas+ adaptadas al dispositivo mvil, Ma cambiado la clase )rahics* i .an desaparecido AHT y -2ing para utili7ar una librera de componentes especficos para aplicaciones sobre terminales mviles, Fo e1istencia de punto de entrada a la aplicacin : la 5O6 de 5%-* utili7aba el m/todo main como punto de entrada a la aplicacin y as ceder el control de la m0uina a /sta, "as aplicaciones 5%6* definen unas determinadas funciones+ las cuales son llamadas por el dispositivo mvil+ para cederles el control de la m0uina en momentos puntuales, $on esto se consigue+ por ejemplo+ 0ue cuando recibamos una llamada al tel/fono mientras se utili7a una aplicacin+ se guarde el estado de /sta+ para poder reanudar posteriormente la aplicacin por el punto donde de dej sin perder datos ni trabajo .ec.o, API bsica : /sta est muy limitada+ debido a las restricciones de memoria y potencia de los dispositivos 5ava, As+ encontramos 0ue algunas clases como Math carecen de la inmensa mayora de funciones 0ue posee en 5%-* o 5%**, Incluso la clase 4b!ect es inferior a la de las versiones Standard y $nterrise de 5ava, $omo apunte+ cabe destacar 0ue+ en contra de lo 0ue se afirma en varios libros 3mirar referencias bibliogrficas T#arca %&&8U y TOarios %&&8U4+ 5%6* . posee recolector de basura, Tan slo .ay 0ue observar 8 .ec.os: Ausencia de alg=n mecanismo e1plcito de destruccin para los objetos, > %9 > 5ava %+ 6icro *dition 35%6*4 "os logs del entorno de desarrollo y ejecucin donde muestran las recolecciones de basura reali7adas durante la ejecucin, -e puede llamar e1plcitamente al recolector de basura mediante el comando System.gc01, ".' :e!criptor, Mani&ie!to y MI:let -on tres elementos importantes de cara a la carga y ejecucin de una aplicacin 5%6*, *l descriptor 3V,jad4 y el manifiesto 36anifest,mf4 son fic.eros de te1to 0ue aportan informacin acerca de la aplicacin+ tales como la $onfiguracin o el perfil re0ueridos, *l 6IDlet 3V,jar4 contiene empa0uetada la aplicacin en s+ junto con el fic.ero de manifiesto, "as caractersticas bsicas de descriptor y manifiesto son : 6anifiesto : incluye informacin sobre la aplicacin como es el nombre+ fabricante+ o la versin, Descriptor : informa al programa 0ue se encarga de gestionar las descarga+ instalacin y gestin de las aplicaciones sobre las caractersticas de /stas+ para 0ue el gestor pueda asegurarse 0ue el 6IDlet es adecuado para el dispositivo en concreto, Fo se incluye con el pa0uete+ sino 0ue se consulta antes de descargar la aplicacin, Debido a 0ue las .erramientas actuales se encargan de generar automticamente estos tres elementos y+ adems+ permiten gestionar las caractersticas de /stos mediante una interfa7 grfica+ en este proyecto no se entrar en e1plicar la estructura y funcionamiento de cada uno, > %: > $ap%tlo -. $ap%tlo -. Entorno! de de!arrollo Entorno! de de!arrollo !n buen entorno de desarrollo agili7a la velocidad con la 0ue se programa, Para grandes proyectos+ no basta con el tpico editor de te1to 0ue resalta el l/1ico del lenguaje para facilitar su lectura, *s por ello 0ue la eleccin de un buen entorno+ aun0ue pueda suponer un gasto econmico considerable+ acelera drsticamente el proceso de creacin+ repercutiendo en un menor coste econmico a la .ora de crear proyectos, *n el siguiente captulo se estudian algunos de los ms importantes entornos de desarrollo disponibles para 5avaQ sus pros y sus contras, Al finali7ar se e1plicarn los motivos por los 0ue se .a escogido para el proyecto un entorno en concreto, $abe remarcar 0ue todos los entornos a0u e1puestos son multiplataforma, Todos estn disponibles para Hindo2s y "inu1+ y la mayora de ellos soportan tambi/n otros sistemas menos e1tendidos como 6ac D-+ -olaris+ FreeG-D+ MP>!W+ AIW+ y otros KsaboresL !FIW, -.1 Intellij I:E6 -in duda alguna+ el mejor entorno de desarrollo para 5ava, "as caractersticas para reali7ar esta afirmacin son las siguientes: Interfa7 de usuario muy intuitiva y cuidada, Proceso de navegacin entre arc.ivos+ clases+ m/todos y atributos muy rpido 3ver un ejemplo en la figura ',?4, #eneracin automtica y configurable de cdigo+ con lo 0ue pulsando un par de teclas se pueden generar estructuras de control de flujo+ implementar m/todos de interfaces+ sobrecargar m/todos de funciones padre+ etc, Code comletion: con slo escribir las primeras letras de un elemento+ emerge una ventana con todas las posibilidades+ pudiendo mostrar slo las ms adecuadas, Por ejemplo+ para una asignacin a un String+ podemos mostrar slo los m/todos de una clase 0ue devuelvan String, $on escribir el nombre de una clase+ indica el pa0uete donde se sit=a y lo incluye al cdigo automticamente, *stas son slo algunas de sus innumerables caractersticas+ 0ue a.orran al programador el esfuer7o de memori7ar todos los pa0uetes y las clases+ o 0ue .aya 0ue consultar continuamente la documentacin de los pa0uetes, Oer un ejemplo en la figura ',%, $reacin de videojuegos con 5%6* *l debugger es intuitivo y permite reali7ar el proceso de depuracin de programas ejecutndose en aplicaciones e1ternas, *sto es importante de cara a la programacin de programas 0ue se ejecuten en servidores y+ en el caso de 5%6*+ en un emulador e1terno al entorno, Fo es necesario compilar el cdigo para ver los +arnings y errores del compilador, -e muestran sobre el cdigo escrito+ en el punto e1acto donde se produce, Adems+ da consejos sobre cmo resolverlos, 6uc.as otras caractersticas: integracin con $O-+ soporte W6"+ refactori7acin+ y un largo etc,,, -in embargo+ no todo son ventajas, A continuacin se describen los problemas encontrados: Al estar .ec.o ?&&N en 5ava+ consume muc.os recursos y en ocasiones puede resultar un poco lento, De todas formas+ es bastante ms rpido 0ue otros entornos desarrollados ?&&N en 5ava 3por ejemplo FetGeans4, Precio, !na licencia de FetGeans cuesta )&&X+ .aci/ndolo desaconsejable para un proyecto educativo puntual como esteQ aun0ue una licencia educativa cuesta X?<<, "a licencia incluye soporte t/cnico ilimitado va e>mail+ actuali7aciones gratuitas y un > 8& > Figura /.1: osicionando el ratn sobre un elemento se ueden conocer datos acerca de 5l. Con C67L 8Clic9 se navega hacia la definicin o la clase contenedora 5ava %+ 6icro *dition 35%6*4 '&N de descuento en la compra de futuras versiones, $omo apunte final+ .ay un lugin para poder crear+ compilar y ejecutar programas 5%6* en el entorno de Intelli5 ID*A+ aun0ue es un proyecto poco maduro+ lleno de errores y con pocas caractersticas interesantes, Fo obstante+ a fec.a de 5unio de %&&)+ est anunciada la versin ),& de ID*A+ la cual incorpora soporte para 5%6*, *n conclusin+ estamos ante el mejor entorno de programacin para 5ava, Fo obstante+ debido al precio de la licencia+ /ste no es un entorno adecuado para un proyecto acad/mico+ sobretodo .abiendo como .ay e1celentes buenas alternativas libres+ a precio &, -.2 ;et<ean! I:E *ntorno de desarrollo completo+ con caractersticas similares a Intelli5 ID*A, -in embargo+ al igual 0ue ID*A est escrito ?&&N en 5avaQ el consumo de recursos es inmenso y la velocidad de ejecucin puede llegar a ser desesperante, Fi si0uiera en el e0uipo de desarrollo 3un Pentium IO %+99 #.7 con )?% 6G CA64 se .a podido trabajar con comodidad+ debido a los continuos tiempos de espera entre la accin del usuario y la respuesta del programa, $omo ventajas+ decir 0ue es gratuito y de cdigo abierto+ mediante la licencia Sun > 8? > Figura /.#: con C67L8$sacio se muestra una ventana emergente con informacin acerca de el cdigo :ue uede escribirse en ese lugar $reacin de videojuegos con 5%6* 'ublic License, Y 0ue incorpora una total integracin con las .erramientas de desarrollo para 5%6* 3ver figura ',84, -." Eclip!e 6uy completo entorno de desarrollo respaldado por grandes empresas+ entre ellas IG6, Dfrece gran cantidad de caractersticas de navegacin+ compilacin+ depurado+ auto completado de cdigo+ etc, muy similares a Intellij ID*A 3ver figura ',)4, -in embargo+ la gran ri0ue7a de *clipse es 0ue est ideado para ser muy modular+ con lo 0ue cual0uiera puede aadir caractersticas fcilmente+ mediante pa0uetes 5ava 3ver figura ','4, *l resultado de esto es 0ue .ay disponibles cientos de lugins+ algunos gratuitos+ otros comerciales+ 0ue e1tienden las caractersticas de eclipse .asta donde el programador desee, *l n=cleo est escrito en 5ava+ pero la interfa7 de usuario en $EE, "a consecuencia > 8% > Figura /.-: deurando una alicacin "#M$ con ;et2eans Figura /./: estructura de lugins de $clise 0fuente: eclise.org1 5ava %+ 6icro *dition 35%6*4 de esto es 0ue la velocidad es bastante buena y el consumo de recursos no llega a los e1tremos de los otros entornos de desarrollo, Adems+ est disponible para un gran n=mero de sistemas operativos 3Hindo2s+ "inu1+ 6acD-+ MP>!W+ AIW+ FetG-D+ FreeG-D+ y un largo etc,4 *clipse est distribuido bajo la Common 'ublic License+ por lo 0ue es gratuito y de cdigo abierto, Fo as sus aadidos+ gran parte de los cuales son de pago, *n cuanto a la integracin con 5%6*+ cabe decir 0ue .ay gran cantidad de lugins 0ue permiten esto+ pero el =nico gratuito+ *clipse6*+ todava est en un estado muy prematuro+ con algunos errores y muestra cierta dificultad a la .ora de ser utili7ado cmodamente, -.- El elemento e!encial= J2ME >irele!! ?ool@it (>?A) Todas las funcionalidades 5%6* de cual0uiera de los entornos anteriormente citados dependen de este 9it de .erramientas proporcionado por Sun Microsystems, *ntre las funcionalidades de /ste+ las ms importantes son las siguientes: > 88 > Figura /.<: catura de $clise* donde se muestran caractersticas como el auto comletado de cdigo* navegacin entre clases* etc... $reacin de videojuegos con 5%6* $ompilador de 5ava para las APIs de 5%6*+ incluidas en el proyecto,, Merramientas de creacin y configuracin automtica de descriptor+ manifiesto y 6IDlet, &ebugger+ al cual conectar el entorno de desarrollo e1terno para depurar paso a paso la aplicacin, *muladores varios para probar las aplicaciones sin necesidad de descargarlas en un dispositivo fsico 3ver figura ',94, -.5 $oncl!in Para crear aplicaciones en 5%6*+ el =nico elemento realmente imprescindible es el "#M$ =ireless 6ool9it* ya 0ue es el 0ue proporciona las .erramientas y libreras necesarias+ sobre las 0ue se apoyan los dems entornos de desarrollo, $on HTJ y un simple editor de te1to plano es posible desarrollar cual0uier proyecto, -in embargo+ debido a las ventajas de trabajar con un entorno integrado+ este proyecto se reali7ar con *clipse, $omo el mdulo de integracin con 5%6*+ *clipse 6*+ no est suficientemente maduro+ se utili7ar *clipse tan slo como editor y depurador del proyecto+ y las tareas de compilacin+ ejecucin y emulacin+ se reali7arn directamente > 8' > Figura /.>: "#M$ desu5s de comilar y e!ecutar en un emulador una alicacin 5ava %+ 6icro *dition 35%6*4 sobre el entorno de HTJ, Debido a 0ue *clipse es slo una ayuda no imprescindible y una eleccin personal en cuanto al programa para editar cdigo+ este proyecto no incorporar ning=n tutorial sobre la utili7acin de *clipse o cual0uier otro entorno de desarrollo+ y se asumir 0ue el cdigo fuente se edita desde un editor de te1to com=n, -in embargo+ el siguiente captulo es un tutorial bsico sobre "ava # Micro $dition =ireless 6ool9it+ ya 0ue esta .erramienta es imprescindible a la .ora de crear aplicaciones y es necesario conocer su funcionamiento, > 8) > $ap%tlo 5. $ap%tlo 5. BtiliCacin de J2ME >irele!! BtiliCacin de J2ME >irele!!
?oolAit (>?A) ?oolAit (>?A) *n el siguiente captulo se muestran las diferentes .erramientas 0ue 5%6* HTJ pone a disposicin del programador para crear aplicaciones mviles, Fo se pretende profundi7ar muc.o en el funcionamiento+ tarea destinada a la documentacin oficial de -un 3ver referencia bibliogrfica T-un %&&'U4+ sino mostrar de manera rpida y sencilla cmo crear y testear aplicaciones con este entorno, 5.1 :e&alt :evice .election *sta sencilla .erramienta nos permite seleccionar el dispositivo emulado sobre el cual testear las aplicaciones creadas, A lo largo del proyecto se utili7ar la opcin MediaControlS9in, 5.2 Pre&erence! Fos permite configurar caractersticas avan7adas del entorno de ejecucin+ tales como velocidad+ seguridad+ acceso a red+ etc,,, Durante este proyecto slo se .a utili7ado la funcin K*nable profilingL+ de la pestaa K6onitorL 3figura ),?4+ utili7ada para comprobar los tiempos de ejecucin de cada una de las funciones del programa ejecutado, 6uy =til a la .ora de intentar mejorar el rendimiento de las aplicaciones,,, 5." 4n MI:P application Merramienta utili7ada para ejecutar directamente en un emulador cual0uier aplicacin 5%6*+ seleccionando el arc.ivo V,jad en disco, Figura <.1: &efault &evice Selection Figura <.#: referencias de =6? $reacin de videojuegos con 5%6* 5.- A?oolDar "a .erramienta principal de la suite, $rea+ gestiona+ compila y ejecuta las aplicaciones 5%6*, A continuacin se describen las funciones ms importantes y utili7adas durante la reali7acin de este proyecto: Fe2 project : en el subdirectorio KappsL de la carpeta donde est guardado el HTJ se crea un directorio con el nombre 0ue se introdu7ca en el campo KProject FameL, As mismo+ en el campo K6IDlet $lass FameL se debe introducir el nombre de la clase del 6IDlet+ con la ruta completa+ en el formato de 5ava 3ej: para la clase 6IDlet*jemplo 0ue est en el subdirectorio java(ejemplo(utils+ el nombre sera java,ejemplo,utils,6IDlet*jemplo4, Dpen Project : abre un proyecto ya e1istente en el directorio KappsL del directorio ra7 del HTJ, -ettings : accede a las propiedades del proyecto ya creado, *n este dilogo se puede elegir la configuracin y el perfil de la aplicacin+ as como las API opcionales 0ue utili7a 36obile 6edia API+ 8D API+ Hireless API+ etc,,,4, Tambi/n permite ver y editar el contenido de los arc.ivos Manifest.mf y @.!ad, Guild : compila el cdigo fuente del proyecto, Cun : ejecuta la aplicacin en el emulador, > 8; > Figura <.-: ventana rincial de ?6oolbar Parte II, Programacin de videojuegos $ap%tlo 9. $ap%tlo 9. Programacin en J2ME Programacin en J2ME *l presente captulo pretende ser un tutorial bsico acerca de la programacin para 5%6*, Al final del captulo se e1pone una aplicacin sencilla para ayudar a conocer el funcionamiento de la API de 5%6*, Debido al gran n=mero de libreras de 0ue dispone 5%6* y al tamao de /stas+ slo se e1plicar lo esencial para introducirse el funcionamiento de 5%6* y desarrollar aplicaciones bsicas, Ssto ser suficiente para poder afrontar la programacin de videojuegos de los siguientes temas, -i se desea profundi7ar en el conocimiento de 5%6*+ se recomienda estudiar la documentacin oficial de -un 3.ttp:((java,sun,com(j%me(docs(4 y leer libros avan7ados sobre 5%6*+ como por ejemplo la referencia bibliogrfica A4rti. #BB1C, Tambi/n es recomendable+ mientras se va leyendo el captulo+ consultar la documentacin de las API de 5%6*+ disponibles en el pa0uete de =ireless 6ool9it, 9.1 Introdccin a lo! MI"lets "as aplicaciones de 5%6* no son programas completos+ sino partes 0ue se desarrollan y ejecutan en un entorno limitado por la m0uina virtual+ el perfil y la configuracin, *sto 0uiere decir 0ue carecen de un punto de entrada como puede ser la funcin main de "ava #* Standard $dition, 9.1.1 $iclo de vida de n MI"let *n 5%6*+ ser el "ava ,lication Management 35A64 el 0ue ceda en determinados momentos la ejecucin a la aplicacin: podr decidir cundo se crea o se destruye+ adems de poder sacar temporalmente la aplicacin del estado de ejecucin 3pausarla4, *sto lo .ar llamando a los m/todos start,01+ ause,01+ y destroy,01 definidos en el M%&let, *n la figura 9,? se muestra un diagrama de estados acerca del ciclo de vida de un M%&let, $reacin de videojuegos con 5%6* 9.2 Inter&ace! de !ario May dos maneras de establecer la interaccin entre la aplicacin y el usuario: Interfa7 de alto nivel : conjunto de clases proporcionadas por 5%6* para proporcionar funcionalidades de entrada y salida de datos independientes del dispositivo, *l programador slo necesitar preocuparse de la gestin de los datos+ ya 0ue 5%6* se encargar de dibujar en pantalla y obtener los datos de la manera ms adecuada para el dispositivo donde se est/ ejecutando la aplicacin, Interfa7 de bajo nivel : conjunto de clases para acceder directamente a los recursos del dispositivo 3pantalla+ teclado+ etc,,,4, *l programador se encargar del dibujado en pantalla de dic.a interfa7 y de la gestin de los eventos del teclado+ por lo 0ue puede ser una tarea bastante complicada+ debido a la gran variedad de pantallas+ teclados+ y dispositivos de entrada 0ue e1isten, $omo consecuencia+ una interfa7 programada a bajo nivel puede no funcionar correctamente en algunos dispositivos e1traos e inusuales, Todas las clases destinadas a las interfaces de usuario+ tanto de alto como de bajo nivel+ son subclases de &islayable, Ssta clase tiene dos clases derivadas: Canvas+ para las interfaces de bajo nivel+ y Screen+ para las de alto nivel, #.2.1 Interfa$ de alto ni%el -e crea a partir de las clases derivadas de Screen: Alert : es una pantalla 0ue muestra una informacin al usuario y espera un tiempo antes de mostrar el siguiente elemento &islayable, > '% > Figura >.1ciclo de vida de un M%&let Programacin de videojuegos "ist : una pantalla 0ue muestra una lista de opciones para elegir, Puede ser de tipo *W$"!-IO* o 6!"TIP"*+ para selecciones individuales o m=ltiples respectivamente+ o del tipo I6P"I$IT+ con la cual podremos definir un conjunto de acciones a reali7ar para el elemento seleccionado+ mediante una lista de comandos, Te1tGo1 : es una pantalla 0ue permite al usuario editar te1to, Form : pantalla compuesta por un conjunto de elementos derivados de la clase %tem+ tales como imgenes+ cajas de te1to+ agrupaciones de opciones+ etc,,, A continuacin se describen sus funciones: $.oice#roup : similar a la clase List, Implementan la misma interfa7: Choice, -u funcin es similar+ Choice)rou puede introducirse en un formulario junto con otros elementos, $ustomItem : no tiene ninguna funcionalidad en concreto, *st creado para 0ue mediante subclases de /sta+ el programador pueda crear nuevos elementos de formulario, DateItem : componente editable para presentar y manejar fec.as y .oras, #auge : componente grfico 0ue representa una barra de progreso, Dado un valor entre & y el valor m1imo definido+ dibuja una barra de tamao proporcional a estos valores, ImageItem : elemento 0ue contiene una imagen, -pacer : utili7ado para crear separaciones entre elementos del formulario, Fo permite la interaccin con el usuario, -tringItem : elemento 0ue contiene una cadena de caracteres, -u finalidad es =nicamente informativa+ ya 0ue no es editable por el usuario, Te1tField : componente de te1to editable, -imilar a la clase 6eDt2oD+ con la diferencia de 0ue 6eDtField est creada para ser introducida en un formulario y 6eDt2oD para ser visuali7ada a pantalla completa, Masta a.ora+ se .an e1plicado los diferentes elementos 0ue se pueden visuali7ar en pantalla, A.ora es necesario saber cmo puede interactuar el usuario con ellos, A todos estos elementos se les pueden asociar comandos mediante la clase Command: una clase 0ue guarda informacin semntica sobre una accin, Ssta puede > '8 > $reacin de videojuegos con 5%6* ser una eti0ueta+ un tipo de comando 3DJ+ $AF$*"+ GA$J+ etc,,,4 o un ndice de prioridad, 6ediante el m/todo addCommand01+ de las clases %tem y &islayable se pueden asociar comandos y+ cuando se ejecute un comando+ ser necesario tener asociada una clase 0ue se encargue de recogerlo y tratarlo, Deber asociarse una clase+ creada por el programador+ 0ue implemente la interfa7 CommandListener+ y asociada al %tem o &islayable mediante el m/todo setCommandListener01, Ssta clase CommandListener tratar los comandos cuando se produ7can mediante el m/todo command,ction01, 9.2.2 Inter&aC de Dajo nivel Ssta se reali7a a partir de la clase Canvas+ cuya funcin principal es el dibujado en pantalla mediante la clase )rahics, Por otro lado+ tambi/n gestiona diversos eventos relacionados con la entrada y salida+ gestionados mediante la sobrecarga de los siguientes m/todos de Canvas: s.o2Fotify : m/todo llamado inmediatamente antes de 0ue el objeto Canvas se muestre en pantalla, Puede sobrecargarse para iniciali7ar algunos datos relacionados con la presentacin del Canvas antes de 0ue /ste sea mostrado, .ideFofity : llamado inmediatamente despu/s de 0ue el objeto Canvas salga de pantalla, IeyPressed : llamado cuando el teclado registra la pulsacin de una tecla, IeyCepeated: llamado cada cierto intervalo de tiempo definido+ si la tecla se mantiene pulsada, IeyCeleased : llamado al dejar de pulsar una tecla, pointerPressed : llamado cuando el dispositivo apuntador es pulsado, pointerCeleased : llamado cuando el dispositivo apuntador deja de estar pulsado, pointerDragged : llamado cuando el dispositivo apuntador se mueve mientras se mantiene pulsado, paint : llamado cada ve7 0ue es necesario refrescar los datos grficos de pantalla, *ste m/todo se encarga de dibujar en el Canvas+ mediante un objeto de clase )rahics, > '' > Programacin de videojuegos 9." Bn ejemplo prEctico !na ve7 e1plicada la estructura bsica de un programa en 5%6*+ as como sus clases ms importantes+ se reali7ar una pe0uea aplicacin de muestra+ con la cual aplicar algunos de los conceptos e1plicados en este tema, "a aplicacin en s constar de un sencillo Canvas sobre el 0ue se dibujar un te1to y un mapa de bits, Adems+ mediante men=s y formularios podremos configurar los colores del $anvas+ as como el te1to a mostrar, Adems+ se mostrar paso a paso cmo se crea el proyecto+ se configura+ se compila y ejecuta con HTJ, #.3.1 Creacin ! config&racin del ro!ecto ?, Abrir 5%6*+ Hireless ToolIit %, Macer clicI sobre ;e+ ro!ect 8, Introducir+ como nombre de la aplicacin EM%&let ruebaF+ y como nombre de la clase del 6IDlet+ E$!emloF ', *n el dilogo de configuracin 3ver figura 9,%4+ configurar la plataforma ms sencilla, *scoger como 6arget 'latform la opcin Custom, -eleccionar los perfiles 6IDP ?,& y $"D$ ?,&+ desactivar =ireless Messaging ,'% 3opcin ;o =M, Suort4 y dejar sin marcar todas las dems API opcionales, ), *n el directorio de instalacin de HTJ+ subdirectorio as+ se .abr creado una carpeta llamada 6IDlet prueba, A partir de a.ora ese ser el directorio del proyecto, A.ora slo 0ueda editar el cdigo de la aplicacin: en el subdirectorio src se debern crear arc.ivos de te1to pertenecientes a las clases, *l nombre de estos ser GnombreHclaseI.!ava. > ') > $reacin de videojuegos con 5%6* #.3.2 Clase E'emlo *n el fic.ero *jemplo,java est la clase 0ue sobrecarga la clase 6IDlet+ donde empie7a la ejecucin del programa, 1 import javax.microedition.midlet.MIDlet; 2 import javax.microedition.midlet.MIDletStateChangeException; 3 import javax.microedition.lcdui.Displa; ! " public class Ejemplo extends MIDlet # $ % protected void start&pp'( throws MIDletStateChangeException # ) Displa.getDispla'this(.setCurrent'new Menu*rincipal'this((; + , 1- 11 protected void pause&pp'( # , 12 13 protected void destro&pp'boolean arg-( 1! throws MIDletStateChangeException # , 1" 1$ , Listado >.1: $!emlo.!ava *n el listado 9,? se puede comprobar 0ue+ al ser un programa tan sencillo+ no ser necesario guardar ni destruir ning=n dato en el momento de pausar o destruir la aplicacin, "a =nica tarea 0ue reali7a esta clase es la de asignar los recursos de la pantalla a la clase Menu'rincial. -e puede ver en la lnea : cmo obtiene la pantalla > '9 > Figura >.#: configuracin de la alicacin reci5n creada Programacin de videojuegos mediante &islay.get&islay0this1+ y cmo asigna a /sta un objeto del tipo &islayable+ mediante el m/todo setCurrent, #.3.3 Clase Men&Princial *sta clase muestra el men= principal del programa+ donde el usuario podr elegir entre salir de la aplicacin+ configurar la visuali7acin+ o visuali7ar la imagen, *1tiende la clase List. *n las lneas ?& a ?' del listado 9,% puede verse cmo se construye como una lista del tipo I6P"I$IT+ y agrega 8 opciones: K6ostrarL+ K$onfigurarL+ y K-alirL, Adems+ se designa a s misma como commandListener 3lnea ?'4, Para ello es re0uisito 0ue implemente la interfa7 CommandListener de 5%6* 3lnea '4+ y la funcin command,ction de dic.a interfa7 3lnea ?<4, *n este =ltimo m/todo+ puede verse cmo se comprueba la opcin escogida y+ a partir de /sta+ sale del programa+ muestra el objeto Lien.o 3subclase de Canvas4 con los dibujos+ o muestra el objeto Configuracion 3subclase de Form4 donde se configuran las opciones de dibujado, 1 import javax.microedition.lcdui..; 2 import javax.microedition.midlet.MIDlet; 3 ! public class Menu*rincipal extends /ist implements Command/istener " # $ private MIDlet midlet; % private Con0iguracion con0ig; ) + public Menu*rincipal'MIDlet midlet( # 1- super'"Men Principal"1/ist.IM*/ICI2(; 11 append'"Mostrar"1null(; 12 append'"Configurar"1null(; 13 append'"Salir"1null(; 1! setCommand/istener'this(; 1" this.midlet3midlet; 1$ con0ig3new Con0iguracion'midlet1this(; 1% , 1) 1+ public void command&ction'Command command1 Displaa4le displaa4le( # 2- String opcion3getString'getSelectedIndex'((; 21 if'opcion.e5uals'"Salir"(( # 22 midlet.noti0Destroed'(; 23 , else if'opcion.e5uals'"Configurar"(( # 2! Displa.getDispla'midlet(.setCurrent'con0ig(; 2" , else if'opcion.e5uals'"Mostrar"(( # 2$ Displa.getDispla'midlet(.setCurrent' 2% new /ien6o'midlet1this1con0ig.getColor7ondo'(1 2) con0ig.getColor2exto'(1con0ig.get2exto'(( 2+ (; 3- , 31 , 32 , Listado >.#: Menu'rincial.!ava > ': > $reacin de videojuegos con 5%6* #.3.( Clase Config&racion *sta clase se encarga de guardar los datos de configuracin+ as como de mostrar en pantalla el formulario para llevar a cabo tal configuracin, Para ello+ se aade al formulario un elemento del tipo 6eDtField con el valor inicial de KMola 6undoL+ y dos elementos Choice)rou de seleccin e1clusiva y las opciones KblancoL+ KnegroL+ Ka7ulL+ KrojoL y KverdeL, *sta clase tambi/n se define a s misma como CommandListener, *l =nico comando 0ue debe controlar esta ve7 es el comando KvolverL 3lnea ?<4, $omo en la clase Lien.o ser necesario obtener los datos de la configuracin deseada por el usuario+ se .an definido funciones 0ue obtengan los datos de los %tem del formulario 3lneas %' a 884, > '; > Programacin de videojuegos 1 import javax.microedition.lcdui..; 2 import javax.microedition.lcdui.2ext7ield; 3 import javax.microedition.midlet.MIDlet; ! public class Con0iguracion extends 7orm implements Command/istener # " private 2ext7ield texto3 $ new 2ext7ield'"Texto"1"Hola mundo"11"12ext7ield.&89(; % private String opciones:;3#"blanco"1"negro"1"azul"1"roo"1"verde",; ) private Choice<roup color7<3 + new Choice<roup'"Color texto"1Choice<roup.E=C/>SI?E1opciones1null(; 1- private Choice<roup color@<3 11 new Choice<roup'"Color fondo"1Choice<roup.E=C/>SI?E1opciones1null(; 12 private MIDlet midlet; 13 private Menu*rincipal menuprincipal; 1! public Con0iguracion'MIDlet midlet1Menu*rincipal menuprincipal( # 1" super'"!ormulario de configuraci"n"(; 1$ append'color7<(; 1% append'color@<(; 1) append'texto(; 1+ addCommand'new Command'"#olver"1Command.@&CA11((; 2- setCommand/istener'this(; 21 this.midlet3midlet; 22 this.menuprincipal3menuprincipal; 23 , 2! public String get2exto'( # 2" return texto.getString'(; 2$ , 2% public int getColor2exto'( # 2) return getColor'color7<(; 2+ , 3- public int getColor7ondo'( # 31 return getColor'color@<(; 32 , 33 private int getColor'Choice<roup choice( # 3! String color3choice.getString'choice.getSelectedIndex'((; 3" if'color.e5uals'"blanco"(( # 3$ return '2"".2"$B2""(.2"$B2""; 3% , else if'color.e5uals'"negro"(( # 3) return -; 3+ , else if'color.e5uals'"azul"(( # !- return 2""; !1 , else if'color.e5uals'"roo"(( # !2 return 2"".2"$.2"$; !3 , else # //verde !! return 2"".2"$; !" , !$ , !% public void command&ction'Command command1 Displaa4le displaa4le( # !) if'command.getCommand2pe'(33Command.@&CA( # !+ Displa.getDispla'midlet(.setCurrent'menuprincipal(; "- , "1 , "2 , Listado >.-: clase Configuracion #.3.) Clase *ien$o *s la clase derivada de Canvas+ la cual se encarga =nicamente de dibujar la pantalla > '< > $reacin de videojuegos con 5%6* a partir de los datos de configuracin 0ue se le pasan por parmetros en el constructor 3lnea ?%4, Dbservar 0ue en el constructor se carga una imagen de mapa de bits 3lneas %& a %84+ por lo 0ue .abr 0ue crear una y guardarla como Kprueba,pngL en el directorio res del proyecto, 1 2 import javax.microedition.lcdui..; 3 import javax.microedition.midlet.MIDlet; ! " public class /ien6o extends Canvas implements Command/istener # $ private int color7ondo1color2exto; % private String texto; ) private Image imagen; + private MIDlet midlet; 1- private Menu*rincipal menu*rincipal; 11 12 public /ien6o'MIDlet midlet1 13 Menu*rincipal menu*rincipal1 1! int color7ondo1 1" int color2exto1 1$ String texto( # 1% this.color7ondo3color7ondo; 1) this.color2exto3color2exto; 1+ this.texto3texto; 2- tr$ # 21 imagen3Image.createImage'"%prueba&png"(; 22 , catch'Exception e( # 23 Sstem.out.println'"'rror cargando la imagen( "Be.getMessage'((; 2! , 2" this.midlet3midlet; 2$ this.menu*rincipal3menu*rincipal; 2% addCommand'new Command'"#olver"1Command.@&CA11((; 2) setCommand/istener'this(; 2+ , 3- 31 protected void paint'<raphics graphics( # 32 int C3getDidth'(1 h3getEeight'(; 33 graphics.setColor'color7ondo(; 3! graphics.0illFect'-1-1C1h(; 3" graphics.setColor'color2exto(; 3$ graphics.draCString'texto1CG211-1<raphics.2H*I<raphics.ECE82EF(; 3% graphics.draCImage'imagen1CG21hG21<raphics.?CE82EFI <raphics.ECE82EF(; 3) , 3+ !- public void command&ction'Command command1 Displaa4le displaa4le( # !1 if'command.getCommand2pe'(33Command.@&CA( # !2 Displa.getDispla'midlet(.setCurrent'menu*rincipal(; !3 , !! , !" , !$ Listado >./: Lien.o.!ava Para poder salir de la imagen y volver al men= inicial+ es necesario crear un comando del tipo GA$J en el constructor 3lnea %:4, Al igual 0ue las otras clases+ Lien.o > )& > Programacin de videojuegos se establece a s misma como CommandListener+ y trata el evento del comanda en su funcin command,ction 3lneas '&>''4, "a funcin principal e imprescindible de Lien.o+ como toda clase Canvas es la funcin aint01 3lneas 8?>8;4+ donde se puede observar cmo a partir de un objeto )rahics+ de manera sencilla rellena el fondo de un color+ dibuja un te1to de otro color+ y dibuja el mapa de bits cargado en el constructor en el centro de la pantalla+ utili7ando los m/todos get=idth01 y getJeight01 de /ste+ ya 0ue a priori no se sabe la resolucin de la pantalla+ ya 0ue puede variar seg=n el dispositivo, 9.".9 $ompilacin, preDa y empa8etado A.ora slo es necesario compilar la aplicacin mediante el botn 2uild de JToolbar+ corrigiendo los errores 0ue el compilador pueda darlo, !na ve7 compilado+ se probar en el emulador 3figura 9,84 mediante el botn 7un, *l =ltimo paso es+ una ve7 comprobado 0ue todo funciona bien+ es crear los arc.ivos *jemplo,jar y *jemplo,jad+ para poder distribuir la aplicacin en cual0uier dispositivo 5%6*, *sto se .ace a trav/s de la opcin del men= de JToolbar+ 'ro!ect KKI 'ac9age KKI Create 'ac9age+ con lo 0ue se crearn los arc.ivos !ad y !ar en el subdirectorio bin del proyecto, > )? > Figura >.-: caturas de antalla de la miniKalicacin creada como e!emlo $ap%tlo '. $ap%tlo '.
$riterio! de di!e*o de n $riterio! de di!e*o de n
videojego !oDre na plata&orma mvil videojego !oDre na plata&orma mvil *n este captulo se enumerarn los elementos ms importantes a tener en cuenta a la .ora de disear un buen videojuego sobre una plataforma mvil, '.1 $rear n Den videojego *n este proyecto+ se considerar un Den videojego todo a0u/l 0ue cumpla dos objetivos: ?, *spectacularidad : el videojuego .a de tener un buen diseo grfico y una m=sica adecuada al tipo de juego+ 0ue sepa acompaar correctamente la accin de este, Fo basta slo con esto+ sino 0ue adems el videojuego deber tener cierta calidad t/cnica y aprovec.ar las caractersticas 0ue el .ard2are del dispositivo pone a disposicin del programadorQ pero con cierta moderacin+ ya 0ue se corre el peligro de sacrificar dosis de jugabilidad por 0uerer centrarse demasiado en los alardes t/cnicos, %, 5ugabilidad : sin duda alguna+ el objetivo de mayor prioridad, Funca se debe disminuir la jugabilidad en pro de un juego ms espectacular t/cnicamente, Fo .ay una frmula para obtener una buena jugabilidad+ pero s se considerarn algunos factores necesarios+ aun0ue no imprescindibles: facilidad de manejo+ dificultad ajustada y creciente+ no repetitividad+ etc,,, *stos dos objetivos no siempre son fciles de conseguir+ y menos en dispositivos mviles+ debido a dos factores: caracter%!tica! t1cnica! y ergonom%a, A continuacin se e1plicarn ambos y se enumerarn posibles criterios a seguir para disear un buen videojuego, '.2 Factore! t1cnico! A la .ora de disear un videojuego para un dispositivo mvil+ no se debe olvidar 0ue /stos tienen unas caractersticas t/cnicas limitadas y+ por tanto+ no es posible reali7ar videojuegos de gran espectacularidad t/cnica, Y no slo eso+ sino 0ue las aplicaciones tampoco deben tener una gran carga de proceso+ es decir+ gran n=mero de elementos a controlar a la ve7 3por ejemplo+ muc.os enemigos en pantalla4+ una inteligencia artificial $reacin de videojuegos con 5%6* compleja y costosa computacionalmente+ o clculos matemticos intensos+ ya 0ue todas estas caractersticas consumen demasiados recursos de procesador y puede .acer 0ue el juego sea demasiado lento, Afortunadamente+ estos factores tienen cada ve7 menos importancia+ ya 0ue la tecnologa mvil avan7a a pasos de gigante+ y .oy en da empe7amos a disfrutar de dispositivos mviles con varios megas de CA6+ aceleracin 8D+ microprocesadores potentes+ y otras caractersticas 0ue .acen 0ue se puedan reali7ar videojuegos 0ue pocos aos atrs estaban reservados a videoconsolas y ordenadores personales 3figura :,?4, > )' > Programacin de videojuegos '." Factore! de ergonom%a $on los dispositivos mviles actuales+ este es el factor a tener ms en cuenta a la .ora de disear un videojuego, +.3.1 Controles A medida 0ue la tecnologa avan7a+ no slo se consiguen dispositivos ms potentes+ sino 0ue cada ve7 son ms pe0ueos, Aun0ue gracias a las nuevas caractersticas multimedia+ las pantallas van ad0uiriendo tamaos y definiciones aceptables+ esto se compensa con teclados pe0ueos+ lo cual puede suponer un serio problema a la .ora de controlar la accin del juego: si ya de por s es poco cmodo utili7ar un teclado num/rico para jugar+ si /ste adems es de reducido tamao puede dar como resultado una dificultad e1cesiva para manejar los controles y+ como consecuencia+ 0ue el juego+ por muy jugable 0ue sea a riori+ ad0uiera una dificultad e1cesiva 0ue .aga perder toda la jugabilidad 0ue debiera tener, *n la mayora de tel/fonos+ los controles se tendrn 0ue reali7ar mediante el teclado num/rico, *sto 0uiere decir 0ue los botones para despla7ar el personaje+ as como los botones de accin+ estn en un pe0ueo espacio de 81' teclas, "o ideal es 0ue todo el control se pueda reali7ar mediante una sola mano+ ya 0ue es bastante incmodo tener dos manos en un teclado num/rico de tamao pe0ueo, "a recomendacin para este caso es 0ue se utilicen las teclas %+ '+ 9+ y ; para controlar la direccin 3ms ?+ 8+ :+ < en caso 0ue se 0uieran usar diagonales4 y+ para simplificar los controles+ un slo botn de accin+ 0ue ser el centro 3)4, *n el juego+ es recomendable 0ue no sean frecuentes los momentos en 0ue .aya 0ue moverse y pulsar el botn de accin a la ve7 3ejemplo: un > )) > Figura L.1: Colin Mc7ae #BB< ara ;K)age $reacin de videojuegos con 5%6* mata>marcianos4+ ya 0ue la accin implica 0ue se deban soltar los botones de direccin, *n la actualidad+ cada ve7 son ms los tel/fonos 0ue vienen con un sencillo controlK ad 3figura :,%4. *sto proporciona muc.a comodidad a la .ora de jugar+ por lo cual facilita la tarea del diseo del juego, A.ora se puede asir el tel/fono con las dos manos+ sin 0ue un dedo estorbe a otro+ por lo 0ue+ mientras con una mano se mueve al personaje+ con la otra se puede reali7ar la accin, Tambi/n se podrn implementar varias acciones+ cada una con su botn, Para no complicar el manejo+ se recomienda 0ue como m1imo sean % acciones de uso frecuente como por ejemplo+ un botn para disparar y otro para saltar, Para los controlKads actuales+ .ay 0ue tener en cuenta 0ue son de slo ' direcciones+ con lo cual+ si 0ueremos usarlos .abr 0ue suprimir el movimiento en diagonal del personaje, > )9 > Programacin de videojuegos +.3.2 Pantalla Dtro problema 0ue+ como ya se .a comentado+ va mejorando con el tiempo+ es el tamao de la pantalla, "os tel/fonos con mayores prestaciones en la actualidad suelen tener definiciones de unos ?)&1%&& pi1els+ apro1imadamente, *sto causa 0ue+ en muc.as ocasiones+ el diseador tenga 0ue escoger entre espectacularidad grfica o jugabilidad, Para determinados juegos+ si se crean unos srites 3elementos mviles4 demasiado grandes+ ocuparn demasiado espacio en pantalla+ reduciendo as el campo de accin y la jugabilidad, -i+ en cambio+ se crean unos srites demasiado pe0ueos+ puede ser 0ue el jugador tenga 0ue .acer un esfuer7o visual demasiado grande+ y 0ue la jugabilidad se vea reducida por 0ue los elementos no se identifican bien+ o por el esfuer7o visual necesario, Adems+ y como problema secundario+ con tamaos de srite pe0ueos se reduce el detalle grfico de los elementos y+ por tanto+ la espectacularidad del juego, "a recomendacin 0ue se .ace en este proyecto+ es 0ue los elementos del juego sean suficientemente grandes como para ser identificados fcilmente+ pero 0ue el campo de visin de la escena del juego sea suficientemente grande como para poder prever con antelacin las situaciones del juego 3por ejemplo: 0ue podamos divisar si se acerca un > ): > Figura L.#: cada da es ms habitual :ue el tel5fono mvil disonga de un sencillo controlKad $reacin de videojuegos con 5%6* enemigo y reaccionar a tiempo4, -i el juego 0ue se esta diseando no puede cumplir las recomendaciones a0u e1puestas+ 0ui7s es 0ue no es un tipo de juego adecuado para reali7arse sobre un dispositivo mvil, '.- $on!ejo! para la mejora de la jgaDilidad A continuacin se describen algunos elementos 0ue+ aun0ue no son imprescindibles+ s pueden ayudar a la mejora de la jugabilidad: Fo repetitividad : es importante 0ue el juego sea variado+ ya 0ue si no+ la partida se .ar aburrida y demasiado larga, *sto se puede conseguir con variedad de personajes+ pantallas+ escenarios+ objetivos, Tener un objetivo determinado y bien definido : desde el principio+ el jugador .a de saber cul es el objetivo de la partida, *s recomendable dividir la partida en varios objetivos a conseguir+ secuencialmente y uno a uno, Dificultad creciente y ajustada : tanto si .ay demasiada dificultad como si el juego es demasiado sencillo+ puede ser aburrido, "o aconsejable es una dificultad pe0uea al principio+ mientras el jugador aprende a desenvolverse+ y 0ue esta vaya creciendo de manera gradual, *l usuario no debe escoger el nivel de dificultad al principio 3el clsico Kfcil+ normal+ difcilL a 0ue nos tienen acostumbrados muc.os videojuegos4+ ya 0ue esto es delegar en el usuario una decisin 0ue el diseador no .a sido capa7 de tomar, 6otivacin : el jugador debe poder observar sus progresos en el juego y debe ser estimulado para seguir adelante, *sto se puede conseguir con un buen argumento+ con la ad0uisicin de nuevas .abilidades 3armas+ poderes+ etc,,,4+ u otros factores 0ue el diseador considere de inter/s, > ); > Figura L.-: , menudo* habr :ue escoger entre esectacularidad y !ugabilidad* siendo en ocasiones imosible de roorcionar esta Mltima caracterstica. Programacin de videojuegos *stado del tel/fono : /ste no debe influir sobre la jugabilidad, *s decir+ si el tel/fono tiene el sonido apagado+ esto no debe ser una desventaja de cara al juego, > )< > $ap%tlo G. $ap%tlo G.
El primer jego El primer jego
Para iniciar la familiari7acin con el desarrollo de juegos para tel/fonos mviles+ se .a desarrollado un videojuego sencillo+ capa7 de ser ejecutado en cual0uier tel/fono mvil con soporte para 5%6* y pantalla en color, "as caractersticas previas al diseo de este videojuego son las caractersticas mnimas 0ue tiene 0ue tener un tel/fono mvil con 5%6*: 6IDP ?,& y $"D$ ?,& Pantalla de <91)' pi1els Teclado num/rico solamente, A partir del .ard2are especificado+ se deduce 0ue el juego deber tener las siguientes caractersticas: 6anejo sencillo *lementos de tamao grande y perfectamente distinguibles + debido al reducido tamao de la pantalla, *scenario de accin reducido + imprescindible para 0ue la jugabilidad sea buena en un juego de estas caractersticas, $umpliendo todas estas especificaciones+ se .a creado el clsico juego de Kmatar toposL+ en el 0ue unos personajes van asomando por agujeros y .ay 0ue golpearlos para ganar puntos 3ver figura ;,?4, *n el ap/ndice G se puede observar el cdigo fuente de la aplicacin, $reacin de videojuegos con 5%6* G.1 E!trctra de la aplicacin Antes de reali7ar la aplicacin+ .ay 0ue definir los estados 0ue /sta tendr: presentacin+ juego y pausa, Presentacin : pantalla inicial con el ttulo del juego, A0u se podr elegir entre jugar una partida o salir de la aplicacin, 5uego : parte principal+ donde se desarrolla toda la accin, Desde a0u+ se debe poder pausar el juego, Pausa : estado de pausa+ donde se puede elegir entre continuar el juego o volver a la pantalla de presentacin, A este estado se llega desde el juego+ o automticamente mediante el evento ause,01 del 6IDlet+ por si se recibe una llamada de tel/fono+ para no perder la partida, Fin de juego : pantalla final+ en la 0ue se muestra la puntuacin total y el mensaje de fin de juego, *n la figura ;,% se muestra un diagrama con los diferentes estados del juego, Antes de programar+ es necesario identificar las clases necesarias para la reali7acin del juego 3figura ;,84+ 0ue a continuacin sern descritas: *scabec.ina : clase principal de la aplicacin, -e encarga de controlar los diferentes > 9% > Figura N.#: diagrama con los distintos estados del !uego Figura N.1: O$scabechinaO* nuestro rimer !uego Programacin de videojuegos estados de la aplicacin y+ en consecuencia+ el resto de clases creadas para la /sta, Pausa$anvas+ Presentacion$anvas : Canvas para la presentacin y la pausa, -u =nica funcionalidad es mostrar las imgenes correspondientes mientras se espera la entrada de un comando por parte del usuario para pasar al estado de juego o para salir de la aplicacin, 5uego : a partir de los datos de la clase 6area"uego+ dibuja en pantalla la representacin grfica de /sta, *s tambi/n el encargado de recibir los eventos del teclado y comunicrselos a 6area"uego, Tarea5uego : a trav/s del m/todo run 0ue sobreescribe de la superclase 6imer6as9+ y 0ue se ejecuta %& veces por segundo+ controla el estado de todos los elementos del juego, De todas las clases implementadas la principal es 6area"uego+ 0ue controla todos los elementos y la accin del juego, Por tanto+ es la =nica 0ue merece ser desgranada y e1plicada paso a paso, > 98 > $reacin de videojuegos con 5%6* G.2 7a cla!e ,areaJ&ego Ssta es una clase derivada de la clase !ava.util.6imer6as9+ cuyo m/todo run01 se ejecutar %& veces por segundo desde un tempori7ador creado en la clase $scabechina 3ver cdigo adjunto a continuacin4, *sto es+ cada )& ms se llamar a dic.a funcin+ donde se controlarn todos los elementos del juego y se llamar al m/todo aint01 de la clase "uego+ derivada de !avaD.microedition.lcdui.Canvas, %3 if'timer33null( # %! timer3new 2imer'(; %" timer.schedule'tareaJuego1DE/&9KMS1DE/&9KMS(; %$ , @Por 0u/ .acer estoB @Fo sera ms fcil no utili7ar ning=n tempori7ador y sustituirlo por un bucle 0ue fuera llamando a run04 .asta 0ue se finali7ara el juegoB -+ sera ms fcil pero son varios motivos los 0ue obligan a reali7arlo con un tempori7ador: *vitar el colapso de la aplicacin+ e incluso del tel/fono : esto se debe a 0ue la aplicacin debe otras tareas y eventos+ como pueden ser los eventos del teclado+ llamadas entrantes+ etc, -i el programa no sale del bucle infinito+ no sabemos cmo > 9' > Figura N.-: diagrama de clases de la alicacin Programacin de videojuegos puede reaccionar el sistema ante un simple evento sin atender, -incroni7ar la velocidad : la velocidad del juego variar dependiendo del n=mero de elementos a controlar+ del tamao de los grficos a dibujar+ de la velocidad del dispositivo+ etc, As+ en diferentes dispositivos+ e incluso en diferentes etapas del juego+ se obtendrn diferentes velocidades+ siendo imposible controlarlas, De esta manera 0ueda asegurado 0ue se obtendrn %& imgenes por segundo+ ni una ms+ ni una menos, *ste m/todo difiere del de otros autores+ como el de la referencia bibliogrfica T#arca %&&8U+ 0ue propone crear un thread aparte para el juego y dentro de /ste un bucle+ 0ue ejecute todas las acciones de control del juego y 0ue+ al finali7arlas+ se 0uede en estado de espera 3slee4 un tiempo determinado+ en el 0ue el dispositivo podr atender otros eventos, *ste m/todo no es tan bueno como el propuesto en este proyecto+ por el siguiente motivo: no se puede tener la certe7a de 0ue se obtendr un n=mero determinado de frames(segundo+ ya 0ue el tiempo de ejecucin de las tareas del juego no va incluido en el tiempo entre imagen e imagen+ al llamarse al m/todo slee despu/s de la ejecucin de /stas, Adems+ el tiempo de ejecucin de dic.as tareas variar seg=n los factores 0ue comentbamos antes, -e puede intuir 0ue se obtendr un numero de frames(segundo cercano al 0ue se busca+ pero no se puede asegurar 3ver figura ;,'4, *l sistema utili7ado para la reali7acin del juego de este captulo+ sin embargo+ tambi/n es susceptible a errores: la suma del tiempo de ejecucin y el tiempo de dibujado en pantalla no puede ser superior al tiempo de entre imagen e imagen definido+ ya 0ue esto podra blo0uear el sistema+ al no .aber tiempo de suspensin alguno y ejecutar una iteracin del cdigo cuando todava no se .ubiera acabado la anterior, > 9) > $reacin de videojuegos con 5%6* Para un juego sencillo como este+ el tiempo de dibujado y ejecucin son muy menores al tiempo de iteracin+ por lo 0ue no .abr problemas, *n captulos posteriores+ con la creacin de un juego ms complejo+ se e1plicar un m/todo ms eficiente para conseguir imprimir al juego la velocidad 0ue se 0uiera+ pudiendo variar el frame rate 3n=mero de imgenes por segundo4 en funcin del tipo de m0uina o de las variaciones de las necesidades de computacin del juego en cada momento, A continuacin se e1plicar el contenido de la funcin run01 de la clase 6area"uego+ 0ue es donde reside el control de todo el juego, Primeramente+ la clase "uego recibe los comandos del teclado, *s decir+ comprueba cundo se .an pulsado las teclas del ? al < y enva un mensaje a 6area"uego+ indicndole el agujero al 0ue ir a golpear el guante mediante la variable miembro osicionguante, *n la funcin run01 de 6area"uego+ se comprueba si donde el guante est golpeando .ay un mueco+ si /ste no .a sido golpeado ya+ y si se le puede golpear+ es decir+ est a una altura 0ue vara entre la m1ima posible y la m1ima menos un margen de error, $on esto+ facilitamos la tarea de golpear el mueco+ pero no la .acemos > 99 > Figura N./: la Mnica manera de obtener un numero eDacto de framesPsegundo es mediante la utili.acin de timers Programacin de videojuegos demasiado fcil como para 0ue el mueco pueda ser golpeado a=n cuando estuviera casi escondido, *n la figura ;,) se muestra de manera grfica las condiciones de alturas necesarias para 0ue se produ7ca el acierto a la .ora de intentar golpear un mueco, A continuacin+ la funcin run01 comprueba si es necesario volver a sacar otro mueco por el tablero+ de manera aleatoria, Para ello+ se asigna un intervalo de tiempo entre aparicin y aparicin+ y se comprueba si ya se .a superado, Para ir aumentando la dificultad+ este intervalo se ir reduciendo poco a poco, Adems+ se ir acortando el tiempo en 0ue el mueco se 0ueda en su posicin de m1ima altura+ y tambi/n se ira acelerando la velocidad con 0ue /ste sube y baja, A continuacin se muestra el cdigo 0ue reali7a esto+ donde intervalo es la variable 0ue indica el tiempo 0ue debe transcurrir entre 0ue asoma una cabe7a y la siguiente+ nivel es una variable 0ue va aumentando para ser restada a intervalo y as ir aumentando la dificultad+ velocidad indica la velocidad de las cabe7as en subir y bajar+ y maDtmarriba indica el tiempo en 0ue las cabe7as estarn 0uietas en su punto m1imo, 12+ if'intervaloL)--( # 13- intervaloM3!"; 131 if'intervaloL'!--Mnivel(( # 132 //cada vez que sobrepase el intervalo, subimos el nivel un poco 133 intervalo3%--Mnivel; 13! if'nivelL1-"( # 13" nivelB31"; 13$ , 13% 13) , 13+ , else # 1!- intervaloM3intervaloG%; 1!1 , 1!2 velocidad3'3M'intervaloG%--((; 1!3 if'velocidadL1( velocidad31; 1!! 1!" maxtmparri4aM31-; 1!$ if'maxtmparri4aL1"-( # 1!% maxtmparri4a31"-; 1!) , Dbservar 0ue la variable maDtmarriba oscila con el tiempo, *sto se .ace para 0ue+ cuando la dificultad es muy grande+ el nivel vuelva a bajar y el jugador pueda descansar, Para 0ue+ a pesar de la oscilacin+ la tendencia de la dificultad sea siempre creciente+ se utili7a la variable nivel+ 0ue ir siempre acortando el tiempo de intervalo, > 9: > Figura N.<: slo se odr golear el mu(eco cuando 5ste est5 a una mnima altura. $reacin de videojuegos con 5%6* Al final de la funcin+ se comprueba el estado de los < .oyos del tablero+ 0ue pueden estar vacos o no, *n el caso de no estarlo 3.ay asomado un personaje4+ el programa se encarga de moverlos seg=n sea su estado 3$S6,&4HSQ2$* $S6,&4H',7,&4* $S6,&4H2,",4, -i cuando el personaje .a bajado por completo+ /ste no .a sido golpeado+ se restar una KvidaL a la partida+ acabndose /sta cuando el n=mero total de vidas sea &, Para dar oportunidades al jugador+ cada %& aciertos seguidos se aumentar en ? el n=mero total de vidas, > 9; > $ap%tlo #. $ap%tlo #. $reacin de n videojego $reacin de n videojego
avanCado avanCado !na ve7 cumplida la familiari7acin con la programacin para 5%6*+ el el siguiente captulo se e1plicar el proceso de desarrollo seguido para crear un videojuego 0ue+ si bien es posible 0ue no est/ al nivel de las producciones actuales 3principalmente debido a la falta de un e0uipo de desarrollo numeroso4+ s pueda tener una calidad aceptable desde el punto de vista de un videojuego comercial, A diferencia de el juego creado en el captulo anterior+ para el del captulo presente no se impondrn limitaciones .ard2are tan estrictas, "a =nica limitacin es 0ue todas las libreras utili7adas sean las propuestas por -un+ dejando de un lado las API de terceros 3FoIia+ -amsung,,,4, "os re0uisitos mnimos para la aplicacin sern: Pantalla en color+ con varios miles de colores, Definicin de pantalla de al menos ?)&1?;& pi1els, "ibreras para la reproduccin de contenidos multimedia 66API, $"D$ ?,? 6IDP %,& *n el momento de reali7acin de este proyecto+ los re0uerimientos mnimos son altos, *sto no debe ser un problema+ ya 0ue con los rpidos avances en el campo de la telefona mvil multimedia+ es cuestin de meses 0ue cual0uier tel/fono de gama media incorpore todas estas especificaciones, Por otra parte+ es bueno 0ue en un proyecto acad/mico+ 0ue no re0uiere de los beneficios econmicos necesarios de todo buen proyecto comercial+ se .aga especial .incapi/ en tecnologas futuras 0ue+ aun0ue su actual difusin sea pe0uea+ en el futuro tengan posibilidades de ser ampliamente utili7adas, *studiar y desarrollar con .erramientas y dispositivos obsoletos sera poco ms 0ue Kredescubrir la ruedaL, $omo juego de demostracin+ 0ue intente utili7ar al m1imo las caractersticas para la creacin de videojuegos 0ue incorpora 6IDP %,&+ se .a creado un shootRemKu 3es decir+ el clsico mata>marcianos4, $reacin de videojuegos con 5%6* #.1 $aracter%!tica! (de!eaDle!) de n videojego 6=ltiples niveles : cada uno con dificultad creciente a la anterior, $on diversidad de decorados y personajes+ para no .acer repetitivo el juego, 6=ltiples enemigos : 0ue vayan apareciendo de manera combinada para .acer ms variado el transcurso de la fase, Al final de cada nivel aparecer un Kenemigo finalL+ como prueba necesaria para acabar /ste y pasar al siguiente, Oariedad de armas : 0ue el jugador pueda ir obteniendo en el transcurso del juego+ de manera 0ue sus poderes(.abilidades vayan aumentando, Guena calidad t/cnica y artstica : grficos y m=sica bonita para ameni7ar el transcurso de la partida, Adems+ 0ue se intente aprovec.ar al m1imo las caractersticas multimedia del dispositivo, $omo se ver+ debido a 0ue este no es un proyecto artstico sino t/cnico+ este videojuego no cumple al ?&&N todos los re0uisitos especificados+ pero la estructura del programa es tal 0ue permite fcilmente crear nuevos elementos 3armas+ niveles+ enemigos,,,4 de tal manera 0ue se pudieran cumplir las caractersticas deseables+ en caso de continuar con el proyecto, "as KcarenciasL del juego son: May un slo nivel+ debido a 0ue una ve7 creado el primero+ crear ms no aporta ninguna novedad desde el punto de vista de la programacin, -e pueden crear fcilmente ms niveles mediante sobrecargas de la clase abstracta Fase, -lo .ay un tipo de arma disponible, Al igual 0ue con los niveles+ crear ms es trivial+ sobrecargando la clase &isaro, > :& > Figura S.1: algunas caturas de antalla del video!uego creado en este catulo Programacin de videojuegos *n cuanto a la calidad artstica+ debido a 0ue este es un proyecto de ingeniera informtica y no de arte digital+ es probable 0ue los resultados no sean de gran espectacularidad, *l creador de este proyecto se .a esmerado en la medida de sus posibilidades para intentar .acer un juego est/ticamente bonito, #.2 E!trctra de la aplicacin *n la figura <,? se puede observar el diagrama de clases de la aplicacin, *sta estructura intenta reali7ar de manera modular+ con el fin de proporcionar una aplicacin fcilmente escalable+ las siguientes tareas: -implificar y automati7ar la utili7acin de los recursos multimedia 3grficos y sonido4, Gucle principal del juego+ donde se trate la representacin en pantalla de todos los elementos del juego+ as como las interacciones entre /stos, > :? > Figura S.#: diagrama de clases del video!uego $reacin de videojuegos con 5%6* $reacin de clases base para simplificar la creacin de elementos+ tales como escenarios+ objetos mviles+ personajes+ etc,,, Para ms informacin se puede consultar el ap/ndice A+ donde se encuentra documentada la utili7acin de las clases bsicas+ y el ap/ndice $+ donde se muestra el cdigo fuente de la aplicacin, #." El contenedor de todo= -estorElementos *sta clase es la encargada de gestionar cual0uier elemento mvil del videojuego+ como pueden ser enemigos+ disparos+ nave protagonista+ etc, *s una clase del tipo singleton+ es decir+ slo puede .aber una instancia de /sta ejecutndose a la ve7+ ya 0ue la =nica manera acceder a /sta es mediante el m/todo singleton01+ 0ue se encarga de crear una instancia del tipo static+ y se encarga de retornar siempre la misma, *sto+ adems+ permitir acceder a esta clase desde cual0uier punto de la aplicacin, private static )estor'lementos ge*null+ public static <estorElementos singleton'( # if'ge33null( # ge3new <estorElementos'(; , return ge; , $omo se puede observar en el diagrama de la figura <,?+ esta clase tiene tres atributos principales: fase+ atributo de clase Fase+ donde se guarda los datos referentes a la gestin del nivel de juego 0ue se est ejecutando, rota* atributo de clase 'rotagonista+ el cual contiene la nave manejada por el jugador, !na lista con todos los objetos mviles 3clase 4b!etoMovil1 del juego, "a =nica caracterstica digna de inter/s en esta clase radica en la gestin de dic.os objetos en memoria+ ya 0ue deben ser almacenados en una lista+ la cual deber ser recorrida secuencialmente+ y a la 0ue se le deben poder agregar y eliminar nuevos objetos, *sto en principio debera ser algo trivial+ ya 0ue 5ava pone a disposicin del programador infinidad de estructuras de datos complejas 0ue se manejan sencillamente mediante iteradores, > :% > Programacin de videojuegos *l problema vino dado por 0ue 5%6* slo soporta la estructura 3ector. *sto da dos problemas: *s una estructura 0ue no se adapta a los re0uerimientos del programa 3recorrido secuencial+ agregar y eliminar elementos de manera rpida y sencilla+ produci/ndose el agregado por uno de los e1tremos y la eliminacin en cual0uier punto4+ con lo 0ue puede resultar demasiado lenta, Cecordar 0ue todas estas acciones se .arn varias veces por segundo, Dtro problema es 0ue para acceder secuencialmente+ no se puede .acer directamente+ sino convirtiendo el vector a un objeto de la clase $numeration, *sto no slo ralenti7ar ms la ejecucin del programa+ sino 0ue llenar demasiado rpido el hea del dispositivo 3se crean varios $numeration por segundo4+ por lo 0ue la frecuencias de llamadas al recolector de basura ser alta+ con la consecuente ralenti7acin del programa, *n la figura <,8 se muestra una captura del monitor de memoria donde se puede ver 0ue la cantidad de objetos $numeration ocupa una cantidad de memoria muy superior a la de cual0uier otro, Adems+ el n=mero de dic.os objetos creca continuamente a ritmo vertiginoso, "a solucin para conseguir una mejora del rendimiento como la 0ue se refleja en la figura fue crear una estructura de datos sencillaQ en concreto una lista enla7ada+ donde se agreguen los elementos al principio y se puedan eliminar en cual0uier posicin, Para ello se cre la estructura ;odo+ 0ue tiene la siguiente estructura: > :8 > Figura S.-: monitori.acin de la memoria del sistema :ue ocua cada clase $reacin de videojuegos con 5%6* private class 8odo # public H4jetoMovil o4jeto3null; public 8odo siguiente3null; , Donde cada nodo de la lista tendr una referencia al objeto a tratar y otra al siguiente nodo de la lista, A la .ora de aadir o eliminar un elemento de la lista 3ver figura <,'4+ .abr 0ue indicar a )estor$lementos la referencia a la instancia de 4b!etoMovil con la 0ue operar, $omo la insercin se reali7a al principio de la lista+ esta operacin ser de complejidad 5(1), "a eliminacin de un objeto es ms lenta+ ya 0ue .ay 0ue buscarlo en la lista antes de eliminarlo, $omo consecuencia+ la eliminacin media ser de complejidad 5(nH2)+ donde n es la longitud de la lista, -e podra reducir a 5(1) mediante algunos trucos+ como guardar en el propio 4b!etoMovil una referencia al nodo 0ue le apunta+ pero esto sera una mala solucin desde el punto de vista de la ingeniera del soft2are+ ya 0ue se eliminara la independencia entre el objeto y su contenedor, Adems+ en el caso 0ue nos ocupa+ la lista pocas veces contiene ms de ?& elementos+ por lo 0ue su total recorrido es rpido, *n la figura <,) se puede observar el uso de la memoria con la utili7acin de objetos 3ector y su mejora en cuanto a utili7acin de memoria cuando se usa la lista simple, "a lnea .ori7ontal discontinua representa el tamao del hea asignado en ese momento, > :' > Figura S./: oeraciones bsicas con la lista de elementos Programacin de videojuegos $ada ve7 0ue la lnea indicadora KcaeL bruscamente indica 0ue en ese momento se .a producido una recoleccin de basura, #.- )estor)rafico* lien7o de pintura y manejador de eventos *sta clase se encarga de dibujar los elementos de la pantalla de juego, -obrecarga la clase )ameCanvas+ en cuyo m/todo aint01 se dibuja el escenario del juego 3clase Fase4 y el marcador inferior cada ve7 0ue cambia la puntuacin o el n=mero de vidas, Tambi/n se encarga de capturar los eventos 9ey'ressed 3tecla pulsada4 y 9ey7eleased 3tecla soltada4 para indicar a la nave protagonista cundo debe moverse y cundo debe parar, #.5 El nIcleo de todo= -estorJ&ego *sta es la clase principal y ms importante del proyecto, -e encarga de controlar el estado de la aplicacin+ de mover los elementos y gestionar las interacciones entre /stos, Adems debe controlar 0ue todo estas tareas se .agan a la velocidad adecuada+ para 0ue el videojuego corra a la misma velocidad independientemente de la plataforma donde se est/ ejecutando, *n el captulo anterior se e1plicaron unas t/cnicas bsicas para igualar la velocidad del juego en cual0uier tipo de dispositivo, -e coment 0ue eran t/cnicas demasiado simples y susceptibles a errores cuando el programa fuera muy complejo, A continuacin+ se abre un par/ntesis para e1plicar dos t/cnicas ms avan7adas, > :) > Figura S.<: a la i.:uierda* uso de memoria utili.ando 3ector. , la derecha* utili.ando una lista sencilla $reacin de videojuegos con 5%6* ..).1 /incroni$acin a%an$ada -e e1plicarn dos m/todos para conseguir 0ue el usuario tenga la sensacin 0ue el juego transcurre a la misma velocidad independientemente de la plataforma: frmulas matemticas y salto de frames 3frameKs9iing4, "a primera consiste en determinar la posicin de los objetos mediante frmulas matemticas calculadas en funcin del tiempo+ mediante un 6imer 0ue vaya contando el tiempo o mediante el reloj del sistema 3System.setCurrent6imeMillis014, $on este m/todo+ el n=mero de veces 0ue se calculen los elementos del juego y se dibujen en pantalla variar seg=n la potencia o la sobrecarga del sistema+ pero el usuario tendr la sensacin 0ue se mueve siempre a la misma velocidad, -lo variar la suavidad con la 0ue se muevan 3ver figura <,94, Adems+ esta t/cnica proporciona gran realismo al juego+ ya 0ue los elementos se podrn comportar mediante frmulas fsicas, *ste tipo de implementacin tiene dos problemas difcilmente resolubles en un programa 5%6*: $omplejidad : determinados comportamientos pueden ser difciles de modelar mediante frmulas matemticas+ aadiendo adems un mayor coste de clculo+ ya 0ue la posicin siempre se calcular de manera absoluta 3el resultado es una posicin en pantalla4 y no de una manera relativa 3el resultado es cuantos pi1els debe moverse desde donde est4, *s decir+ no es lo mismo tener 0ue calcular una funcin del tipo DTDR8aceleracion@tiemo 0ue su e0uivalente en movimientos relativos DTD8aceleracion 3la diferencia ser muc.o ms grande en funciones ms complejas4, Adems+ 5%6* proporciona unas .erramientas matemticas e1tremadamente pobres 3suma+ resta+ multiplicacin+ divisin y poco ms4, Incluso en la versin ?,& del $"D$ slo se permite operar con enteros, > :9 > Figura S.>: a velocidades de e!ecucin altas* un elemento se mover ms suavemente* ero nunca ms rido Programacin de videojuegos $olisiones : si se va con cuidado+ este es un problema menor, *ste problema se da cuando los movimientos se reali7an demasiado bruscamenteQ en ese momento+ puede ser 0ue dos objetos destinados a colisionar se KsaltenL el uno al otro+ sin 0ue se produ7ca esta colisin, "as colisiones se suelen detectar cuando determinadas regiones de dos objetos coinciden en un mismo espacio, Mabra 0ue .allar formas alternativas para descubrir las colisiones independientemente de la posicin de los elementos en un determinado momento, *sto es inviable debido a las ya mencionadas limitaciones matemticas de 5%6*+ as como la escasa potencia de clculo de los aparatos mviles, "a segunda opcin+ el salto de frames 3o frame>sIipping4+ es el m/todo escogido en este videojuego, "o a0u e1plicado puede diferir de las t/cnicas de frameKs9iing utili7adas por otros autores, "o 0ue primeramente debe .acer el programador es escoger el n=mero de veces por segundo 0ue el bucle principal del juego debe ejecutarse 3variable F7,M$SHS4, -i todo va bien+ cada 1BBBPF7,M$SHS milisegundos se debe ejecutar una iteracin del bucle principal+ donde se .agan todos los clculos necesarios para mover los elementos del juego+ as como dibujar /stos en pantalla, Masta a.ora+ esto no vara demasiado de la t/cnica del 6imer utili7ada en el tema K$l rimer !uegoL y+ como entonces se e1plic+ si el tiempo de gestin y pintado de los elementos es superior al tiempo entre frame y frame+ el juego se ralenti7ar, *n este momento es cuando es =til el rofiler de la aplicacin 5%6* HTJ 3figura <,:4, $omo se puede observar+ casi el <&N del tiempo de ejecucin se reparte en dos funciones: 2asic'layer,reali.e01 y LayerManager.aint01, Ceali7e se ejecuta slo 8 veces al principio de la partida para pre>cac.ear datos de sonido+ por lo 0ue no ralenti7a la posterior ejecucin del juego, *ntonces+ se puede deducir 0ue la funcin aint de LayerManager ocupa casi el <&N del tiempo de ejecucin de la aplicacin, "a solucin propuesta para evitar las ralenti7aciones cuando el tiempo de clculo y pintado sea superior al tiempo entre frames es la de calcular y gestionar todos los elementos+ pero no pintarlos, Para ello slo es necesario contar las iteraciones reali7adas .asta el momento y+ si estas no llegan al promedio impuesto 3FCA6*-Z-4+ saltarse el dibujado de pantalla y ejecutar inmediatamente la siguiente iteracin para recuperar el tiempo perdido, > :: > $reacin de videojuegos con 5%6* A continuacin se muestra el interior del bucle principal de la clase )estor"uego+ donde se puede ver la implementacin del frameKs9iing: *n la lnea '+ se calcula las iteraciones 0ue debera llevar la aplicacin en caso 0ue todo .ubiera funcionado a la velocidad correcta 3variable idealiter4, -i coincide con el n=mero actual de iteraciones+ se redibuja la pantalla y se suspende la ejecucin del thread .asta el siguiente frame, -i no fuera as+ no se repintara en pantalla e inmediatamente ira a ejecutar la siguiente iteracin, *sta implementacin tambi/n tiene un defecto+ y es 0ue en un dispositivo muy potente no se vern las mejoras en forma de un movimiento ms suave+ ya 0ue /ste est limitado por el propio programa, "a ventaja es 0ue es ms sencillo y rpido de utili7ar 0ue el sistema de funciones matemticas, > :; > Figura S.L: rofiling de la e!ecucin del !uego 1 mover'(; 2 iteracionesBB; 3 tiempoactual3Sstem.current2imeMillis'(; , long idealiter37F&MESKSE<>8DH.'tiempoactualMtiempoanterior(G1---; - if'iteracionesN3idealiter( # $ gg.repaint'(; % tr$ # ) long tiemposiguiente3'iteracionesB1(.1---G7F&MESKSE<>8DH Btiempoanterior; + tiempoactual3Sstem.current2imeMillis'(; 1- long di0erencia3tiemposiguienteMtiempoactual; 11 if'di0erenciaN-( # 12 2hread.sleep'di0erencia(; 13 , 1! , catch'InterruptedException e( # 1" Sstem.out.println'e.getMessage'((; 1$ , 1% , Programacin de videojuegos #.9 7o! nivele! del jego= la cla!e 0ase *sta clase deriva de la clase LayerManager del 6IDP %,&, LayerManager se encarga de gestionar los Layer a dibujar, !n objeto de la clase Layer es un elemento a dibujar+ como pueda ser el decorado+ un enemigo+ un disparo,,, *n las pginas ?&&>?&% se encuentra documentada la utili7acin detallada de esta clase, *s una clase abstracta+ por lo 0ue no se puede instanciar, *n ella se recogen todas las operaciones comunes a cual0uier fase del juego, *n el juego de demostracin se .a creado la clase Fase1 como derivada de Fase+ donde se especifican los elementos concretos para el primer nivel de juego 3decorados+ enemigos+ etc,,,4, "os atributos principales de Fase son los objetos de la clase 6iledLayer llamados frente y fondo+ 0ue son los planos de decorado frontal y de fondo, -e .an utili7ado dos planos para el decorado+ donde el frontal 0ue se despla7a 3scroll4 a una velocidad mayor 0ue el plano del fondo para dar la sensacin de profundidad, *s la llamada t/cnica de scroll arallaD, "a particularidad de un 6iledLayer es 0ue no guarda el escenario entero en un mapa de bits gigante+ ya 0ue esto ocupara una cantidad de memoria enorme, Para a.orrar memoria+ se guarda un mapa de bits con fragmentos de escenario 3tiles4 y estos se irn copiando repetidas veces en pantalla para construir el escenario completo, A modo de ejemplo+ en la figura <,; se muestra la coleccin de tiles utili7ados en la clase Fase1 para construir el escenario del primer nivel, Para construir el escenario con tiles+ se utili7a la funcin setCell de la clase 6iledLayer+ donde se indica 0u/ tiles .ay 0ue dibujar+ y dnde dibujarlos, Para ello+ se .a creado la funcin rellenar6iles+ mostrada a continuacin, *sta funcin se llama utili7ando > :< > Figura S.N: tiles utili.ados en el !uego de demostracin $reacin de videojuegos con 5%6* como parmetros los m/todos abstractos getMaaFrente y getMaaFondo+ los cuales deben ser sobreescritos por la clase derivada 0ue implemente el nivel al cual pertenecen dic.os mapas, "a funcin mover01 ser llamada desde cada iteracin del bucle principal de la funcin run01 de la clase )estor"uego+ y se encargar solamente de mover los dos 6iledLayer mientras se va avan7ando en el juego, A parte de esto+ en la funcin 0ue implemente el nivel+ la cual ser instanciada+ el m/todo mover01 se sobrecarga para aadir los distintos enemigos a la lista de la clase )estor$lementos en el momento 0ue el programador re0uiera, Para e1plicar esto+ primeramente se muestra el tro7o de cdigo 0ue lo implementa y a continuacin se e1plicar su funcionamiento, private int HC3-; //contador de objetos public void mover'( # super.mover'(; while'posxN3siguiente( # <estorElementos ge3<estorElementos.singleton'(; switch'o4jetos:HCBB;( # case -O ge.aPade'new Caca'o4jetos:HCBB;((; brea.; case 1O ge.aPade'new Comecocos'o4jetos:HCBB;((; brea.; case 2O ge.aPade'new Cerdo'((; brea.; (....) , siguiente3o4jetos:HCBB;.*antalla.2I/EKSIQEM*antalla.get&ncho2a4lero'(; , , //el formato es posicion (tile horiz), num. objeto, parametro 1, ... , parametro n private static final int o4jetos:; 3 # 13111%-1 1$1-11$1 2-1-1321 2!1-1$!1 2)1-1+$1 321-112)1 !-1112"1 !3111"-1 !$111""1 !+1-1)"1 "211111"1 ""1-113"1 ")111)-1 $"121 %-121 %"121 )-111"-1 )-111)-1 )-11112-1 +-1112"1 +-111""1 +-111+"1 1--1-11$1 1-21-1321 1-!1-1!)1 1-$1-1$!1 1-)1-1)-1 11-1-1+$1 > ;& > protected void rellenar2iles'2iled/aer tl1b$te:;:; tilemap( # for'int roCs3-;roCsLtilemap.length;roCsBB( # for'int cols3-;colsLtilemap:roCs;.length;colsBB( # tl.setCell'cols1roCs1tilemap:roCs;:cols;(; , , , Programacin de videojuegos (.....) ,; $omo se puede ver+ simplemente se van leyendo del vector ob!etos el momento en el 0ue debe aparecer el elemento del tipo 4b!etoMovil+ referente al despla7amiento .ori7ontal del escenario+ el cdigo del objeto a leer en concreto y+ si este necesita parmetros+ tambi/n se leern, $omo ejemplo+ se puede observar los 8 primeros n=meros de ob!etos 3?8+?+:&4+ los cuales indican 0ue el elemento con cdigo [?[ aparecer cuando se dibuje la columna ?8 del 6iledLayer+ y 0ue adems+ este aparecer a una distancia de :& pi1els del marco superior de la pantalla, #.' $la!e 1b'etoMo%il y derivada! 4b!etoMovil deriva de la clase Srite de la API de 6IDP %,&, !n Srite es un Layer+ pero con algunas caractersticas aadidas+ entre las cuales se destacan las siguientes: Facilita la creacin de animaciones+ dibujando en un slo mapa de bits todos los movimientos posibles del objeto 3ver figura <,<4+ pudiendo luego seleccionar cul de ellos debe ser dibujado mediante los m/todos setFrame+ revFrame y neDtFrame. -e pueden efectuar transformaciones geom/tricas sobre la imagen del srite 3rotaciones+ reflejos,,,4, *sto permite el a.orro de memoria+ ya 0ue slo ser necesario crear y guardar las imgenes del elemento mirando .acia una sola direccin 3ver figura <,?&4, Dfrece mecanismos para detectar colisiones entre srites, *ste tipo de colisiones pueden ser simples 3cuando colisionan dos reas rectangulares definidas por el usuario4 o iDelKbyKiDel 3cuando colisionan dos pi1els de la imagen4, *n este proyecto se .a escogido el testeo de colisiones simples+ ya 0ue las necesidades de precisin no son e1cesivamente elevadas y su tiempo de clculo es enormemente menor, > ;? > Figura S.S: todos los movimientos de un 4b!etoMovil se guardan en un slo fichero de imagen $reacin de videojuegos con 5%6* *n las pginas ??<>?%? se encuentra la documentacin en formato "ava&oc acerca de esta clase, ..+.1 Caractersticas de 1b'etoMo%il De esta clase derivan todos los elementos mviles del juego: disparos+ enemigos+ personaje protagonista+ etc, *sta clase slo debe implementar las operaciones comunes a todos los elementos, *stas son los m/todos mover01+ terminar01 y matar01, *n el m/todo mover01 se debe implementar el cdigo referente a los movimientos del elemento 3por ejemplo: DTD81U yTyK1U reali7ara un movimiento en diagonal de la posicin del objeto4, *n el m/todo terminar01 se implementa el cdigo 0ue finali7a la ejecucin del 4b!etoMovil+ la funcin implementada por defecto tan slo se elimina el propio objeto de la lista de objetos de )estor$lementos, *n el m/todo matar34 se reali7an las acciones 0ue se producen cuando el objeto muere por causa de alg=n disparo o otro elemento 3por ejemplo+ aadir a la lista de objetos una e1plosin y llamar a terminar04 para eliminarse a s mismo4. A parte de estos m/todos+ la clase 4b!etoMovil contiene un atributo llamado tio+ en el cual se guarda el tipo de objeto al 0ue pertenece 3disparo+ enemigo+ objeto+ protagonista+ etc,,,4, *ste atributo no es necesario+ ya 0ue 5ava permite comprobar en tiempo de ejecucin la clase a la 0ue pertenece un objeto+ pero de esta manera se acelera la ejecucin+ al guardar el indicador de clase en un entero, ..+.2 Clase Enemigo De esta clase+ derivada de 4b!etoMovil+ derivan todos los enemigos del juego, Aade los siguientes m/todos: tocar0&isaro d1+ en el cual se especifican los efectos de un disparo d sobre el objeto $nemigo+ tales como p/rdida de energa+ muerte+ u otro,,, > ;% > Figura S.1B: con una sola imagen se ueden obtener varias ms* mediante transformaciones geom5tricas 0fuente: Sun1 Programacin de videojuegos get'untuacion01+ 0ue retorna la puntuacin 0ue gana el jugador cuando este enemigo muere, ..+.3 $la!e "isaro De esta clase derivan todos los proyectiles lan7ados por el protagonista, *sta clase agrega a la clase padre 4b!etoMovil el m/todo getFuer.a01+ bsicamente utili7ado en el m/todo tocar01 de la clase $nemigo+ para obtener la potencia del disparo y as poder calcular el dao ocasionado, ..+.( $la!e 1tion *n el juego no se .a implementado ninguna subclase de 4tion+ pero se .a creado para posibles ampliaciones del juego, De esta clase derivarn los objetos 0ue el jugador pueda recolectar durante la partida+ tales como armas nuevas+ puntos e1tra+ etc,,, Aade la funcin actua01+ donde se especifican las acciones a reali7ar cuando el jugador .a recolectado ese objeto, #.G 7a ge!tin del !onido A pesar 0ue 66API 36ulti6edia API4 proporciona elementos para gestionar de manera sencilla el sonido de la aplicacin+ se .a decidido aadir una fina capa de soft2are 0ue centralice las operaciones a utili7ar en el programa, ..2.1 *a clase MediaPla!er *sta clase implementa la interfa7 'layer+ de 66API+ con el motivo de facilitar la carga y reproduccin de los sonidos, *l =nico digno de ser comentado en esta clase es su constructor: MediaPlayer(trin! filename, trin! contenttype, boolean repeat) *n /l+ se carga el arc.ivo con nombre filename y de tipo contenttye 3donde se especifica el tipo 6I6*+ como Kaudio(midiL+ Kaudio(2avL+ etc,,,4, -i el parmetro reeat es true+ significa 0ue al acabar de ser reproducido+ el arc.ivo deber volver a tocarse desde el principio, *sto se consigue aadiendo un 'layerListener+ 0ue est/ pendiente de la reproduccin del arc.ivo y+ al acabar /sta 3evento $;&H4FHM$&%,4+ vuelva a llamar al m/todo start01 del reproductor, A continuacin se muestra el cdigo 0ue implementa el cdigo 0ue permite la repeticin de los sonidos: the*laer.add*laer/istener' > ;8 > $reacin de videojuegos con 5%6* new *laer/istener'( # public void plaer>pdate'*laer plaer1 String s1 H4ject o( # if's.e5uals'*laer/istener.E8DKH7KMEDI&(( # plaer.start'(; , , , (; ..2.2 7a cla!e -estor/onidos *sta funcin almacena los Media'layer a utili7ar, -e encarga tambi/n de tocarlos+ y eliminarlos, "a importancia de esta clase es 0ue almacena todos los sonidos al principio de la partida y+ cada ve7 0ue se 0uiera reproducir uno+ ya tenerlo preparado de antemano para su reproduccin, *sto se debe al ciclo de vida 0ue puede tener un objeto del tipo 'layer 3ver figura <,??4 !n objeto del tipo 'layer empie7a en el estado Q;7$,L%V$&+ donde no .a obtenido los suficientes datos y recursos para iniciar su reproduccin, *l siguiente estado en el 0ue est es 7$,L%V$&+ cuando ya .a recolectado la suficiente informacin para ad0uirir los recursos, *l paso de Q;7$,L%V$& a 7$,L%V$& es muy lento+ por lo 0ue si se .ace en medio de la partida+ el juego se parar algunos segundos+ por eso es importante efectuarlo al principio del juego+ y almacenarlo como 7$,L%V$& en la clase )estorSonidos, Mec.o esto+ para cambiar de sonido durante la partida+ slo .ay 0ue pasar el estado a '7$F$6CJ$& y luego a S6,76$&+ operacin 0ue consume poco tiempo, -i se observa el juego+ al iniciar la partida el tel/fono resta parado 8 o ' segundos, *ste parn es debido a 0ue se estn pasando todas las m=sicas al estado 7$,L%V$&, > ;' > Figura S.11: ciclo de vida de un ob!eto 'layer 0fuente: Sun1 $ap%tlo 1(. $ap%tlo 1(. $reacin de na liDrer%a para la $reacin de na liDrer%a para la
programacin de videojego! programacin de videojego! A la .ora de crear un juego+ sera interesante no tener 0ue crearlo desde &+ sino a partir de una librera 0ue ya implementara ciertos elementos bsicos+ comunes a cual0uier videojuego+ con el propsito de automati7ar lo m1imo posible el proceso de creacin, *n este captulo+ la idea ser aprovec.ar el es0ueleto del videojuego del captulo anterior 3ver figura ?&,?4 y .acerle algunas modificaciones necesarias para crear una librera 0ue sirva para crear videojuegos del tipo shootRemKu 3mata>marcianos4 de manera rpida+ e intentando proporcionar la mayor fle1ibilidad posible para 0ue el programador no se vea limitado por las caractersticas de la librera, Para conocer con ms detalle la utili7acin de las clases 0ue componen la librera a la .ora de crear videojuegos+ en el Ap/ndice A se incluye la documentacin de /sta en Figura 1B.1: diagrama de clases de la librera $reacin de videojuegos con 5%6* formato "ava&oc, 1(.1 $amDio! realiCado! *n este apartado se enumerarn los cambios reali7ados para facilitar y fle1ibili7ar la creacin de videojuegos a partir de la librera creada, 13.1.1 Clase -estorJ&ego -e .an buscado independi7ar la clase )estor"uego del M%&let 0ue lo crea, Para ello+ se .an reali7ado los siguientes cambios: -e .a aadido el m/todo visuali.a+ al 0ue se le pasa como parmetro el objeto &islay donde pintar la escena, Antes se le pasaba el M%&let como parmetro en el constructor y )estor"uego se encargaba de obtener el &islay del M%&let, "os estados de la partida 3jugando+ pausa+ fin de juego,,,4 antes se gestionaban desde el M%&let, A.ora los gestiona la propia clase )estor"uego, 13.1.2 Clase -estorElementos Antes era la propia clase )estor$lementos la 0ue decida el orden de las fases a ejecutar a medida 0ue se le peda 0ue se fueran cargando, A.ora se le pasan en orden desde fuera+ mediante un vector+ en el m/todo setFases y )estor$lementos se encargar de ir cargndolas en orden+ a medida 0ue se vayan terminando las anteriores, 13.1.3 Clase -estor/onidos A.ora se pueden eliminar los sonidos cargados de manera independiente+ indicndole el n=mero de sonido a eliminar, De esta manera no es necesario descargar y cargar un mismo sonido, 13.1.( Clase Protagonista -e .a .ec.o como una clase abstracta+ donde se implementan las funcionalidades bsicas de /sta+ y dejando las funciones especficas para una clase derivada de /sta+ creada por el programador del juego+ 0ue ser la 0ue realmente se instancie en el juego, 13.1.) Clase 0ase -e .an reali7ado cambios para dotar a /sta de mayor fle1ibilidad, Asimismo+ se .an aadido funciones para 0ue el desarrollo de las clases derivadas sea ms rpido y automati7able, > ;9 > Programacin de videojuegos -e .a independi7ado el uso de los diferentes planos del escenario 3instancias de 6iledLayer4+ pudiendo especificar separadamente la estructura+ velocidad+ visuali7acin+ etc,,, "os datos referentes a los objetos+ as como sus parmetros se .an integrado en la clase Fase, A.ora la clase derivada obtendr los parmetros de /stos mediante la funcin get'arametros+ sin poder acceder directamente al array donde /stos estn guardados, 1(.2 BtiliCacin de la liDrer%a para la creacin de videojego! Dentro del mundo 5ava+ la mayora de libreras de funciones son utili7adas como libreras compiladas 3arc.ivos .!ar4+ a las 0ue se accede mediante enlaces dinmicos, *n este proyecto se .a decidido proporcionar la librera como cdigo fuente a incluir en el programa, *sto se .a .ec.o por los dos motivos: Dptimi7acin de recursos : los terminales mviles tienen recursos de clculo y de memoria limitados, *s posible 0ue para un desarrollo en particular no se deseen utili7ar todas las caractersticas de la librera+ por lo 0ue se estarn ejecutando funciones no utili7adas+ con su consiguiente repercusin en la velocidad de ejecucin y la memoria ocupada, *s entonces recomendable 0ue el programador elimine del cdigo las partes 0ue no desea utili7ar, Fle1ibilidad : aun0ue la librera creada pretende dar la m1ima fle1ibilidad posible para la creacin de juegos 3siempre 0ue estos sean del estilo shootRemKu4+ es posible 0ue el programador desee agregar algunas caractersticas e1tra al juego+ por lo 0ue deber modificar ciertas partes de la librera, *s por ello 0ue es necesario acceder al cdigo fuente, > ;: > $ap%tlo 11. $ap%tlo 11. $oncl!ione! y l%nea! aDierta! $oncl!ione! y l%nea! aDierta! *n el siguiente captulo+ el =ltimo+ se e1pondrn las conclusiones e1tradas de la reali7acin del proyecto, Adems+ se anali7arn posibles ampliaciones del proyecto y se enumerarn las lneas de desarrollo abiertas como resultado del anlisis, 11.1 $oncl!ione! Desde un inicial desconocimiento acerca del mundo de la creacin de aplicaciones para el mundo de la telefona mvil+ pero siempre sabiendo el tipo de aplicaciones 0ue se trataran el el proyecto+ se plante el proyecto incidiendo en dos campos: Indagacin en las caractersticas de las variadas .erramientas disponibles para el desarrollo de aplicaciones mviles y eleccin de una de ellas, !na ve7 reali7ado este paso+ se estudiaron con mayor profundidad las .erramientas escogidas 3"ava #* Mobile $dition y "#M$ =ireless 6ool9it4 y se reali7aron aplicaciones de prueba+ con el objetivo de familiari7arse con el entorno de desarrollo, *nsayo para la creacin de videojuegos bajo plataformas mviles desde un punto de vista esencialmente de la ingeniera del soft2are, -e .acen propuestas para la correcta interaccin entre el usuario y la m0uina, Por otra parte+ se establecen t/cnicas para la programacin de videojuegos+ tales como las estructuras de clases necesarias para la creacin de aplicaciones de este tipo+ as como diversos algoritmos para la gestin y la optimi7acin en tiempo real, Todas las t/cnicas descritas se .an acabado empa0uetando en una librera para agili7ar el proceso de creacin, $omo el trabajo reali7ado gira en torno a la reali7acin de videojuegos+ se .a estudiado con especial .incapi/ las clases de 5%6* para tal labor+ tales como las 0ue sirven para trabajar con los datos multimedia 3grficos y sonidos4+ as como las facilidades 0ue 6IDP %,& brinda para la creacin de juegos+ tales como srites+ mapas de KbaldosasL 3clase 6iledLayer4+ Klien7osL para dibujar 3clase Canvas4+ etc, "os elementos estudiados son bsicos a la .ora de crear un videojuego o alg=n otro tipo de aplicacin multimedia+ pero a=n no se .an e1plorado otras .erramientas 0ue Sun proporciona y 0ue pueden enri0uecer enormemente la e1periencia del usuario+ tales como los grficos 8D+ la reproduccin de vdeos+ la cone1in a red+ etc,,, $reacin de videojuegos con 5%6* -e debe recordar a.ora el captulo % 3-istemas de desarrollo y ejecucin de aplicaciones4+ donde se e1plican diferentes metodologas para la creacin de videojuegos, Ceferente a esto+ en un principio se inici el desarrollo de los videojuegos con el re0uerimiento de utili7ar solamente las libreras estndar de 5%6*+ tanto las de la versin ?,& del 6IDP como las de la %,&, -in embargo+ en el captulo <+ donde se proponan diversos m/todos y estructuras para la creacin de videojuegos y el empa0uetado de estos en una librera para su posterior reutili7acin+ casi sin darnos cuenta se cre una interfa7 entre el cdigo 0ue .ace el programador y la 60uina Oirtual de 5ava, @Au/ 0uiere decir estoB Aue si se .ace un juego para esta librera+ 0ue actualmente slo soporta 6IDP %,&+ se puede e1portar a otros modelos de mviles+ 0ue utilicen otras API de otros fabricantes con slo modificar la librera+ siempre 0ue no se modifi0uen las especificaciones de /sta, 6odificar la librera puede suponer un considerable esfuer7o+ pero la ventaja est en 0ue una ve7 modificada+ los juegos 0ue se realicen a partir de ese momento podrn compilarse para diversas plataformas+ reutili7ando siempre las libreras ya creadas, *s un coste inicial a tomar en cuenta+ pero el a.orro y las ventajas posteriores son inmensas, 11.2 7%nea! aDierta! 11.2.1 Creacin de &n entorno de desarrollo de %ideo'&egos Masta a.ora se .a mostrado+ como lneas abiertas+ a0uellas cuyo objetivo es principalmente el estudio+ por parte del desarrollador+ de las diversas .erramientas y tecnologas puestas a su disposicin para el desarrollo de aplicaciones mviles, *n el siguiente apartado+ se marca una lnea en la 0ue se re0uiere+ no tanto un estudio(evaluacin de .erramientas+ sino un esfuer7o creador+ con el objetivo de ampliar y continuar el trabajo reali7ado en la librera para la creacin de videojuegos creada en este proyecto, #racias a la mencionada librera+ la creacin de videojuegos se convierte en una tarea sin demasiada dificultad+ desde el punto de vista de la programacin+ la cual puede ser fcilmente automati7ada, Por ejemplo+ para crear una fase de un juego+ tan slo .ay 0ue definir los grficos as como la distribucin de estos mediante tiles* y los personajes 0ue van a aparecer+ con sus caractersticas particulares, Sstos+ al tratarse de simples > <& > Programacin de videojuegos arrays+ pueden ser creados(modificados mediante alguna .erramienta visual+ 0ue libere al desarrollador de la pesada 3y susceptible a fallos4 tarea de crear manualmente dic.os arrays, Asimismo+ la creacin de los diferentes elementos mviles+ tales como personajes+ disparos+ y otros elementos+ tambi/n puede ser definida automticamente+ mediante un editor 0ue permita definir la trayectoria a seguir por el objeto y algunas de las caractersticas principales de /ste 3fuer7a+ velocidad+ energa,,,4, Por tanto+ teniendo en cuenta los re0uerimientos descritos+ se propone una .erramienta integrada 0ue+ a modo de editor visual+ permita la edicin de los diferentes elementos de un videojuego y cree el cdigo fuente en 5ava 0ue implemente el videojuego entero+ aprovec.ando y ampliando+ si fuera necesario+ la librera ya creada, A continuacin se describen los elementos deseables de la aplicacin resultante, Editor de &a!e! *sta parte del programa debera ser capa7 de editar las imgenes referentes a las imgenes de fondo+ tanto los mapas de bits 0ue forman las KbaldosasL como los mapas 0ue indican dnde debe ir colocada cada baldosa, Actualmente .ay una aplicacin de cdigo abierto+ 6ileStudio 3disponible en .ttp:((tilestudio,sourceforge,net4+ 0ue implementa las funciones re0ueridas: $reacin manual de mapas de bits con las baldosas a dibujar $reacin manual de los arrays para formar los 6iledLayer 3ver figura ??,?4, $reacin automtica de mapas de bits con las baldosas y de los 6iledLayer a partir de un mapa de bits 0ue dibuje la escena, Permite indicar en 0u/ punto del mapa pueden encontrarse objetos+ enemigos+ etc,,, *sta aplicacin+ una ve7 editados los datos de las pantallas+ e1porta a diferentes lenguajes de programacin cdigos fuente donde se definen los arrays con los datos editados, -e podra modificar el cdigo para agregar algunas funcionalidades especficas de la librera y crear automticamente clases 5ava con los datos de las diferentes fases+ en el formato 0ue acepta la librera > <? > $reacin de videojuegos con 5%6* Figura 11.1: editor de antallas de 6ileStudio. Editor de oDjeto! *ste editor debera permitir tanto enemigos+ como disparos+ como objetos opcionales 3armas+ energa e1tra+ etc,,,4Q en definitiva+ cual0uier objeto 0ue pueda derivar de la clase 4b!etoMovil de la librera, "as caractersticas deseables son: *ditar los grficos de los elementos 4b!etoMovil+ frame a frame+ as como sus caractersticas 3tamao+ n=mero de frames+ etc,,,4 Importar los grficos desde arc.ivos ya creados, *ditar las caractersticas de los elementos: energa+ fuer7a+ velocidad+ puntos 0ue proporciona al jugador+ etc,,, *ditar la trayectoria de los elementos: el usuario debera definir unos puntos clave+ y el cdigo generado movera al elemento suavemente entre los diferentes puntos, Dpcionalmente+ permitir incrustar tro7os de cdigo 5ava para reali7ar funciones complejas+ 0ue no se puedan e1presar con el editor, *sto dara mayor fle1ibilidad a > <% > Programacin de videojuegos la aplicacin, 5tro! elemento! -era bueno poder editar desde la aplicacin algunos aspectos secundarios del juego+ tales como el orden de las fases+ la presentacin y el final+ las m=sicas y sonidos asociados a cada evento+ etc,,, 11.2.2 1tras lneas abiertas Aparte de las ampliacin de la librera y creacin de un entorno de trabajo+ se proponen otras lneas, A partir de la evaluacin general del proyecto e1puesta en el captulo+ se propondrn algunos campos en los 0ue resultara interesante proseguir la labor de estudio y desarrollo, Todas las ,'% nombradas pertenecen a Sun Microsystems y pueden ser obtenidas gratuitamente desde el sitio H*G .ttp:((java,sun,com, $apacidade! mltimedia avanCada! 66API proporciona elementos para la reproduccin multimedia+ tales como vdeos o sonido digital, Debido al gran tamao de los arc.ivos de sonido 32av+ mp8,,,4 y vdeo 3avi+ mpg,,,4 .oy por .oy es inviable almacenar dic.os arc.ivos en el terminal+ aun0ue bien es cierto 0ue en pocos aos los terminales mviles incorporarn dispositivos de almacenamiento con capacidad para varios gigabytes, Pero como es posible 0ue todava tarden en aparecer de manera generali7ada los dispositivos mviles con capacidades de almacenamiento altas+ es interesante investigar y desarrollar en aplicaciones 0ue .agan uso del streaming de audio y vdeo+ donde /stos se transfieran en tiempo real desde un servidor de Internet .asta el dispositivo de mano, JrE&ico! ": Tras la reciente aparicin de consolas de videojuegos porttiles con capacidades 8D muy avan7adas+ es probable 0ue en poco tiempo los mviles con soporte .ard2are para el 8D empiecen a ser comunes, De .ec.o+ Sun Microsystems ya tiene a disposicin de los desarrolladores su Mobile -& )rahics ,'%+ incluida por primera ve7 en el =ireless 6ool ?it #.#+ el mismo 0ue se utili7 para desarrollar este proyecto, Adems+ e1iste 4en)L $S 3$mbedded Systems4+ una versin de las populares Dpen#" para sistemas encastados, Fo .ace falta ser adivino para intuir 0ue en un futuro cercano los videojuegos 8D > <8 > $reacin de videojuegos con 5%6* para mviles sean la tendencia principal dentro del mercado+ por lo 0ue es de vital importancia estudiar este campo y desarrollar aplicaciones 0ue lo aprovec.en al m1imo, $onectividad "a telefona mvil brinda a sus usuarios de una conectividad 0ue+ si bien es limitada en cuanto a velocidad y estabilidad+ ofrece la ventaja de poder permanecer conectado prcticamente en cual0uier lugar, Aprovec.ar estas caractersticas e implementarlas dentro de las aplicaciones de entretenimiento puede mejorar la e1periencia del usuario y establecer nuevos conceptos de videojuego, A parte de las caractersticas de cone1in 0ue proporciona 6IDP+ tales como cone1iones MTTP o cone1iones va soc9et+ Sun proporciona APIs para ampliar las capacidades de comunicacin+ tales como =ireless Messaging ,'%+ con la cual se puede manejar la mensajera -6-+ o las "ava ,'%s for 2luetooth =ireless 6echnology+ con las cuales se pueden desarrollar aplicaciones para la cone1in va bluetooth con dispositivos cercanos, > <' > Parte III, Ap/ndices 6p1ndice 6. 6p1ndice 6.
Ja%a"oc Ja%a"oc
de la liDrer%a de la liDrer%a
para la para la
creacin de videojego! creacin de videojego! \ndice por pa0uetes com.lpgc.g&.&a!e! $lass Fase ?&& com.lpgc.g&.item! $lass Dbjeto6ovil ??; com.lpgc.g&.item!.arma! $lass Disparo <; com.lpgc.g&.item!.option! $lass Dption ?%? com.lpgc.g&.item!.per!onaje! $lass *nemigo <; $lass Protagonista ?%8 com.lpgc.g&.til $lass #estor*lementos ?&% $lass #estor#rafico ?&9 $lass #estor5uego ?&; $lass Pantalla ?%% com.lpgc.g&.til.!ond $lass #estor-onidos ??? $lass 6ediaPlayer ??8 $reacin de videojuegos con 5%6* com.lpgc.g&.item!.arma! $la!! :i!paro java.lang.H4ject javax.microedition.lcdui.game./aer javax.microedition.lcdui.game.Sprite com.ulpgc.g0.items.H4jetoMovil com&ulpgc&gf&items&armas&/isparo public abstract class :i!paro e1tends Dbjeto6ovil Implementa un disparo del *rotagonista o de alg=n enemigo, $on!trctor :etail :i!paro pu4lic /isparo'javax.microedition.lcdui.Image image( $onstruye el disparo a partir de una imagen Parameter!= image > "a imagen de mapa de bits del Disparo Met2od :etail getFerCa pu4lic a4stract int get!uerza'( Cetorna la fuer7a del disparo, A ms fuer7a+ menos disparos sern necesarios para acabar con un enemigo, 4etrn!= "a fuer7a del disparo com.lpgc.g&.item!.per!onaje! $la!! Enemigo java.lang.H4ject javax.microedition.lcdui.game./aer javax.microedition.lcdui.game.Sprite com.ulpgc.g0.items.H4jetoMovil com&ulpgc&gf&items&personaes&'nemigo > <; > Ap/ndices public abstract class Enemigo e1tends Dbjeto6ovil Implementa los enemigos del juego, $on!trctor :etail Enemigo pu4lic 'nemigo'javax.microedition.lcdui.Image image( $onstruye el objeto Enemigo a partir de una imagen+ sin animacin, Parameter!= image > "a imagen de mapa de bits 0ue representa el objeto Enemigo pu4lic 'nemigo'javax.microedition.lcdui.Image image1 int ancho1 int alto( $onstruye el objeto Enemigo a partir de una imagen+ animada Parameter!= image > "a imagen 0ue representa todos los frames del objeto animado ancho > Tamao .ori7ontal de los frames+ en p1els alto > Tamao vertical de los frames+ en p1els Met2od :etail matar pu4lic void matar'( Implementa la muerte del enemigo 5verride!= matar in class H4jetoMovil tocar pu4lic a4stract void tocar'Disparo disparo( Implementa la accin a reali7ar cuando el enemigo es tocado por un disparo Parameter!= disparo > *l objeto del tipo Disparo 0ue colisiona con el enemigo > << > $reacin de videojuegos con 5%6* getPntacion pu4lic a4stract int getPuntuacion'( Devuelve el n=mero de puntos a sumar cuando muere el enemigo 4etrn!= F=mero de puntos a sumar com.lpgc.g&.&a!e! $la!! Fa!e java.lang.H4ject javax.microedition.lcdui.game./aerManager com&ulpgc&gf&fases&!ase public abstract class Fa!e e1tends java1,microedition,lcdui,game,"ayer6anager Implementa la superclase de todas las pantallas del juego, "os grficos de la pantalla sern guardados en una imagen+ en forma de baldosas del tamao 0ue se especifica en el campo *antalla.2I/EKSIQE de la clase *antalla, *l grafico de la pantalla se reconstruir a partir de el array bidimensional de 4te 0ue se le pasa al constructor como parmetro, "as instancias de la clase H4jetoMovil 0ue se vayan creando tambi/n se pasarn mediante un array de int donde a cada H4jetoMovil le pertenecer una ristra de int seg=n el siguiente formato: num, objeto+ parametroZ?+ ,,,,+ parametroZn "a correspondencia entre el n=mero de objeto y la clase del objeto+ as como el n]uactueQmero de parmetros 0ue coger del array para su construccin vendrn especificados sobrecargando la funcin aPadeEnemigo'int( en la clase derivada, Field :etail v!croll&rente protected int vscrollfrente Indica la velocidad del scroll del "ayer frontal v!croll&ondo > ?&& > Ap/ndices protected int vscrollfondo Indica la velocidad del scroll del "ayer de fondo $on!trctor :etail Fa!e pu4lic !ase'4te:;:; mapa7rente1 java.lang.String imgMapa7rente1 4te:;:; mapa7ondo1 java.lang.String imgMapa7ondo1 int:; o4jetos1 java.lang.String:; archivosMusicas( $onstruye una nueva instancia de un objeto 7ase, Parameter!= mapa7rente > 6apa de 6iles o ^baldosas^ para el plano frontal de la pantalla imgMapa7rente > Imagen con las baldosas para el plano frontal mapa7ondo > 6apa de 6iles o ^baldosas^ para el plano fondo de la pantalla imgMapa7ondo > Imagen con las baldosas para el plano de fondo o4jetos > 6apa de los objetos a crear durante el transcurso de la fase archivosMusicas > Array de String con los arc.ivos de las m=sicas a tocar durante el transcurso de la fase, Met2od :etail paint pu4lic void paint'javax.microedition.lcdui.<raphics g( Dibuja los planos frontal y de fondo en sus posiciones correctas, Parameter!= g > $onte1to grfico !et6caDada pu4lic void set0cabada'4oolean aca4ada( 6arca la accin de la Fase como acabada, #eneralmente se utili7a cuando se llega al final de /sta y se mata al monstruo final, Parameter!= aca4ada > -i true+ marca la fase como acabada, i!6caDada > ?&? > $reacin de videojuegos con 5%6* pu4lic 4oolean is0cabada'( $omprueba si la fase esta marcada como acabada, 4etrn!= true+ si la fase est acabada, 0alse+ en caso contrario, mover pu4lic void mover'( -e encarga de la gestin del movimiento de los planos de frontal y de fondo+ as como de comprobar cundo es necesario crear un nuevo a*adeEnemigo protected a4stract void a1ade'nemigo'int numH4jeto( Celaciona el H4jetoMovil a instanciar y el n=mero de argumentos necesario+ con el n=mero de objeto 0ue se le pasa como parmetro, !n ejemplo del contenido de la funcin sera: sCitch'numH4jeto( # case 1O int param:;3pide*arametros'3(; <estorElementos.singleton'(.aPade'neC 7ooH4jeto'param:-;1param:1;1param:2;((; 4reaR; ,
&inaliCar pu4lic void finalizar'( Finali7a la ejecucin de la pantalla, Y libera los recursos acumulados por /sta com.lpgc.g&.til $la!! Je!torElemento! java.lang.H4ject com&ulpgc&gf&util&)estor'lementos > ?&% > Ap/ndices public class Je!torElemento! e1tends java,lang,Dbject #estiona los recursos de memoria asociados a las instancias de H4jetoMovil y de 7ase, *s una clase del tipo singleton+ lo cual 0uiere decir 0ue slo .ay una instancia de ella en toda la aplicacin+ adems+ es accesible desde cual0uier punto de /sta, $on!trctor :etail Je!torElemento! pu4lic )estor'lementos'( Met2od :etail getFa!e.iCe pu4lic int get!aseSize'( Dbtiene el tamao .ori7ontal en 6iles de la Fase activa 4etrn!= *l tamao .ori7ontal en 6iles de la Fase activa, inicia:ato! pu4lic void inicia/atos'( Iniciali7a los datos referentes al gestor acmlaPntacion pu4lic void acumulaPuntuacion'int puntos( Acumula la puntuacin a sumar+ como resultado de la muerte de los enemigos u otros eventos, Parameter!= puntos > "os puntos a acumular de!acmlaPntacion pu4lic int desacumulaPuntuacion'( Desacumula la puntuacin a sumar, > ?&8 > $reacin de videojuegos con 5%6* 4etrn!= puntos Puntuacin acumulada con anterioridad, !etProtagoni!ta pu4lic void setProtagonista'*rotagonista prota( *stablece el objeto *rotagonista activo durante el juego getProtagoni!ta pu4lic *rotagonista getProtagonista'( Cetorna el objeto *rotagonista activo durante el juego 4etrn!= !n objeto de la clase *rotagonista !ingleton pu4lic static <estorElementos singleton'( Cetrona la =nica instancia de la clase <estorElementos 4etrn!= !n objeto <estorElementos de!troy pu4lic void destro$'( Finali7a la ejecucin de todos los objetos contenidos en la clase <estorElementos y libera los recursos de memoria, a*ade pu4lic void a1ade'H4jetoMovil o4jetoMovil( Aade instancias de H4jetoMovil para su posterior tratamiento, Parameter!= o4jetoMovil > *l H4jetoMovil a aadir, > ?&' > Ap/ndices reinicia pu4lic 4oolean reinicia'int n( Inicia el contador de elementos al primer elemento de la cola Parameter!= n > F=mero de contador 3& o ?4 4etrn!= 0alse si no .ay elementos en la cola, true en caso contrario !igiente pu4lic 4oolean siguiente'int n( Incrementa el contador de elementos .asta el siguiente de la lista, Parameter!= n > F=mero de contador de elementos 3& o ?4 4etrn!= 0alse si se .a llegado al final de la lista, true en caso contrario get5DjetoMovil pu4lic H4jetoMovil get2betoMovil'int n( Dbtiene la instancia de H4jetoMovil referenciada por el contador de elementos, Parameter!= n > F=mero de contador de elementos 3& o ?4 4etrn!= *l H4jetoMovil referenciado, null en caso de 0ue no .aya ninguno referenciado, elimina pu4lic void elimina'H4jetoMovil o4jetoMovil( *limina de la lista el H4jetoMovil deseado, Parameter!= o4jetoMovil > "a referencia al H4jetoMovil 0ue se desea eliminar, !etFa!e! pu4lic void set!ases'java.util.?ector 0ases( > ?&) > $reacin de videojuegos con 5%6* *stablece las fases 3clase 7ase4 con las 0ue contar el juego Parameter!= 0ases > !n vector con las fases en orden de ejecucin, cargaPrimeraFa!e pu4lic void cargaPrimera!ase'( *stablece la primera 7ase como la 0ue va a ser ejecutada, carga.igienteFa!e pu4lic 4oolean cargaSiguiente!ase'( *stablece la siguiente 7ase de la lista como la 0ue va a ser ejecutada, 4etrn!= 0alse si ya se .an ejecutado todas las fases, true en caso contrario, getFa!e pu4lic 7ase get!ase'( Cetorna la fase en ejecucin 4etrn!= !n objeto de la clase 7ase liDeraFa!e pu4lic void libera!ase'( *stablece como 0ue no se est ejecutando ninguna 7ase com.lpgc.g&.til $la!! Je!torJra&ico java.lang.H4ject javax.microedition.lcdui.Displaa4le javax.microedition.lcdui.Canvas javax.microedition.lcdui.game.<ameCanvas > ?&9 > Ap/ndices com&ulpgc&gf&util&)estor)rafico public class Je!torJra&ico e1tends java1,microedition,lcdui,game,#ame$anvas -e encarga de la gestin de los grficos en pantalla, $on!trctor :etail Je!torJra&ico pu4lic )estor)rafico'<estorJuego gestorJuego( $rea una instancia de <estor<ra0ico+ y se le asigna la clase <estorJuego 0ue la uili7ar, Met2od :etail paint pu4lic void paint'javax.microedition.lcdui.<raphics graphics( Pinta todos los elementos del juego en pantalla, Parameter!= graphics > Dbjeto <raphics a utili7ar, @eyPre!!ed protected void .e$Pressed'int i( 6anejador de eventos 0ue se dispara al pulsarse una tecla del dispositivo, Parameter!= i > $digo de tecla pulsada @ey4elea!ed protected void .e$3eleased'int i( 6anejador de eventos 0ue se dispara al soltarse una tecla del dispositivo+ previamente pulsada, Parameter!= i > $digo de tecla pulsada > ?&: > $reacin de videojuegos con 5%6* com.lpgc.g&.til $la!! Je!torJego java.lang.H4ject com&ulpgc&gf&util&)estor4uego 6ll Implemented Inter&ace!= java1,microedition,lcdui,$ommand"istener+ java,lang,Cunnable public class Je!torJego e1tends java,lang,Dbject implements java,lang,Cunnable+ java1,microedition,lcdui,$ommand"istener Implementa el bucle principal de la ejecucin del juego, -e encarga de mover todos los elementos 3Fases+ Dbjetos+ Protagonista,,,4+ asi como de controlar todas las interacciones entre estos, Tambi/n se encarga de llamar al dibujado en pantalla de todos los elementos, Implementa la clase Funna4le para ser ejecutado en un 2hread aparte, Field :etail E.?6:5KJBEJ5 pu4lic static 0inal int 'ST0/2546')2 Indica 0ue se est jugando una partida al juego, E.?6:5KJ6ME5LE4 pu4lic static 0inal int 'ST0/25)0M'2#'3 Indica 0ue la partida acaba de terminar 3aparece el letrero #A6* DO*C4 E.?6:5KP6B.6 pu4lic static 0inal int 'ST0/25P06S0 Indica 0ue la accin del juego se .a pausado E.?6:5KI;:EFI;I:5 pu4lic static 0inal int 'ST0/2578/'!787/2 > ?&; > Ap/ndices Indica un estado no definido+ au1iliar para acciones especiales 0ue el programador desee, E.?6:5K6$6<64 pu4lic static 0inal int 'ST0/250C0903 *l juego termin definitivamente 3se vuelve a la presentacin4, $on!trctor :etail Je!torJego pu4lic )estor4uego'( $rea una instancia de <estorJuego Met2od :etail vi!aliCa pu4lic void visualiza'javax.microedition.lcdui.Displa displa( Indica el conte1to del dispositivo a usar para la visuali7acin en pantalla de los elementos, Parameter!= displa > Dispositivo usado para la visuali7acin, getE!tado pu4lic int get'stado'( Cetorna el estado del <estorJuego 3ES2&DHK&C&@&F+ ES2&DHK<&MEH?EF+ ES2&DHKI8DE7I8IDH+ ES2&DHKJ>E<H o ES2&DHK*&>S&4 4etrn!= *l n=mero de estado del gestor !etE!tado pu4lic void set'stado'int estadoKactual( Define el estado del <estorJuego 3ES2&DHK&C&@&F+ ES2&DHK<&MEH?EF+ ES2&DHKI8DE7I8IDH+ ES2&DHKJ>E<H o ES2&DHK*&>S&4 > ?&< > $reacin de videojuegos con 5%6* Parameter!= estadoKactual > *l n=mero de estado rn pu4lic void run'( Gucle princpial del juego, -e mueven los objetos+ se controlan las interacciones entre estos+ y se dibujan en pantalla, .peci&ied Dy= run in interface java.lang.Funna4le iniciaPartida pu4lic void iniciaPartida'( Inicia los datos para empe7ar una partida nueva command6ction pu4lic void command0ction'javax.microedition.lcdui.Command command1 javax.microedition.lcdui.Displaa4le displaa4le( 6anejador de eventos para cuando se pulsan los comandos de ^Pausar^ y ^$ontinuar partida^ .peci&ied Dy= command&ction in interface javax.microedition.lcdui.Command/istener pa!ar pu4lic void pausar'4oolean pausa( Implementa la pausa del juego, Parameter!= pausa > -i true+ el juego ser pausado, -i 0alse+ la ejecucin del juego continuar, getPnto! pu4lic int getPuntos'( > ??& > Ap/ndices Dbtiene la puntuacin de la partida 4etrn!= *l n=mero de puntos acumulados durante la partida, !etLida! pu4lic void set#idas'int vidas( Indica el n=mero de ^vidas^ del protagonista, Parameter!= vidas > *l n=mero de ^vidas^ getLida! pu4lic int get#idas'( Dbtiene el n=mero de ^vidas^ del protagonista 4etrn!= *l n=mero de ^vidas^ com.lpgc.g&.til.!ond $la!! Je!tor.onido! java.lang.H4ject com&ulpgc&gf&util&sound&)estorSonidos public class Je!tor.onido! e1tends java,lang,Dbject -e encarga de la gestin de memoria relacionada con la gestin de los recursos de sonido, Tambi/n se encarga de .acerlos sonar y pararlos, *s una clase del tipo singleton+ lo cual 0uiere decir 0ue slo .ay una instancia de ella en toda la aplicacin+ adems+ es accesible desde cual0uier punto de /sta, Met2od :etail !ingleton pu4lic static <estorSonidos singleton'( > ??? > $reacin de videojuegos con 5%6* Dbtiene la =nica instancia de la clase <estorSonidos de toda la aplicacin, 4etrn!= "a instancia de <estorSonidos, elimina.onido! pu4lic void eliminaSonidos'( *limina de la memoria todos los sonidos cargados, elimina.onido pu4lic void eliminaSonido'int index( *limina un sonido de memoria, Parameter!= index > *l ndice del sonido a eliminar, carga.onido pu4lic int cargaSonido'java.lang.String 0ilename1 java.lang.String tpe1 4oolean repeat( $arga en memoria un sonido, Parameter!= 0ilename > *l nombre del fic.ero 0ue contiene el sonido tpe > *l tipo 6I6* del sonido 3SaudioGmidiS+ audioGmp3+ etc,,,4 repeat > -i true+ al acabar de tocarse el sonido completo+ automticamente se empe7ar a tocar de nuevo desde el principio, 4etrn!= *l ndice del sonido, toca.onido pu4lic void tocaSonido'int index( $omien7a a tocar un sonido, Parameter!= index > *l ndice del sonido a tocar, > ??% > Ap/ndices getInde+.onido6ctal pu4lic java.lang.Integer get7ndexSonido0ctual'( Dbtiene el ndice del sonido 0ue est tocando, 4etrn!= *l ndice del sonido 0ue est tocando, null en caso de 0ue no se est/ tocando ninguno, para.onido pu4lic void paraSonido'( Termina el sonido 0ue est tocando, getMediaPlayer pu4lic Media*laer getMediaPla$er'int index( Dbtiene el objeto Media*laer del sonido 0ue se desee, Parameter!= index > \ndice del sonido, 4etrn!= "a instancia de Media*laer del sonido deseado, com.lpgc.g&.til.!ond $la!! MediaPlayer java.lang.H4ject com&ulpgc&gf&util&sound&MediaPla$er 6ll Implemented Inter&ace!= java1,microedition,media,$ontrollable+ java1,microedition,media,Player public class MediaPlayer e1tends java,lang,Dbject implements java1,microedition,media,Player -e encarga de tocar y parar los sonidos cargados en memoria, "a idea de /sta clase es pre>cac.ear los sonidos en memoria para tenerlos disponibles al instante en 0ue se 0uiera comen7ar su ejecucin, -e debe tener cuidado+ ya 0ue si se cac.ean demasiados sonidos+ la memoria se llenar > ??8 > $reacin de videojuegos con 5%6* muy fcilmente, $on!trctor :etail MediaPlayer pu4lic MediaPla$er'java.lang.String 0ilename1 java.lang.String contenttpe1 4oolean repeat( $onstruye un objeto Media*laer para un determinado sonido, Parameter!= 0ilename > *l nombre del fic.ero 0ue contiene el sonido contenttpe > *l tipo 6I6* del sonido 3SaudioGmidiS+ audioGmp3+ etc,,,4 repeat > -i true+ al acabar de tocarse el sonido completo+ automticamente se empe7ar a tocar de nuevo desde el principio, Met2od :etail !tart pu4lic void start'( $omien7a a tocar el sonido .peci&ied Dy= start in interface javax.microedition.media.*laer get$ontrol! pu4lic javax.microedition.media.Control:; getControls'( Oer documentacin de javax.microedition.media.Controlla4le .peci&ied Dy= getControls in interface javax.microedition.media.Controlla4le get$ontrol pu4lic javax.microedition.media.Control getControl'java.lang.String s( Oer documentacin de javax.microedition.media.Controlla4le .peci&ied Dy= getControl in interface javax.microedition.media.Controlla4le > ??' > Ap/ndices realiCe pu4lic void realize'( throCs javax.microedition.media.MediaException Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= reali6e in interface javax.microedition.media.*laer ?2roM!= javax.microedition.media.MediaException pre&etc2 pu4lic void prefetch'( throCs javax.microedition.media.MediaException Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= pre0etch in interface javax.microedition.media.*laer ?2roM!= javax.microedition.media.MediaException !top pu4lic void stop'( Para el sonido .peci&ied Dy= stop in interface javax.microedition.media.*laer deallocate pu4lic void deallocate'( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= deallocate in interface javax.microedition.media.*laer clo!e pu4lic void close'( > ??) > $reacin de videojuegos con 5%6* Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= close in interface javax.microedition.media.*laer !et?ime<a!e pu4lic void setTime9ase'javax.microedition.media.2ime@ase time@ase( throCs javax.microedition.media.MediaException Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= set2ime@ase in interface javax.microedition.media.*laer ?2roM!= javax.microedition.media.MediaException get?ime<a!e pu4lic javax.microedition.media.2ime@ase getTime9ase'( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= get2ime@ase in interface javax.microedition.media.*laer !etMedia?ime pu4lic long setMediaTime'long l( throCs javax.microedition.media.MediaException Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= setMedia2ime in interface javax.microedition.media.*laer ?2roM!= javax.microedition.media.MediaException getMedia?ime pu4lic long getMediaTime'( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= getMedia2ime in interface javax.microedition.media.*laer > ??9 > Ap/ndices get.tate pu4lic int getState'( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= getState in interface javax.microedition.media.*laer get:ration pu4lic long get/uration'( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= getDuration in interface javax.microedition.media.*laer get$ontent?ype pu4lic java.lang.String getContentT$pe'( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= getContent2pe in interface javax.microedition.media.*laer !et7oop$ont pu4lic void set:oopCount'int i( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= set/oopCount in interface javax.microedition.media.*laer addPlayer7i!tener pu4lic void addPla$er:istener'javax.microedition.media.*laer/istener plaer/istener( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= > ??: > $reacin de videojuegos con 5%6* add*laer/istener in interface javax.microedition.media.*laer removePlayer7i!tener pu4lic void removePla$er:istener'javax.microedition.media.*laer/istener plaer/istener( Oer documentacin de javax.microedition.media.*laer .peci&ied Dy= remove*laer/istener in interface javax.microedition.media.*laer com.lpgc.g&.item! $la!! 5DjetoMovil java.lang.H4ject javax.microedition.lcdui.game./aer javax.microedition.lcdui.game.Sprite com&ulpgc&gf&items&2betoMovil :irect AnoMn .Dcla!!e!= Disparo+ *nemigo+ Dption+ Protagonista public abstract class 5DjetoMovil e1tends java1,microedition,lcdui,game,-prite -uperclase de todos los objetos activos en la pantalla+ tales como personajes+ disparos+ y dems objetos mviles, 6t2or= 6ario 6acias "loret Field :etail ?IP5K:I.P645 pu4lic static 0inal int T7P25/7SP032 Indica 0ue la instancia H4jetoMovil es un disparo del protagonista ?IP5KE;EMIJ5 pu4lic static 0inal int T7P25'8'M7)2 > ??; > Ap/ndices Indica 0ue la instancia H4jetoMovil es un enemigo, ?IP5K5P?I5; pu4lic static 0inal int T7P252PT728 Indica 0ue la instancia H4jetoMovil es un objeto a coger por el protagonista 3puntos e1tra+ vidas+ etc,,,4 ?IP5K<676M676 pu4lic static 0inal int T7P2590:0M0:0 Indica 0ue la instancia H4jetoMovil es un disparo de los enemigos ?IP5K5?45 pu4lic static 0inal int T7P252T32 Indica 0ue la instancia H4jetoMovil es cual0uier otro tipo de objeto mvil ?IP5KP45?6 pu4lic static 0inal int T7P25P32T0 Indica 0ue la instancia H4jetoMovil es el protagonista del videojuego $on!trctor :etail 5DjetoMovil pu4lic 2betoMovil'javax.microedition.lcdui.Image image( $onstruye un Dbjeto6ovil a partir de una imagen+ sin animacin, Parameter!= image > "a imagen de mapa de bits 0ue representa el objeto 5DjetoMovil pu4lic 2betoMovil'javax.microedition.lcdui.Image image1 int 0rameCidth1 int 0rameheight( > ??< > $reacin de videojuegos con 5%6* $onstruye un Dbjeto6ovil a partir de una imagen+ animada Parameter!= image > "a imagen 0ue representa todos los frames del objeto animado 0rameCidth > Tamao .ori7ontal de los frames+ en p1els 0rameheight > Tamao vertical de los frames+ en p1els Met2od :etail get?ipo pu4lic int getTipo'( Cetorna el tipo del objeto 32I*HK@&/&M&/&+2I*HKDIS*&FH+2I*HKE8EMI<H+ 2I*HKH*2IH8+2I*HKH2FH o 2I*HK*FH2&4, 4etrn!= el tipo del Dbjeto6ovil !et?ipo pu4lic void setTipo'int tipo( *stablece el tipo del objeto 32I*HK@&/&M&/&+2I*HKDIS*&FH+2I*HKE8EMI<H+ 2I*HKH*2IH8+2I*HKH2FH o 2I*HK*FH2&4, terminar pu4lic void terminar'( *limina la ejecucin del objeto matar pu4lic void matar'( Implementa la muerte del objeto mover pu4lic a4stract void mover'( Implementa el movimiento del objeto > ?%& > Ap/ndices cargaImagen protected static javax.microedition.lcdui.Image carga7magen'java.lang.String imagename( $arga desde el dispositivo de almacenamiento la imagen del Dbjeto6ovil Parameter!= imagename > Fombre del arc.ivo 0ue contiene la imagen 4etrn!= Dbjeto Image con la imagen del Dbjeto6ovil com.lpgc.g&.item!.option! $la!! 5ption java.lang.H4ject javax.microedition.lcdui.game./aer javax.microedition.lcdui.game.Sprite com.ulpgc.g0.items.H4jetoMovil com&ulpgc&gf&items&options&2ption public abstract class 5ption e1tends Dbjeto6ovil Implementa un H4jetoMovil a coger por el protagonista 3puntos e1tra+ vidas+ etc,,,4 $on!trctor :etail 5ption pu4lic 2ption'javax.microedition.lcdui.Image image( $onstruye el objeto Hption a partir de una imagen+ sin animacin, Parameter!= image > "a imagen de mapa de bits 0ue representa el objeto 5ption pu4lic 2ption'javax.microedition.lcdui.Image image1 int 0rameCidth1 int 0rameheight( $onstruye el objeto Hption a partir de una imagen+ animada Parameter!= > ?%? > $reacin de videojuegos con 5%6* image > "a imagen 0ue representa todos los frames del objeto animado 0rameCidth > Tamao .ori7ontal de los frames+ en p1els 0rameheight > Tamao vertical de los frames+ en p1els Met2od :etail acta pu4lic a4stract void actua'( Implementa la accin a reali7ar cuando el *rotagonista lo coge, com.lpgc.g&.til $la!! Pantalla java.lang.H4ject com&ulpgc&gf&util&Pantalla public class Pantalla e1tends java,lang,Dbject "a funcin de esta clase es ^pre>cac.ear^ algunos calculos referentes a la pantalla y poder obtenerlos con mayor rapide7 y facilidad, Field :etail ?I7EK.INE pu4lic static 0inal int T7:'5S7;' $onstante 0ue indica el tamao del lado+ en p1els+ de los 6iles cuadrados 0ue conforman el escenario, $on!trctor :etail Pantalla pu4lic Pantalla'( Met2od :etail cac2ear:ato! pu4lic static void cachear/atos'( $ac.ea los datos referentes al tamao de la pantalla y del tablero de juego, > ?%% > Ap/ndices get6nc2oPantalla pu4lic static int get0nchoPantalla'( 4etrn!= *l anc.o+ en p1els+ del tamao de la pantalla, get6ltoPantalla pu4lic static int get0ltoPantalla'( 4etrn!= "a altura+ en p1els+ del tamao de la pantalla, get6nc2o?aDlero pu4lic static int get0nchoTablero'( 4etrn!= "a anc.ura+ en p1els+ del tamao del tablero de juego, get6lto?aDlero pu4lic static int get0ltoTablero'( 4etrn!= "a altura+ en p1els+ del tamao del tablero de juego, com.lpgc.g&.item!.per!onaje! $la!! Protagoni!ta java.lang.H4ject javax.microedition.lcdui.game./aer javax.microedition.lcdui.game.Sprite com.ulpgc.g0.items.H4jetoMovil com&ulpgc&gf&items&personaes&Protagonista public abstract class Protagoni!ta e1tends Dbjeto6ovil > ?%8 > $reacin de videojuegos con 5%6* Field :etail .?5P pu4lic static 0inal int ST2P *l protagonista no se mueve BP pu4lic static 0inal int 6P *l protagonista se mueve .acia arriba :5>; pu4lic static 0inal int /2<8 *l protagonista se mueve .acia abajo 7EF? pu4lic static 0inal int :'!T *l protagonista se mueve .acia la i70uierda 4IJO? pu4lic static 0inal int 37)HT *l protagonista se mueve .acia la derec.a $on!trctor :etail Protagoni!ta pu4lic Protagonista'javax.microedition.lcdui.Image image( $onstruye el objeto *rotagonista a partir de una imagen+ sin animacin, Parameter!= image > "a imagen de mapa de bits 0ue representa el objeto Protagoni!ta > ?%' > Ap/ndices pu4lic Protagonista'javax.microedition.lcdui.Image image1 int 0rameCidth1 int 0rameheight( $onstruye un objeto *rotagonista a partir de una imagen+ animada Parameter!= image > "a imagen 0ue representa todos los frames del objeto animado 0rameCidth > Tamao .ori7ontal de los frames+ en p1els 0rameheight > Tamao vertical de los frames+ en p1els Met2od :etail getPedeMorir pu4lic 4oolean getPuedeMorir'( Indica si el protagonista puede morir al colisionar con un enemigo o un disparo 4etrn!= true si puede morir, 0alse en caso contrario, mover pu4lic a4stract void mover'( Implementa el movimiento del protagonista .peci&ied Dy= mover in class H4jetoMovil di!para pu4lic a4stract void dispara'( Implementa la accin a reali7ar cuando el protagonista dispara add:ireccion pu4lic void add/ireccion'int direccion( Aade una direccin en la cual el objeto se mueve 3S2H*+ >*+ DHD8+ /E72 o FI<E24, Parameter!= direccion > "a direccin en la cual se mueve > ?%) > $reacin de videojuegos con 5%6* delete:ireccion pu4lic void delete/ireccion'int direccion( Indica 0ue el objeto .a dejado de moverse en una direccin 3S2H*+ >*+ DHD8+ /E72 o FI<E24, Parameter!= direccion > "a direccin en la cual .a dejado de moverse !e:irige pu4lic 4oolean se/irige'int direccion( $onsulta si el objeto se mueve en una direccin concreta 3S2H*+ >*+ DHD8+ /E72 o FI<E24, Parameter!= direccion > "a direccin en la cual nos interesa saber si el objeto se mueve 4etrn!= true si el objeto se mueve en la direccin consultada, 0alse en caso contrario, > ?%9 > 6p1ndice <. $digo &ente del videojego 6p1ndice <. $digo &ente del videojego
PE!caDec2inaQ PE!caDec2inaQ $:_program_HTJ%%_apps_*scabec.ina_src_*scabec.ina,java 1 import javax.microedition.lcdui.Command; 2 import javax.microedition.lcdui.Command/istener; 3 import javax.microedition.lcdui.Displa; ! import javax.microedition.lcdui.Displaa4le; " import javax.microedition.midlet.MIDlet; $ import javax.microedition.midlet.MIDletStateChangeException; % import java.util.2imer; ) + /" """"""""""""""""""""""""""""""""""""""" 1- "" #scabechina """"""""""""""""""""""" 11 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 12 " $ue!o creado por Mario Mac%as &loret para el proyecto de f%n " 13 " de carrera en in!enier%a inform'tica( )*reaci+n de jue!os para $,M#) " 1! " -niversidad de &as Palmas de .ran *anaria " 1" " *urso ,//01,//2 " 1$ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 1% "/ 1) public class Esca4echina extends MIDlet implements Command/istener# 1+ private 2imer timer3null; 2- final static public int ES2&DHK*FESE82&CIH83-; 21 final static public int ES2&DHKJ><&8DH31; 22 final static public int ES2&DHK*&>S&32; 23 final static public int ES2&DHK<&MEH?EF33; 2! 2" final public static int DE/&9KMS 3 "-; 2$ 2% Displa displa3Displa.getDispla'this(; 2) private int estado3ES2&DHK*FESE82&CIH8; 2+ 3- 2areaJuego tareaJuego3null; 31 Juego juego3null; 32 33 protected void start&pp'( throws MIDletStateChangeException # 3! switch'getEstado'(( # 3" case ES2&DHK*&>S&O 3$ case ES2&DHKJ><&8DHO 3% setEstado'ES2&DHK*&>S&(; 3) brea.; 3+ defaultO !- setEstado'ES2&DHK*FESE82&CIH8(; !1 brea.; !2 , !3 , !! !" public void setEstado'int estado( # !$ this.estado3estado; !% switch'estado( # !) case ES2&DHK*FESE82&CIH8O !+ *resentacionCanvas canvas3new *resentacionCanvas'(; "- canvas.setCommand/istener'this(; "1 displa.setCurrent'canvas(; "2 canvas.repaint'(; "3 if'timerT3null( # "! timer.cancel'(; "" timer3null; "$ , "% tareaJuego3null; ") juego3null; "+ brea.; $- case ES2&DHK*&>S&O $1 *ausaCanvas pausa3new *ausaCanvas'(; $2 pausa.setCommand/istener'this(; $3 displa.setCurrent'pausa(; $! brea.; $" case ES2&DHKJ><&8DHO $$ if'tareaJuego33null( # $reacin de videojuegos con 5%6* $% tareaJuego3new 2areaJuego'this(; $) , $+ if'juego33null( # %- juego3new Juego'tareaJuego(; %1 , %2 juego.setCommand/istener'this(; %3 if'timer33null( # %! timer3new 2imer'(; %" timer.schedule'tareaJuego1DE/&9KMS1DE/&9KMS(; %$ , %% displa.setCurrent'juego(; %) brea.; %+ case ES2&DHK<&MEH?EFO )- juego.removeCommand'juego.comando*ausa(; )1 juego.addCommand'new Command'"Salir"1Command.S2H*11((; )2 return; )3 , )! Sstem.gc'(; //.arba!e collection manual )" , )$ )% public int getEstado'( # )) return estado; )+ , +- +1 protected void pause&pp'( # +2 if'estado33ES2&DHKJ><&8DH( # +3 setEstado'ES2&DHK*&>S&(; +! , +" , +$ +% protected void destro&pp'boolean 4( throws MIDletStateChangeException # +) , ++ 1-- public void command&ction'Command command1 Displaa4le displaa4le( # 1-1 tr$ # 1-2 if'estado33ES2&DHK*FESE82&CIH8( # 1-3 switch'command.getCommand2pe'(( # 1-! case Command.HAO 1-" setEstado'ES2&DHKJ><&8DH(; 1-$ brea.; 1-% case Command.E=I2O 1-) this.noti0Destroed'(; 1-+ brea.; 11- , 111 , else if'estado33ES2&DHKJ><&8DH( # 112 if'command.getCommand2pe'(33Command.S2H*( # 113 setEstado'ES2&DHK*&>S&(; 11! , 11" , else if'estado33ES2&DHK<&MEH?EF( # 11$ if'command.getCommand2pe'(33Command.S2H*( # 11% setEstado'ES2&DHK*FESE82&CIH8(; 11) , 11+ , else if'estado33ES2&DHK*&>S&( # 12- switch'command.getCommand2pe'(( # 121 case Command.HAO 122 setEstado'ES2&DHKJ><&8DH(; 123 brea.; 12! case Command.E=I2O 12" setEstado'ES2&DHK*FESE82&CIH8(; 12$ brea.; 12% , 12) , 12+ 13- 131 , catch'Exception e( # 132 e.printStacR2race'(; 133 , 13! , 13" 13$ , 13% > ?%; > Ap/ndices $:_program_HTJ%%_apps_*scabec.ina_src_5uego,java 1 2 import javax.microedition.lcdui.Canvas; 3 import javax.microedition.lcdui.Command; ! import javax.microedition.lcdui.<raphics; " import javax.microedition.lcdui.Image; $ % /" """"""""""""""""""""""""""""""""""""""" ) "" #scabechina """"""""""""""""""""""" + """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 1- " $ue!o creado por Mario Mac%as &loret para el proyecto de f%n " 11 " de carrera en in!enier%a inform'tica( )*reaci+n de jue!os para $,M#) " 12 " -niversidad de &as Palmas de .ran *anaria " 13 " *urso ,//01,//2 " 1! """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 1" "/ 1$ public class Juego extends Canvas # 1% private static Image pers:;; //3ma!enes de los personajes 1) private static Image persout:;; //3ma!enes de los personajes cuando les han pe!ado 1+ private static Image hoo4acR3null; 2- private static Image hoo0ront3null; 21 private static Image numeros:;; 22 private static Image guante3null; 23 private static Image estrella3null; 2! private static Image 0in3null; 2" 2$ 2% public final static int CE/D&KDID2E32$; 2) public final static int CE/D&KEEI<E231); 2+ 3- private static Image pagina3null; 31 32 2areaJuego tarea3null; 33 public Command comando*ausa3null; 3! public Juego'2areaJuego tarea( # 3" tr$ # 3$ this.tarea3tarea; 3% estrella3Image.createImage'"%estrella&png"(; 3) 3+ 0in3Image.createImage'"%fin&png"(; !- !1 pers3new Image:!;; !2 pers:-;3Image.createImage'"%cerdo&png"(; !3 pers:1;3Image.createImage'"%tio&png"(; !! pers:2;3Image.createImage'"%pingu&png"(; !" pers:3;3Image.createImage'"%perro&png"(; !$ !% persout3new Image:!;; !) persout:-;3Image.createImage'"%cerdopegao&png"(; !+ persout:1;3Image.createImage'"%tiopegao&png"(; "- persout:2;3Image.createImage'"%pingupegao&png"(; "1 persout:3;3Image.createImage'"%perropegao&png"(; "2 "3 numeros3new Image:1-;; "! for'int i3-;iL1-;iBB( # "" numeros:i;3Image.createImage'"%numero5"BiB"&png"(; "$ , "% ") hoo4acR3Image.createImage'"%buerofondo&png"(; "+ hoo0ront3Image.createImage'"%buerofrente&png"(; $- $1 guante3Image.createImage'"%guante&png"(; $2 $3 pagina3Image.createImage'CE/D&KDID2E.3B1)1CE/D&KEEI<E2.3(; $! $" this.addCommand'comando*ausa3new Command'"Pausar"1Command.S2H*11((; $$ , catch'Exception e( # $% e.printStacR2race'(; $) , $+ %- , %1 %2 protected void paint'<raphics graphics( # > ?%< > $reacin de videojuegos con 5%6* %3 <raphics pg3pagina.get<raphics'(; %! int hoo3-; %" for'int 3-;L3;BB( # %$ for'int x3-;xL3;xBB( # %% pg.draCImage'hoo4acR1x.CE/D&KDID2E1.CE/D&KEEI<E21-(; %) if'tarea.ocupado:hoo;( # %+ Image tmpimg3null; )- if'tarea.herido:hoo;( # )1 tmpimg3persout:tarea.personaje:hoo;;; )2 , else # )3 tmpimg3pers:tarea.personaje:hoo;;; )! , )" )$ pg.draCImage'tmpimg1x.CE/D&KDID2E1.CE/D&KEEI<E2Btarea.altura:hoo;1-(; )% , )) pg.draCImage'hoo0ront1x.CE/D&KDID2E1.CE/D&KEEI<E21-(; )+ +- if'tarea.posicionguante33'hooB1( UU tarea.programa.getEstado'(33Esca4echina.ES2&DHKJ><&8DH ( # +1 pg.draCImage'guante1x.CE/D&KDID2EB!Mtarea.0ramesguante.21.CE/D&KEEI<E2B!M tarea.0ramesguante.21-(; +2 , else if' tarea.programa.getEstado'(33Esca4echina.ES2&DHK<&MEH?EF ( # +3 pg.draCImage'0in11!11-1-(; +! , +" +$ hooBB; +% , +) ++ , 1-- 1-1 //dibujar estrellas 1-2 for'int i3-;iL!;iBB( # 1-3 if'tarea.xstar:i;N- UU tarea.xstar:i;L'2$.3( UU tarea.star:i;L1).3( # 1-! pg.draCImage'estrella1tarea.xstar:i;1tarea.star:i;1-(; 1-" , 1-$ , 1-% 1-) //dibujar el marcador 1-+ int pt3tarea.puntos; 11- for'int i3-;iL3;iBB( # 111 pg.draCImage'numeros:ptV1-;12$.311).'2Mi(1-(; 112 pt3ptG1-; 113 , 11! 11" graphics.draCImage'pagina1-1-1-(; 11$ 11% , 11) 11+ protected void Re*ressed'int i( # 12- super.Re*ressed'i(; 121 switch'i( # 122 /" para cuando se jue!a con el teclado del ordena (emulador) "/ 123 12! case Canvas.AE9K8>M1O 12" tarea.posicionguante3%; 12$ tarea.0ramesguante3-; 12% brea.; 12) case Canvas.AE9K8>M2O 12+ tarea.posicionguante3); 13- tarea.0ramesguante3-; 131 brea.; 132 case Canvas.AE9K8>M3O 133 tarea.posicionguante3+; 13! tarea.0ramesguante3-; 13" brea.; 13$ case Canvas.AE9K8>M!O 13% tarea.posicionguante3!; 13) tarea.0ramesguante3-; 13+ brea.; 1!- case Canvas.AE9K8>M"O 1!1 tarea.posicionguante3"; 1!2 tarea.0ramesguante3-; 1!3 brea.; 1!! case Canvas.AE9K8>M$O 1!" tarea.posicionguante3$; 1!$ tarea.0ramesguante3-; > ?8& > Ap/ndices 1!% brea.; 1!) case Canvas.AE9K8>M%O 1!+ tarea.posicionguante31; 1"- tarea.0ramesguante3-; 1"1 brea.; 1"2 case Canvas.AE9K8>M)O 1"3 tarea.posicionguante32; 1"! tarea.0ramesguante3-; 1"" brea.; 1"$ case Canvas.AE9K8>M+O 1"% tarea.posicionguante33; 1") tarea.0ramesguante3-; 1"+ brea.; 1$- 1++ , 2-- 2-1 , 2-2 2-3 , 2-! $:_program_HTJ%%_apps_*scabec.ina_src_Pausa$anvas,java 1 2 import javax.microedition.lcdui.Image; 3 import javax.microedition.lcdui.Command; ! import javax.microedition.lcdui.<raphics; " import javax.microedition.lcdui.Canvas; $ % /" """"""""""""""""""""""""""""""""""""""" ) "" #scabechina """"""""""""""""""""""" + """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 1- " $ue!o creado por Mario Mac%as &loret para el proyecto de f%n " 11 " de carrera en in!enier%a inform'tica( )*reaci+n de jue!os para $,M#) " 12 " -niversidad de &as Palmas de .ran *anaria " 13 " *urso ,//01,//2 " 1! """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 1" "/ 1$ 1% public class *ausaCanvas extends Canvas # 1) private Image pausa 3 null; 1+ public *ausaCanvas'( # 2- tr$ # 21 pausa3Image.createImage'"%pausa&png"(; 22 , 23 catch'Exception e( # 2! e.printStacR2race'(; 2" , 2$ this.addCommand'new Command'"Continuar"1Command.HA11((; 2% this.addCommand'new Command'"Salir"1Command.E=I21-((; 2) 2+ , 3- 31 32 protected void paint'<raphics graphics( # 33 graphics.setColor'-1-1-(; 3! graphics.0illFect'-1-1this.getDidth'(1this.getEeight'((; 3" graphics.draCImage'pausa1-1-1-(; 3$ , 3% 3) , 3+ $:_program_HTJ%%_apps_*scabec.ina_src_Presentacion$anvas,java 1 2 import javax.microedition.lcdui.Canvas; 3 import javax.microedition.lcdui.Command; ! import javax.microedition.lcdui.<raphics; > ?8? > $reacin de videojuegos con 5%6* " import javax.microedition.lcdui.Image; $ % /" """"""""""""""""""""""""""""""""""""""" ) "" #scabechina """"""""""""""""""""""" + """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 1- " $ue!o creado por Mario Mac%as &loret para el proyecto de f%n " 11 " de carrera en in!enier%a inform'tica( )*reaci+n de jue!os para $,M#) " 12 " -niversidad de &as Palmas de .ran *anaria " 13 " *urso ,//01,//2 " 1! """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 1" "/ 1$ public class *resentacionCanvas extends Canvas # 1% private Image presentacion 3 null; 1) public *resentacionCanvas'( # 1+ tr$ # 2- presentacion3Image.createImage'"%presentacion&png"(; 21 , 22 catch'Exception e( # 23 e.printStacR2race'(; 2! , 2" this.addCommand'new Command'"4ugar"1Command.HA11((; 2$ this.addCommand'new Command'"Salir"1Command.E=I21-((; 2% 2) , 2+ 3- 31 protected void paint'<raphics graphics( # 32 graphics.setColor'-1-1-(; 33 graphics.0illFect'-1-1this.getDidth'(1this.getEeight'((; 3! graphics.draCImage'presentacion1-1-1-(; 3" , 3$ , 3% $:_program_HTJ%%_apps_*scabec.ina_src_Tarea5uego,java 1 import java.util.2imer2asR; 2 import java.util.Fandom; 3 /" """"""""""""""""""""""""""""""""""""""" ! "" #scabechina """"""""""""""""""""""" " """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" $ " $ue!o creado por Mario Mac%as &loret para el proyecto de f%n " % " de carrera en in!enier%a inform'tica( )*reaci+n de jue!os para $,M#) " ) " -niversidad de &as Palmas de .ran *anaria " + " *urso ,//01,//2 " 1- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 11 "/ 12 13 public class 2areaJuego extends 2imer2asR # 1! private boolean pausado3false; 1" Esca4echina programa3null; 1$ public final int ES2&DHKS>@E 3 -; 1% public final int ES2&DHK*&F&DH 3 1; 1) public final int ES2&DHK@&J& 3 2; 1+ 2- static Fandom rnd3new Fandom'Sstem.current2imeMillis'((; 21 22 int vidas33; 23 int golpesseguidos3-; 2! 2" int nivel3-; 2$ int puntos3-; 2% boolean ocupado:;3new boolean:+;; //indica si un a!ujero esta ocupado por al!un personaje 2) int estado:;3new int:+;; //indica qu4 hace el mu5eco (sube, baja, esta quieto...) 2+ boolean herido:;3new boolean:+;; //si true, al personaje le han dado 3- 31 int maxtmparri4a313--; //inicialmente el mu5eco esta 1 se!undo parado 32 int tmparri4a:;3new int:+;; //indica cuanto tiempo lleva un mu5eco arriba 33 3! int velocidad31; //velocidad a la que suben y bajan los mu5ecos 3" int altura:;3new int:+;; //altura a la que estan los personajes 3$ int personaje:;3new int:+;; //cual de los 0 personajes es (/..6) > ?8% > Ap/ndices 3% 3) public final int margen3 ); //3ndica a qu4 distancia en pi7els de su ma7ima altura se puede !olpear a un mu5eco 3+ !- int intervalo33---; //#l intervalo en ms entre que aparece un mu5eco o otro !1 int tactual323--; //cuenta el tiempo que lleva, cuando tactual8intervalo 118 tactual9/: e intervalo11: !2 !3 int posicionguante3-; //;< de a!ujero donde esta !olpeando el !uante (/9no !olpea) !! int max0ramesguante33; //;< de frames en que el !uante esta visible !" int 0ramesguante3-; !$ !% //datos para visualizar las estrellitas cuando se !olpea !) int xstar:;3new int:!;; //posicion 7 !+ int vxstar:;3new int:!;; //velocidad 7 (10..0) "- int star:;3new int:!;; //posicion y "1 int vstar:;3new int:!;; //velocidad y (10..infinito) =11 usaremos aceleracion de la !ravedad "2 "3 public 2areaJuego'Esca4echina programa( # "! pausado3false; "" this.programa3programa; "$ for'int i3-;iL+;iBB( # "% ocupado:i;3false; ") , "+ , $- public void run'( # $1 //#sta parte del 3> hace el .ame ?ver $2 if'programa.getEstado'(33Esca4echina.ES2&DHK<&MEH?EF( # $3 for'int i3-;iL+;iBB( # $! if'Tocupado:i;( # $" ocupado:i;3true; $$ personaje:i;3iV!; $% estado:i;3ES2&DHKS>@E; $) herido:i;3false; $+ altura:i;31); %- brea.; %1 , else # %2 if'estado:i;33ES2&DHKS>@E( # %3 if'altura:i;N-( # %! altura:i;MM; %" , else # %$ estado:i;3ES2&DHK@&J&; %% , %) , else # %+ if'altura:i;L2( # )- altura:i;BB; )1 , else # )2 estado:i;3ES2&DHKS>@E; )3 , )! , )" , )$ , )% , else if'programa.getEstado'(33Esca4echina.ES2&DHKJ><&8DH( # )) //Movimiento de las estrellas )+ for'int i3-;iL!;iBB( # +- if'xstar:i;N- UU xstar:i;L'2$.3( UU star:i;L1).3( # +1 xstar:i;B3vxstar:i;; +2 star:i;B3vstar:i;; +3 vstar:i;B31; +! , +" , +$ //control del !uante +% if'posicionguanteN-( # +) 0ramesguanteBB; ++ if''altura:posicionguanteM1;Mmargen(L- UU ocupado:posicionguanteM1; UU T herido:posicionguanteM1;( # 1-- //preparamos los datos de las estrellas 1-1 for'int i3-;iL!;iBB( # 1-2 vxstar:i;3rnd.nextInt'(V!; 1-3 vstar:i;3rnd.nextInt'(V$; 1-! xstar:i;3''posicionguanteM1(V3(.2$B13; 1-" star:i;3''posicionguanteM1(G3(.1)B%; 1-$ , 1-% > ?88 > $reacin de videojuegos con 5%6* 1-) herido:posicionguanteM1;3true; 1-+ 11- golpesseguidosBB; 111 if'golpesseguidos332-( # 112 vidas3vidas331-W1-OvidasB1; 113 golpesseguidos3-; 11! , 11" //estado@posicion!uante11A9#BCD?EFC$C: 11$ puntosBB; 11% , 11) if'0ramesguanteNmax0ramesguante( # 11+ 0ramesguante3-; 12- posicionguante3-; 121 , 122 , 123 12! tactualB3Esca4echina.DE/&9KMS; 12" //Mirar si hay que sacar al!un mu5eco nuevo 12$ if'tactualNintervalo( # 12% tactual31-; 12) 12+ if'intervaloL)--( # 13- intervaloM3!"; 131 if'intervaloL'!--Mnivel(( # 132 //cada vez que sobrepase el intervalo, subimos el nivel un poco 133 intervalo3%--Mnivel; 13! if'nivelL1-"( # 13" nivelB31"; 13$ , 13% 13) , 13+ , else # 1!- intervaloM3intervaloG%; 1!1 , 1!2 velocidad3'3M'intervaloG%--((; 1!3 if'velocidadL1( velocidad31; 1!! 1!" maxtmparri4aM31-; 1!$ if'maxtmparri4aL1"-( # 1!% maxtmparri4a31"-; 1!) , 1!+ int hoo3Math.a4s'rnd.nextInt'(V+(; 1"- int hoosocupados3-; 1"1 while'ocupado:hoo; UU hoosocupadosL+( # 1"2 hoo3'hooB1(V+; 1"3 hoosocupados3'hoosocupadosB1(V+; 1"! , 1"" //cuando vaya muy rapido, todos los hoyos pueden estar ocupados 1"$ //de esta manera, esperamos al si!uiente frame, hasta que haya al!uno libre 1"% if'hoosocupadosL+( # 1") tactual3-; 1"+ estado:hoo;3ES2&DHKS>@E; 1$- herido:hoo;3false; 1$1 ocupado:hoo;3true; 1$2 altura:hoo;31); 1$3 personaje:hoo;3Math.a4s'rnd.nextInt'(V!(; 1$! tmparri4a:hoo;3-; 1$" , 1$$ , 1$% //*ontrolar los que ya hay moviendose 1$) for'int hoo3-;hooL+;hooBB( # 1$+ if'ocupado:hoo;( # 1%- switch'estado:hoo;( # 1%1 case ES2&DHKS>@EO 1%2 altura:hoo;M3velocidad; 1%3 if'altura:hoo;L-( # 1%! altura:hoo;3-; 1%" estado:hoo;3ES2&DHK*&F&DH; 1%$ , 1%% brea.; 1%) case ES2&DHK*&F&DHO 1%+ tmparri4a:hoo;B3Esca4echina.DE/&9KMS; 1)- if'tmparri4a:hoo;Nmaxtmparri4a( # 1)1 estado:hoo;3ES2&DHK@&J&; 1)2 , 1)3 brea.; > ?8' > Ap/ndices 1)! case ES2&DHK@&J&O 1)" altura:hoo;B3velocidad; 1)$ if'altura:hoo;N1)( # 1)% altura:hoo;31); 1)) ocupado:hoo;3false; 1)+ if'Therido:hoo;( # 1+- vidasMM; 1+1 golpesseguidos3-; 1+2 if'vidas33-( # 1+3 programa.setEstado'Esca4echina.ES2&DHK<&MEH?EF(; 1+! , 1+" , 1+$ , 1+% brea.; 1+) , 1++ , 2-- , 2-1 , 2-2 programa.juego.repaint'(; 2-3 , 2-! 2-" , 2-$ > ?8) > 6p1ndice $. $digo &ente del videojego de 6p1ndice $. $digo &ente del videojego de
private abstract class *antalla extends Canvas # protected boolean salir;
public *antalla'( # salir3false; ,
public void salir'( # salir3true; ,
,
private class /etreros extends *antalla implements Funna4le # private final int numero33-; private int color:;1x:;1:;1incx:;1inc:;;
private int col0ondo1inccol0ondo; public /etreros'( # super'(; color3new int:numero;; x3new int:numero;; 3new int:numero;; incx3new int:numero;; inc3new int:numero;;
//inicializar datos de los !raficos col0ondo3-;inccol0ondo3"; $reacin de videojuegos con 5%6* for'int i3-;iLnumero;iBB( # color:i;3>tils.random'2"".2"".2""(; x:i;3>tils.random'getDidth'((; :i;3>tils.random'getEeight'((; incx:i;3>tils.random'%(M!; inc:i;3>tils.random'%(M!; , ,
> ?8; > Ap/ndices public class DemoJuego extends MIDlet # public final static int ES2&DHK*FESE82&CIH8 3 -; public final static int ES2&DHK*&>S& 3 1; public final static int ES2&DHKJ>E<H 3 2; public final static int ES2&DHKS&/IE8DH 3 3; public final static int ES2&DHK<&MEH?EF 3 !; public final static int ES2&DHK7I8 3 ";
private int estado3ES2&DHK*FESE82&CIH8; private <estorJuego gj3null; private *resentacion presentacion 3null;
protected void start&pp'( throws MIDletStateChangeException # switch'estado( # case ES2&DHKJ>E<HO case ES2&DHK*&>S&O setEstado'ES2&DHK*&>S&(; brea.; case ES2&DHK*FESE82&CIH8O *antalla.cachearDatos'(; setEstado'ES2&DHK*FESE82&CIH8(; brea.; , ,
import com.ulpgc.mmacias.util.Con0iguracion; > ?8< > $reacin de videojuegos con 5%6* import javax.microedition.lcdui..; import java.io.IHException;
public class *resentacion implements Command/istener #
public final static int ES2&DHKIM&<E83-; public final static int ES2&DHK*FI8CI*&/31; public final static int ES2&DHKH*CIH8ES32; public final static int ES2&DHK&9>D&33;
private int estado; private DemoJuego midlet3null;
public final static String H*CIH8KJ><&F3"4ugar"; public final static String H*CIH8KH*CIH8ES3"2pciones";
public void set&ca4ada'boolean aca4ada( # this.aca4ada3aca4ada; , public boolean is&ca4ada'( # return aca4ada; ,
public void mover'( # //i no se ha lle!ado al final de la pantalla) if''posxB*antalla.get&ncho2a4lero'((L0rente.getColumns'(.*antalla.2I/EKSIQEM"( # posxB33; //emaforo para no cambiar la posicion de la pantalla mientras se esta dibujando //asi se evitan efectos indeseables 0rente.set*osition'Mposx1*antalla.2I/EKSIQE."(; 0ondo.set*osition'MposxG!1-(; , ,; > ?'% > Ap/ndices abstract public void 0inali6ar'(;
public abstract class H4jetoMovil extends Sprite # public static final int 2I*HKDIS*&FH 3 -; public static final int 2I*HKE8EMI<H 3 1; public static final int 2I*HKH*2IH8 3 2; public static final int 2I*HK@&/&M&/& 3 3; public static final int 2I*HKH2FH 3 !; public static final int 2I*HK*FH2& 3 ";
protected int tipo;
public H4jetoMovil'Image image( # super'image(; ,
public H4jetoMovil'Image image1 int 0rameCidth1 int 0rameheight( # super'image10rameCidth10rameheight(; ,
public int get2ipo'( # return tipo; ,
> ?') > $reacin de videojuegos con 5%6* public void set2ipo'int tipo( # this.tipo 3 tipo; ,
public void terminar'( # <estorElementos.singleton'(.elimina'this(; ,
public class DisparoSimple extends Disparo # private static Image image3null; private static final int &8CEH3); private static final int &/2H3);
static # image3cargaImagen'"%disparo&png"(; , public DisparoSimple'int x1 int ( # super'image(; this.set*osition'x1(; de0ineFe0erence*ixel'&8CEHG21&/2HG2(; , public void mover'( # if'get='(N*antalla.get&ncho2a4lero'(( # terminar'(; , move'1"1-(; > ?'9 > Ap/ndices ,
public int get7uer6a'( # return 1; , , $:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_options_Dption,java pac.age com.ulpgc.mmacias.items.options;
import com.ulpgc.mmacias.items.H4jetoMovil;
import javax.microedition.lcdui.Image; public abstract class Hption extends H4jetoMovil # public Hption'Image image( # super'image(; ,
public Hption'Image image1 int 0rameCidth1 int 0rameheight( # super'image10rameCidth10rameheight(; ,
//hace lo que quiera cuando el prota!onista lo obtiene public abstract void actua'(; , $:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_otros_Gala6ala,java pac.age com.ulpgc.mmacias.items.otros;
//haremos que la bala se dirija al punto mediante el al!oritmo de bresenham. double x11incx1inc;
public @alaMala'int 0romx1 int 0rom1 int tox1 int to( # super'image(; this.tipo32I*HK@&/&M&/&; this.set*osition'0romx10rom(; de0ineFe0erence*ixel'&8CEHG21&/2HG2(;
x30romx; 30rom;
//Cpro7imacion rapida y rastrera de sqrt(ladoElar!oJladoEcorto) 118 ladroElar!o J2/1H"ladoEcorto //;ormalizaremos los vectores y los multiplicamos por la velocidad para conocer el incremento que deben //tener las balas en todo momento //e hace as% por que java no tiene ni KLB, 3;, *?, etc... para hacerlo mediante otros m4todos m's precisos int /13Math.a4s'toxM0romx(; int /23Math.a4s'toM0rom(;
> ?': > $reacin de videojuegos con 5%6* int max1min; if'Math.a4s'/1(NMath.a4s'/2(( # max3/1; min3/2; , else # max3/2; min3/1; , double modulo3Math.a4s'1$.maxB".min(G1$; incx3/1Gmodulo.?E/HCID&D; inc3/2Gmodulo.?E/HCID&D; if'0romxNtox( incx3Mincx; if'0romNto( inc3Minc; , public void mover'( # if'get='(N*antalla.get&ncho2a4lero'( II get='(LM&8CEH II get9'(LM&/2H II get9'(N*antalla.get<o2a4lero'(( # terminar'(; , xB3incx; B3inc; set*osition''int(x1'int((; ,
public Caca'int altura( # this'(; set*osition'*antalla.get&ncho2a4lero'(BDID2E1altura(; ,
public void mover'( # if'timeBBV233-( # this.next7rame'(; ,
switch'estado( # case -O move'M$1-(; int x3get='(; if'xLdisparo UU Tdisparado( # dispara'(; disparado3true; , if'get='(L1-( # if'get9'(L*antalla.get<o2a4lero'(G2( # estado31; , else # estado32; , , brea.; case 1O move'!12(; if'get='(N*antalla.get&ncho2a4lero'( II get9'(LMDID2E( # terminar'(; , brea.; case 2O move'!1M2(; if'get='(N*antalla.get&ncho2a4lero'( II get9'(N*antalla.get<o2a4lero'(( # terminar'(; , brea.; ,
,
public void matar'( # super.matar'(; <estorElementos.singleton'(.aPade'new Explosion'get='(1get9'(((; ,
public void tocar'Disparo disparo( # matar'(; ,
public int get*untuacion'( //devuelve el numero de puntos a sumar cuando muere el enemi!o # return "; , > ?'< > $reacin de videojuegos con 5%6* , $:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_personajes_$erdo,j ava pac.age com.ulpgc.mmacias.items.personajes;
public class Cerdo extends Enemigo # private int energia33; private static final int &8CEH332; private static final int &/2H32!; private static Image image3null; private static final int ?E/HCID&D3M!; private int FE@H2E3M13M>tils.random'$(;
private int accel3-;
static # image3cargaImagen'"%cerdo&png"(; ,
public Cerdo'( # super'image1&8CEH1&/2H(; de0ineFe0erence*ixel'&8CEHG21&/2HG2(; set*osition'*antalla.get&ncho2a4lero'(B&8CEH1>tils.random'*antalla.get<o2a4lero'(M&8CEH((; ,
public void matar'( # super.matar'(; <estorElementos ge3<estorElementos.singleton'(; int x3get='(1 3get9'(; ge.aPade'new Explosion'xM&8CEHG!1((; ge.aPade'new Explosion'xM3.&8CEHG!1((; terminar'(; ,
public class Elvis extends Enemigo # public static final int &8CEH 3 !-; public static final int &/2H 3 "$; public static final Image image3H4jetoMovil.cargaImagen'"%elvis&png"(;
private int estado3-; private int energia33-; private int tiempo3-; private int direccion31";
private 7ase 0ase;
public Elvis'7ase la7ase( # super'image1&8CEH1&/2H(; this.0ase3la7ase; tipo32I*HKE8EMI<H; de0ineFe0erence*ixel'&8CEHG21&/2HG2(; set*osition'*antalla.get&ncho2a4lero'(1*antalla.get<o2a4lero'(M*antalla.2I/EKSIQEG2M&/2H(; ,
public void matar'( # tipo32I*HKH2FH; estado33; direccion3M12; tiempo3-; ,
public int get*untuacion'( //devuelve el numero de puntos a sumar cuando muere el enemi!o # return $-; , , $:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_personajes_*nemig o,java pac.age com.ulpgc.mmacias.items.personajes;
public class *rotagonista extends H4jetoMovil # static Image image3null;
private boolean muriendo1saliendo; private int velocKcaida3-; //para cuando esta muriendo private int tiempo3-;
private static final int &8CEH32!; private static final int &/2H31$;
public static final int S2H* 3 -; public static final int >* 3 1; public static final int DHD8 3 2; public static final int /E72 3 !; public static final int FI<E2 3 ) ;
private int velocidad 3 !"; private int errorveloc 3 -; // como iremos dividiendo la velocidad entre 1/ para dar mas precision, // acumulamos el error para no perderla
private int direccion; private boolean disparando; static # image3cargaImagen'"%protagonista&png"(; ,
public *rotagonista'( # super'image1&8CEH1&/2H(; tipo32I*HK*FH2&; de0ineFe0erence*ixel'&8CEHG21&/2HG2(; setSaliendo'(; disparando3false; ,
> ?); > Ap/ndices public class Media*laer implements *laer # private *laer the*laer3null;
private long media2ime; // &a idea es pre1cachear el mediaBime y la duraci+n al // inicio de la pantalla, ya que su c'lculo requiere muchisimo tiempo private long duration;
public Media*laer'String 0ilename1 String contenttpe1 boolean repeat( # tr$ # the*laer3Manager.create*laer'getClass'(.getFesource&sStream'0ilename(1contenttpe(; media2ime3the*laer.getMedia2ime'(; duration3the*laer.getDuration'(; if'repeat( # the*laer.add*laer/istener' new *laer/istener'( # public void plaer>pdate'*laer plaer1 String s1 H4ject o( # if's.e5uals'*laer/istener.E8DKH7KMEDI&(( # tr$ # plaer.start'(; , catch'MediaException e( # Sstem.out.println'"'rror reCtocando la musiDueti( "Be.getMessage'((; , , , , (; , , catch'MediaException e( # Sstem.out.println'0ilenameB" C 'l Pla$er no puede ser creado para dicho Stream $ tipo( "Be.getMessage'((; , catch'IHException e( # Sstem.out.println'0ilenameB" C Hubo un problema le$endo los datos del 7nputStream( "Be.getMessage'((; ,
,
public void start'( # tr$ # the*laer.start'(; , catch'MediaException e( # Sstem.out.println'"'rror tocando la musiDueti( "Be.getMessage'((; , ,
public Control:; getControls'( # return the*laer.getControls'(; ,
public Control getControl'String s( # return the*laer.getControl's(; ,
public void reali6e'( throws MediaException # the*laer.reali6e'(; ,
public void pre0etch'( throws MediaException # the*laer.pre0etch'(; ,
public void stop'( # tr$ # the*laer.stop'(; , catch'MediaException e( # Sstem.out.println'"'rror parando la musica( "Be.getMessage'((; , ,
public void deallocate'( # the*laer.deallocate'(; ,
public void close'( # the*laer.close'(; > ?)< > $reacin de videojuegos con 5%6* ,
public void set2ime@ase'2ime@ase time@ase( throws MediaException # the*laer.set2ime@ase'time@ase(; ,
public 2ime@ase get2ime@ase'( # return the*laer.get2ime@ase'(; ,
public long setMedia2ime'long l( throws MediaException # return the*laer.setMedia2ime'l(; ,
public long getMedia2ime'( # return media2ime; ,
public int getState'( # return the*laer.getState'(; ,
public long getDuration'( # return duration; ,
public String getContent2pe'( # return the*laer.getContent2pe'(; ,
public void set/oopCount'int i( # the*laer.set/oopCount'i(; ,
public void add*laer/istener'*laer/istener plaer/istener( # the*laer.add*laer/istener'plaer/istener(; ,
// estas dos funciones retornan la puntuaci+n a sumar, como // resultado de la muerte de los enemi!os public void acumula*untuacion'int puntos( # puntuacionKacumuladaB3puntos; ,
public int desacumula*untuacion'( # int tmp3puntuacionKacumulada; puntuacionKacumulada3-; return tmp; ,
public *rotagonista get*rotagonista'( # return prota; ,
public void destro'( # > ?9? > $reacin de videojuegos con 5%6* ge3null; if'0aseT3null( # 0ase.0inali6ar'(; , 0ase3null; actual3null; primero3null; prota3null; ,
//e a5aden al principio de la cola para que las acciones )mover) //de los objetos no se realicen hasta la si!uiente iteraci+n, cuando //se llame al m4todo )reinicia) public void aPade'H4jetoMovil o4jetoMovil( # 0ase.insert'o4jetoMovil1-(; if'primero33null( # primero3new 8odo'(; primero.o4jeto3o4jetoMovil; , else # 8odo tmp3new 8odo'(; tmp.siguiente3primero; tmp.o4jeto3o4jetoMovil; primero3tmp; , ,
// en las si!uientes , funciones, )n) indica el nMmero de // referencia al nodo !uardado en el array )actual) public boolean siguiente'int n( # if'actual:n;33null II actual:n;.siguiente33null( # return false; , else # actual:n;3actual:n;.siguiente; return true; , ,
public <estor<ra0ico'<estorJuego gestorJuego( # this'(; el<estorJuego3gestorJuego; this.setCommand/istener'gestorJuego(; ,
public void paint'<raphics graphics( # 7ase 0ase3ge.get7ase'(; if'0aseT3null( # 0ase.paint'graphics(; , else # Sstem.out.println'"!ase es null"(; ,
if'el<estorJuegoT3null( #
//Nacemos esto para redibujar el 'rea del marcador solo cuando 4ste haya cambiado //Cs% ahorraremos recursos de procesador if'puntosanterioresT3el<estorJuego.get*untos'( II vidasanterioresT 3el<estorJuego.get?idas'(( # puntosanteriores3el<estorJuego.get*untos'(; vidasanteriores3el<estorJuego.get?idas'(; int ant3*antalla.get&ncho2a4lero'(; int anp3*antalla.get&ncho*antalla'(; int alt3*antalla.get<o2a4lero'(; int alp3*antalla.get<o*antalla'(;
graphics.setColor'3-13-12--(; graphics.0illFect'-1alt1anp1alpMalt(; > ?98 > $reacin de videojuegos con 5%6* graphics.setColor'+-1+-12""(; graphics.draCFect'-1alt1anp1alpMalt(;
public void run'( # tiempoanterior3Sstem.current2imeMillis'(; iteraciones3-; //lon! frames9/: int estado3midlet.getEstado'(; while'estado33DemoJuego.ES2&DHKJ>E<H II estado33DemoJuego.ES2&DHK<&MEH?EF II estado33DemoJuego.ES2&DHK*&>S&( # if'ge.get7ase'(.is&ca4ada'(( # ge.get7ase'(.0inali6ar'(; midlet.setEstado'DemoJuego.ES2&DHK7I8(; , else # if'estadoT3DemoJuego.ES2&DHK*&>S&( # mover'(; , , iteracionesBB;
//implementaci+n del frame sOippin! //queremos 12 frames por se!undo, por lo tanto, se deber' llamar a la //funci+n mover() cada 1////12 ms. i no se puede alcanzar dicha cuota, //se omitir' la funci+n repaint (la mas lenta) hasta que pueda ser //alcanzada. i se alcanza de sobras, haremos )dormir) al thread los se!undos //sobrantes tiempoactual3Sstem.current2imeMillis'(; long idealiter37F&MESKSE<>8DH.'tiempoactualMtiempoanterior(G1---; if'iteracionesN3idealiter( # gg.repaint'(; //framesJJ: tr$ # long tiemposiguiente3'iteracionesB1(.1---G7F&MESKSE<>8DHBtiempoanterior; tiempoactual3Sstem.current2imeMillis'(; //ystem.out.println()jar( )J(tiemposi!uiente1tiempoactual)): long di0erencia3tiemposiguienteMtiempoactual; if'di0erenciaN-( # 2hread.sleep'di0erencia(; , , catch'InterruptedException e( # Sstem.out.println'e.getMessage'((; , , estado3midlet.getEstado'(; , ,
public void inicia*artida'( # midlet.setEstado'DemoJuego.ES2&DHKJ>E<H(; > ?9) > $reacin de videojuegos con 5%6* <estorElementos.singleton'(.carga7ase'1(; musica<ameHver3<estorSonidos.singleton'(.cargaSonido'"%gameover&mid"1"audio%midi"1false(; 2hread thread3new 2hread'this(; thread.set*riorit'2hread.M&=K*FIHFI29(; thread.start'(; ,
if'ge.reinicia'-(( # do # //comprobar las colisiones //es un poco lioso... se intenta minimizar al ma7imo el numero de comprobaciones H4jetoMovil o4j13ge.getH4jetoMovil'-(; > ?99 > Ap/ndices int tipo4j13o4j1.get2ipo'(; switch'tipo4j1( # case H4jetoMovil.2I*HKE8EMI<HO if'ge.reinicia'1(( # do # H4jetoMovil o4j23ge.getH4jetoMovil'1(; if'o4j2.get2ipo'(33H4jetoMovil.2I*HKDIS*&FH( # if'o4j1.collidesDith'o4j21false(( # ''Enemigo( o4j1(.tocar''Disparo( o4j2(; o4j2.matar'(; brea.; , , , while'ge.siguiente'1((; ,
> ?9: > $reacin de videojuegos con 5%6* // &a funci+n de esta clase es )pre1cachear) al!unos calculos referentes a la pantalla y al!unas utilidades m's public class *antalla # public static final int 2I/EKSIQE31$; private static int ancho*antalla; private static int alto*antalla;
public static void cachearDatos'( # //Bruco chapuceril para pillar el ancho y alto de la pantalla al completo Displaa4le displa3new Canvas'( # protected void paint'<raphics graphics( #,,; ancho*antalla3displa.getDidth'(; alto*antalla3displa.getEeight'(; ,
public static int get&ncho*antalla'( # return ancho*antalla; ,
public static int get<o*antalla'( # return alto*antalla; ,
public static int get&ncho2a4lero'( # return ancho*antalla; ,
public static int get<o2a4lero'( # return 1-.2I/EKSIQE; ,
public class >tils # private static Fandom rnd3new Fandom'Sstem.current2imeMillis'((; public static int random'int max( # int r3rnd.nextInt'(; if'rL-( # r3'Mr(Vmax; , else # r3rVmax; ,