Está en la página 1de 169

Diseo y creacin de aplicaciones de

entretenimiento sobre dispositivos mviles


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

demo!tracin
demo!tracin
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_DemoFinal,java
pac.age com.ulpgc.mmacias;

import com.ulpgc.mmacias.util.>tils;
import com.ulpgc.mmacias.util.sound.<estorSonidos;
import javax.microedition.lcdui..;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.<raphics;
import javax.microedition.lcdui.7ont;
import java.io.IHException;

public class Demo7inal implements Command/istener #

private DemoJuego midlet;

private *antalla pantalla;

private Image imagen;

public Demo7inal'DemoJuego midlet( #
this.midlet3midlet;
tr$ #
imagen3Image.createImage'"%final&png"(;
, catch'IHException e( #
Sstem.out.println'"'rror cargando imagen final&png( "Be.getMessage'((;
,

/etreros letreros3new /etreros'(;
pantalla3letreros;
Displa.getDispla'midlet(.setCurrent'letreros(;
letreros.setCommand/istener'this(;
letreros.addCommand'new Command'"!inalizar"1Command.SCFEE811((;
int index3<estorSonidos.singleton'(.cargaSonido'"%final&mid"1"audio%midi"1false(;
<estorSonidos.singleton'(.tocaSonido'index(;
2hread thread3new 2hread'letreros(;
thread.run'(;
,

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!;
,
,

protected void paint'<raphics graphics( #
graphics.setColor'12)12""Mcol0ondo1col0ondo(;
graphics.0illFect'-1-1getDidth'(1getEeight'((;
graphics.set7ont'7ont.get7ont'7ont.7&CEK*FH*HF2IH8&/17ont.S29/EK@H/D17ont.SIQEKMEDI>M((;
for'int i3-;iLnumero;iBB( #
graphics.setColor'color:i;(;
graphics.draCString'"!in"1x:i;1:i;1<raphics.ECE82EFI<raphics.2H*(;
,

graphics.setColor'1+$Mcol0ondoG21$!Bcol0ondoG2112)(;
graphics.set7ont'7ont.get7ont'7ont.7&CEKS9S2EM17ont.S29/EK@H/D17ont.SIQEK/&F<E((;
graphics.draCString'"=!elicidades>"1getDidth'(G211-1<raphics.ECE82EFI<raphics.2H*(;

graphics.draCImage'imagen1getDidth'(G21getEeight'(G21<raphics.ECE82EFI<raphics.?CE82EF(;
,


public void run'( #
while'Tsalir( #
col0ondoB3inccol0ondo;
if'col0ondoN32""( #
inccol0ondo3Minccol0ondo;
col0ondo32"";
, else if'col0ondoL3-( #
inccol0ondo3Minccol0ondo;
col0ondo3-;
,

for'int i3-;iLnumero;iBB( #
x:i;B3incx:i;;
if'x:i;L-IIx:i;NgetDidth'(( #
incx:i;3Mincx:i;;
,
:i;B3inc:i;;
if':i;L-II:i;NgetEeight'(( #
inc:i;3Minc:i;;
,
,
repaint'(;
tr$ #
2hread.sleep'3-(;
, catch'Exception e( #
Sstem.out.println'e(;
,
,
midlet.setEstado'DemoJuego.ES2&DHK*FESE82&CIH8(;
,
,

public void command&ction'Command command1 Displaa4le displaa4le( #
if'command.getCommand2pe'(33Command.SCFEE8( #
<estorSonidos.singleton'(.eliminaSonidos'(;
pantalla.salir'(;
,
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_Demo5uego,java
pac.age com.ulpgc.mmacias;

import com.ulpgc.mmacias.util..;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

> ?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.;
,
,


protected void pause&pp'( #
if'estado33ES2&DHKJ>E<H( #
setEstado'ES2&DHK*&>S&(;
,
,

protected void destro&pp'boolean 4( throws MIDletStateChangeException #
setEstado'ES2&DHKS&/IE8DH(;
<estorElementos.singleton'(.destro'(;
,

public int getEstado'( #
return estado;
,

public void setEstado'int estado( #
this.estado 3 estado;
switch'estado( #
case ES2&DHK*FESE82&CIH8O
presentacion3new *resentacion'this(;
presentacion.setEstado'*resentacion.ES2&DHKIM&<E8(;
brea.;
case ES2&DHK7I8O
new Demo7inal'this(;
brea.;
case ES2&DHKJ>E<HO
gj.pausar'false(;
brea.;
case ES2&DHK*&>S&O
gj.pausar'true(;
brea.;
,
,

public void inicia*artida'( #
presentacion3null;
<estorElementos.singleton'(.destro'(;
gj3new <estorJuego'this(;
gj.inicia*artida'(;
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_Presentacion,java
pac.age com.ulpgc.mmacias;

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";

private String:; opcionesMenu3#H*CIH8KJ><&F1H*CIH8KH*CIH8ES,;
/ist principal3null;

private *resentacion'( #
principal3new /ist'"Men principal"1/ist.IM*/ICI21opcionesMenu1null(;
principal.setCommand/istener'this(;
,
public *resentacion'DemoJuego midlet( #
this'(;
this.midlet3midlet;
,

public void setEstado'int nuevoestado( #
estado3nuevoestado;
switch'estado( #
case ES2&DHKIM&<E8O
Displa.getDispla'midlet(.setCurrent'new Imagen*resentacion'((;
brea.;
case ES2&DHK*FI8CI*&/O
Displa.getDispla'midlet(.setCurrent'principal(;
brea.;
case ES2&DHKH*CIH8ESO
Displa.getDispla'midlet(.setCurrent'new 7ormularioHpciones'((;
brea.;
,
,

public void command&ction'Command command1 Displaa4le displaa4le( #
if'displaa4le33principal( #
if'command33/ist.SE/EC2KCHMM&8D( #
String la4el3principal.getString'principal.getSelectedIndex'((;
if'la4el.e5uals'H*CIH8KJ><&F(( #
midlet.inicia*artida'(;
, else if'la4el.e5uals'H*CIH8KH*CIH8ES(( #
setEstado'ES2&DHKH*CIH8ES(;
,
,
,
,

private class 7ormularioHpciones extends 7orm implements ItemState/istener 1 Command/istener #
private Choice<roup sonido;
private Choice<roup vidas;

public 7ormularioHpciones'( #
super'"!ormulario de opciones"(;
Con0iguracion con0ig3Con0iguracion.singleton'(;

sonido3new Choice<roup'"Sonido"1Choice.*H*>*1new String:;#"2n"1 "2ff",1null(;
sonido.setSelectedIndex'-1con0ig.isMusic'((;
sonido.setSelectedIndex'11Tcon0ig.isMusic'((;
this.append'sonido(;

vidas3new Choice<roup'"8umero de vidas"1Choice.*H*>*1new String:;#"?"1"-"1"@@",1null(;
switch'con0ig.get?idasIniciales'(( #
case 3O
vidas.setSelectedIndex'-1true(;
brea.;
case "O
> ?'& >
Ap/ndices
vidas.setSelectedIndex'11true(;
brea.;
defaultO
vidas.setSelectedIndex'21true(;
brea.;
,
this.append'vidas(;

this.addCommand'new Command'"#olver"1Command.SCFEE811((;
this.setItemState/istener'this(;
this.setCommand/istener'this(;
,

public void itemStateChanged'Item item( #
Con0iguracion con0ig3Con0iguracion.singleton'(;
if'item.get/a4el'(.e5uals'"Sonido"(( #
Choice<roup cg3'Choice<roup( item;
con0ig.setMusic'cg.getSelectedIndex'(33-(;
, else if'item.get/a4el'(.e5uals'"8umero de vidas"(( #
Choice<roup cg3'Choice<roup( item;
con0ig.set?idasIniciales'Integer.parseInt'cg.getString'cg.getSelectedIndex'((((;
,
,

public void command&ction'Command command1 Displaa4le displaa4le( #
if'command.get/a4el'(.e5uals'"#olver"(( #
setEstado'ES2&DHK*FI8CI*&/(;
,
,
,

//*lases au7iliares para la presentaci+n
private class Imagen*resentacion extends Canvas #
private Image imagenKpresentacion3null;
public Imagen*resentacion'( #
tr$ #
imagenKpresentacion3Image.createImage'"%presentacion&png"(;
, catch'IHException e( #
Sstem.err.println'"'rror cargando imagen5presentacion Apresentacion&pngA(
"Be.getMessage'((;
,
,
protected void paint'<raphics graphics( #
graphics.setColor'21-11)-12""(;
graphics.0illFect'-1-1getDidth'(1getEeight'((;
graphics.draCImage'imagenKpresentacion1getDidth'(G21getEeight'(G21<raphics.?CE82EFI
<raphics.ECE82EF(;
,
protected void Re*ressed'int i( #
super.Re*ressed'i(;
if'estado33ES2&DHKIM&<E8( #
setEstado'ES2&DHK*FI8CI*&/(;
,
,
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_fases_Fase,java
pac.age com.ulpgc.mmacias.0ases;

import com.ulpgc.mmacias.util.<estorElementos;
import com.ulpgc.mmacias.util.*antalla;
import javax.microedition.lcdui.<raphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game./aerManager;
import javax.microedition.lcdui.game.2iled/aer;
import java.io.IHException;

public abstract class 7ase extends /aerManager #

private boolean aca4ada;
protected int posx3-;
> ?'? >
$reacin de videojuegos con 5%6*

protected 2iled/aer 0rente3null;
protected 2iled/aer 0ondo3null;

public 7ase'String imgMapa7rente1String imgMapa7ondo( #
super'(;
<estorElementos ge3<estorElementos.singleton'(;
ge.iniciaDatos'(;
this.append'ge.get*rotagonista'((;
aca4ada3false;
set?ieCDindoC'-1-1*antalla.get&ncho*antalla'(1*antalla.get&lto2a4lero'((;

b$te mapa7rente:;:;3getMapa7rente'(;
tr$ #
0rente3new
2iled/aer'mapa7rente:-;.length1mapa7rente.length1Image.createImage'imgMapa7rente(1*antalla.2I/EKSIQ
E1*antalla.2I/EKSIQE(;
, catch'IHException e( #
Sstem.out.println'"'rror cargando imagen "BimgMapa7renteB"( "Be.getMessage'((;
,
rellenar2iles'0rente1mapa7rente(;
0rente.set*osition'-11$."(;
0rente.set?isi4le'true(;
this.append'0rente(;

b$te mapa7ondo:;:;3getMapa7ondo'(;
tr$ #
0ondo3new
2iled/aer'mapa7ondo:-;.length1mapa7ondo.length1Image.createImage'imgMapa7ondo(1*antalla.2I/EKSIQE1*
antalla.2I/EKSIQE(;
, catch'IHException e( #
Sstem.out.println'"'rror cargando imagen "BimgMapa7ondoB"( "Be.getMessage'((;
,
rellenar2iles'0ondo1mapa7ondo(;
0ondo.set*osition'-1-(;
0ondo.set?isi4le'true(;
this.append'0ondo(;

set?ieCDindoC'-1-1*antalla.get&ncho2a4lero'(1*antalla.get&lto2a4lero'((;
,

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;(;
,
,
,

public void paint'<raphics g( #
tr$ #
if'gT3null( #
paint'g1-1-(;
,
, catch'8ull*ointerException e( #
Sstem.out.println'e.getMessage'((;
,
,

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'(;

abstract protected b$te:;:; getMapa7rente'(;
abstract protected b$te:;:; getMapa7ondo'(;

,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_fases_Fase?,java
pac.age com.ulpgc.mmacias.0ases;

import com.ulpgc.mmacias.items.personajes..;
import com.ulpgc.mmacias.util.<estorElementos;
import com.ulpgc.mmacias.util.*antalla;
import com.ulpgc.mmacias.util.sound.<estorSonidos;

public class 7ase1 extends 7ase #
//si!uiente pi7el donde aparecera al!un elemento del array )objetos@A)
private int siguiente;

private int musica7ase11musicaElvis;

public 7ase1'( #
super'"%faseB&png"1"%faseBfondo&png"(;

siguiente3o4jetos:HCBB;.*antalla.2I/EKSIQEM*antalla.get&ncho2a4lero'(;

//pre1cachear los sonidos (cuidadoG puede a!otar toda la memoria)

musica7ase13<estorSonidos.singleton'(.cargaSonido'"%faseB&mid"1"audio%midi"1true(;
musicaElvis3<estorSonidos.singleton'(.cargaSonido'"%elvis&mid"1"audio%midi"1true(;
<estorSonidos.singleton'(.tocaSonido'musica7ase1(;
,

public void 0inali6ar'( #
<estorSonidos.singleton'(.paraSonido'(;
<estorSonidos.singleton'(.eliminaSonidos'(;
,

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.;
case 3O
ge.aPade'new 8otaMusical'((;
brea.;
case !O
ge.aPade'new Elvis'this((;
<estorSonidos.singleton'(.tocaSonido'musicaElvis(;
brea.;
,
siguiente3o4jetos:HCBB;.*antalla.2I/EKSIQEM*antalla.get&ncho2a4lero'(;
,
,

protected b$te:;:; getMapa7rente'( #
return mapa;
,

protected b$te:;:; getMapa7ondo'( #
return mapa0ondo;
,
> ?'8 >
$reacin de videojuegos con 5%6*

//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 1121-11121
11!1-112)1 11$1-11!!1
12"1112-1 12"111!-1 12"111$-1 12"111)-1 12"1111--1 12"11112-1 12"1111!-1
13%121 1!-121 1!3121 1!$121 1!+121 1"2121
1"$131 1$-131 1$!131 1$)131
1%1131 1%!131 1%%131 1)-131
1)2131 1)!131 1)"131 1)$131
1)%131 1))131 1)+131 1+-131
1+"111%-1 1++121 2-3111%-1 2-$121 2-+111%-1 212121
21!1113-1 21$121 21)1111--1 22-121 2221113-1 22!121 22$1111--1
2321-12-1 2331-112-1 23!1-1!-1 23"1-11--1 23$1-1$-1 23%1-1)-1 23)1-1)-1
2!21-12-1 2!2111!-1 2!21-1$-1 2!2111)-1 2!21-11--1 2!211112-1

2""1!1
1---
,;

private static final b$te mapa:;:; 3 //,2H72
## 11 21 11 21 11 21 11 -1 -1 -1 -1 31 !1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 21 11 -1 -1 -1 -1 -1 -1 21 11
-1 -1 -1 -1 21 11 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 21 11 -1 -1 -1 -1
-1 -1 21 11 -1 -1 -1 -1 -1 -1 21 11 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 31 !1 -1
-1 21 11 -1 -1 -1 -1 -1 -1 21 11 -1 -1 -1 -1 21 11 -1 -1 -1 -1 21 11 -1 -1
-1 -1 -1 -1 21 11 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 31 !1 -1 -1 -1 -1 -1 -1 31 !1 -1 -1 -1 -1 -1 -1
31 !1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 21 11 -1 -1 -1
-1 21 11 -1 -1 -1 -1 21 11 -1 -1 21 11 -1 -1 -1 -1 -1 -1 -1 -1 21 11 -1 -1
-1 -1 -1 -1 -1 -1 2,1
# "1 $1 "1 $1 "1 $1 "1 21 11 -1 -1 %1 )1 -1 -1 21 11 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 $1 "1 21 11 -1 -1 21 11 $1 "1 31
!1 21 11 $1 "1 21 11 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 $1 "1 21 11 -1 -1 21
11 $1 "1 21 11 -1 -1 21 11 $1 "1 -1 -1 31 !1 -1 -1 -1 -1 -1 -1 %1 )1 21 11
$1 "1 21 11 -1 -1 21 11 $1 "1 31 !1 21 11 $1 "1 21 11 -1 -1 $1 "1 21 11 -1
-1 21 11 $1 "1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 %1 )1 31 !1 -1 -1 31 !1 %1 )1 31 !1 -1 -1 31 !1 %1
)1 31 !1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 $1 "1 31 !1 21 11
$1 "1 21 11 -1 -1 $1 "1 31 !1 $1 "1 -1 -1 21 11 -1 -1 -1 -1 $1 "1 -1 -1 21
11 -1 -1 -1 -1 $,1
# +11-1 +11-1 +11-1 +1 $1 "1 21 111-1 +1 21 11 $1 "1 21 11111121111121111121
-1 -1111121111121111121 -1 -11111211111211-1 +1 $1 "1 21 11 $1 "11-1 +1 %1
)1 $1 "11-1 +1 $1 "1 21 11111121111121111121 -1 -1111121111121111121 -1 -1
111121111121111121111121111121 -1 -11111211111211111211-1 +1 $1 "1 21 11 $1
"11-1 +1 $1 "1 21 11 $1 "11-1 +1 -1 -1 %1 )1 -1 -1 31 !1 -1 -11-1 +1 $1 "1
1-1 +1 $1 "1 21 11 $1 "11-1 +1 %1 )1 $1 "11-1 +1 $1 "1 21 111-1 +1 $1 "1 21
11 $1 "11-1 +1111121 -1 -1111121111121111121 -1 -1111121111121111121 -1 -1
111121111121111121 -1 -11-1 +1 %1 )1 31 !1 %1 )11-1 +1 %1 )1 31 !1 %1 )11-1
+1 %1 )1 31 !1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -11-1 +1 %1 )1 $1 "1
1-1 +1 $1 "1 21 111-1 +1 %1 )11-1 +1 -1 -1 $1 "1 -1 -1 31 !11-1 +1 -1 -1 $1
"1 -1 -1 31 !11-,1
#1311!11311!11311!11311-1 +1 $1 "11!1131 $1 "11-1 +1 $1 "11"11$11"11$11"11$1
1%11)11"11$11"11$11"11$11+12-11"11$11"11$11!11311-1 +1 $1 "11-1 +11!11311-1
+11-1 +11!11311-1 +1 $1 "11"11$11"11$11"11$11%11)11"11$11"11$11"11$11+12-1
1"11$11"11$11"11$11"11$11"11$11%11)11"11$11"11$11"11$11!11311-1 +1 $1 "11-1
+11!11311-1 +1 $1 "11-1 +11!11311%11)11-1 +11+12-1 %1 )11%11)11!11311-1 +1
1!11311-1 +1 $1 "11-1 +11!11311-1 +11-1 +11!11311-1 +1 $1 "11!11311-1 +1 $1
"11-1 +11!11311"11$11%11)11"11$11"11$11"11$11+12-11"11$11"11$11"11$11%11)1
1"11$11"11$11"11$11+12-11!11311-1 +1 %1 )11-1 +11!11311-1 +1 %1 )11-1 +11!1
1311-1 +1 %1 )11%11)11%11)11%11)11%11)11%11)11%11)11%11)11!11311-1 +11-1 +1
1!11311-1 +1 $1 "11!11311-1 +11!11311%11)11-1 +11+12-1 %1 )11!11311%11)11-1
+11+12-1 %1 )11!,1
#2112212112212112212112212112212112212112212112212112212112312!12312!12312!1
2"12$12312!12312!12312!12%12)12312!12312!1221211221211221211221211221211221
2112212112212112212112212112312!12312!12312!12"12$12312!12312!12312!12%12)1
2312!12312!12312!12312!12312!12"12$12312!12312!12312!1221211221211221211221
2112212112212112212112212112212112"12$12212112%12)12212112"12$1221211221211
221211221211221211221211221211221211221211221211221211221211221211221211221
2112212112212112312!12"12$12312!12312!12312!12%12)12312!12312!12312!12"12$1
> ?'' >
Ap/ndices
2312!12312!12312!12%12)1221211221211221211221211221211221211221211221211221
2112212112212112"12$12"12$12"12$12"12$12"12$12"12$12"12$1221211221211221211
2212112212112212112212112212112212112"12$12212112%12)12212112212112"12$1221
2112%12)122121122,,;

private static final b$te mapa0ondo:;:;3 //I271/
## 11 11 11 11 21 31 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
11 21 31 11 11 11 11 11 11 11 !1 "1 11 11 11 11 21 31 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 21 31 11 11
1,1
# 11 11 11 11 11 11 11 11 11 11 11 11 11 11 !1 "1 11 11 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1,1
# 11 $1 %1 )1 11 +11-1111121 11 11 $1 %1 )1 11 11 $1 %1 )1 11 11 $1 %1 )1 11
11 !1 "1 +11-1111121 11 11 $1 %1 )1 11 11 11 11 11 $1 %1 )1 11 11 $1 %1 )1
11 !1 "11-1111121 11 11 $1 %1 )1 !1 "1 $1 %1 )1 11 11 $1 %1 )1 11 +11-111,1
# +11311!11"11$1 +11311!11"11$1 +11311!11"11$1 +11311!11"11$1 +11311!11"11$1
11 11 11 +11311!11"11$1 +11311!11"11$1 11 11 111%11)11!11"11$1 +11311!11"1
1$1 11 +11311!11"11$11%11)11!11"11$1 +11311!11"11$11%11)11!11"11$1 +11311!,1
#1+12-12112212311+12!12"12$12311+12-12112212311+12-12112212311+12-1211221231
11 11 111+12!12"12$12311+12-12112212312%12)1 112+13-12112212311+12-1211221
231 111+12!12"12$12312+13-12112212311+12-12112212312+13-12112212311+12!12",1
#3113213313!13"13113213313!13"13113213313!13$13%13213313!13$13%13213313!13"1
11 11 113113213313!13$13%13213313!13"13)13+1 113113213313!1!-13%13213313!1
3"1 113113213313!1!-13%13213313!13$13%13213313!13$13%13213313!13"131132133,1
#!11!21!31!!1!"1!11!21!31!!1!"1!11!21!31!$1!%1!)1!+1!31!$1!%1!)1!+1!31!!1!"1
11 11 11!11!21!31!$1!%1!)1!+1!31!!1!"1 11 11 11!11!21!31!$1"-1!)1!+1!31!!1
!"1 11!11!21!31!$1"-1!)1!+1!31!$1!%1!)1!+1!31!$1!%1!)1!+1!31!!1!"1!11!21!3,1
#"11"21"31"!1""1"11"21"31"!1""1"11"21"31"$1"%1")1"+1"31"$1"%1")1"+1"31"!1""1
11 11 11"11"21"31"$1"%1")1"+1"31"!1""1 11 !1 "1"11"21"31"$1"%1")1"+1"31"!1
""1 11"11"21"31"$1"%1")1"+1"31"$1"%1")1"+1"31"$1"%1")1"+1"31"!1""1"11"21"3,1
#$-1$11$21$31$!1$-1$11$21$31$!1$-1$11$21$"1$$1$%1$)1$21$"1$$1$%1$)1$21$31$!1
11 11 11$-1$11$21$"1$$1$%1$)1$21$31$!1 11 11 11$-1$11$21$"1$$1$%1$)1$21$31
$!1 11$-1$11$21$"1$$1$%1$)1$21$"1$$1$%1$)1$21$"1$$1$%1$)1$21$31$!1$-1$11$2,1
# 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1,,;


,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_Dbjeto6ovil,java
pac.age com.ulpgc.mmacias.items;

import com.ulpgc.mmacias.util.<estorElementos;

import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
import java.io.IHException;

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 void matar'( #
terminar'(;
,

abstract public void mover'(;

protected static Image cargaImagen'String imagename( #
Image image3null;
tr$ #
image3Image.createImage'imagename(;
, catch'IHException e( #
Sstem.err.println'"'rror cargando imagen "BimagenameB"( "Be.getMessage'((;
,
return image;
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_armas_Disparo,java
pac.age com.ulpgc.mmacias.items.armas;

import com.ulpgc.mmacias.items.H4jetoMovil;

import javax.microedition.lcdui.Image;

public abstract class Disparo extends H4jetoMovil #

public Disparo'Image image( #
super'image(;
this.tipo32I*HKDIS*&FH;
,
abstract public int get7uer6a'(;

,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_armas_Disparo-imp
le,java
pac.age com.ulpgc.mmacias.items.armas;

import com.ulpgc.mmacias.util.*antalla;

import javax.microedition.lcdui.Image;

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;

import com.ulpgc.mmacias.items.H4jetoMovil;
import com.ulpgc.mmacias.util.*antalla;

import javax.microedition.lcdui.Image;

public class @alaMala extends H4jetoMovil #
private static final int ?E/HCID&D3";
private static final int &8CEH3);
private static final int &/2H3);

private static Image image3null;
static #
if'image33null( #
image3cargaImagen'"%balamala&png"(;
,
,

//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&lto2a4lero'(( #
terminar'(;
,
xB3incx; B3inc;
set*osition''int(x1'int((;
,

,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_otros_*1plosion,java
pac.age com.ulpgc.mmacias.items.otros;

import com.ulpgc.mmacias.items.H4jetoMovil;

import javax.microedition.lcdui.Image;

public class Explosion extends H4jetoMovil#
private static final int DID2E31$;
private static final int EEI<E231$;

private static Image image3null;

private int time3-;

static #
image3cargaImagen'"%explosion&png"(;
,

public Explosion'int x1int ( #
super'image1DID2E1EEI<E2(;
tipo32I*HKH2FH;
set*osition'x1(;
,

public void mover'( #
if'BBtimeN!( #
terminar'(;
,
next7rame'(;
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_personajes_$aca,ja
va
pac.age com.ulpgc.mmacias.items.personajes;

import com.ulpgc.mmacias.items.armas.Disparo;
import com.ulpgc.mmacias.items.otros.Explosion;
import com.ulpgc.mmacias.util.*antalla;
import com.ulpgc.mmacias.util.>tils;
import com.ulpgc.mmacias.util.<estorElementos;

import javax.microedition.lcdui.Image;

> ?'; >
Ap/ndices
public class Caca extends Enemigo #
private static final int DID2E31$;
private static final int EEI<E231$;

private static Image image3null;

private int estado3-;
private int time3-;

private int disparo3>tils.random'*antalla.get&ncho2a4lero'((;
private boolean disparado3false;

static #
image3cargaImagen'"%caca&png"(;
,

private Caca'( #
super'image1DID2E1EEI<E2(;
de0ineFe0erence*ixel'DID2EG21EEI<E2G2(;
,

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&lto2a4lero'(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&lto2a4lero'(( #
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;

import com.ulpgc.mmacias.items.armas.Disparo;
import com.ulpgc.mmacias.items.otros.Explosion;
import com.ulpgc.mmacias.util.<estorElementos;
import com.ulpgc.mmacias.util.*antalla;
import com.ulpgc.mmacias.util.>tils;

import javax.microedition.lcdui.Image;

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&lto2a4lero'(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 void tocar'Disparo disparo( #
energiaM3disparo.get7uer6a'(;
if'energiaL3-( #
matar'(;
,
,

public int get*untuacion'( //devuelve el numero de puntos a sumar cuando muere el enemi!o
#
return 12;
,

public void mover'( #
accelB32;
move'?E/HCID&D1accel(;
if'accel33-( #
dispara'(;
,
if'get9'(N*antalla.get&lto2a4lero'(M&8CEH( #
accel3FE@H2E;
,
if'get='(LM&8CEH( #
terminar'(;
,
if'accelN-( #
set7rame'-(;
, else #
set7rame'1(;
> ?)& >
Ap/ndices
,
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_personajes_$omeco
cos,java
pac.age com.ulpgc.mmacias.items.personajes;

import com.ulpgc.mmacias.items.armas.Disparo;
import com.ulpgc.mmacias.items.otros.Explosion;
import com.ulpgc.mmacias.util.*antalla;
import com.ulpgc.mmacias.util.>tils;
import com.ulpgc.mmacias.util.<estorElementos;

import javax.microedition.lcdui.Image;

public class Comecocos extends Enemigo #
private static final int &8CEH31$;
private static final int &/2H31$;

private static Image image3null;

private int dirx3M%1dir3-;
boolean su4e3true;
private int time3-;
private int siguienteCam4io31-B>tils.random'2-(;

static #
image3cargaImagen'"%comecocos&png"(;
,

private Comecocos'( #
super'image1&8CEH1&/2H(;
de0ineFe0erence*ixel'&8CEHG21&/2HG2(;
,

public Comecocos'int altura( #
this'(;
set*osition'*antalla.get&ncho2a4lero'(B&8CEH1altura(;
,

public void mover'( #
int x3get='(1 3get9'(;
if'timeBBV233-( #
this.next7rame'(;
,
if'timeNsiguienteCam4io( #
cam4iaDireccion'(;
siguienteCam4ioB3"B>tils.random'"(;
,

if'L3-( #
set*osition'x13-(;
cam4iaDireccion'(;
, else if'N*antalla.get&lto2a4lero'(M&/2H( #
set*osition'x1*antalla.get&lto2a4lero'(M&8CEH(;
cam4iaDireccion'(;
,

if'get='(LM&8CEH( #
terminar'(;
,
move'dirx1dir(;
,

private void cam4iaDireccion'( #
if'dirx33-( #
dirx3M";
dir3-;
, else #
dirx3-;
dir3>tils.random'2(33-WM"O";
> ?)? >
$reacin de videojuegos con 5%6*
,

if'dirxT3-( #
set2rans0orm'2F&8SK8H8E(;
, else #
if'dirL-( #
set2rans0orm'2F&8SKFH2+-(;
, else #
set2rans0orm'2F&8SKFH22%-(;
,
,
,

public void tocar'Disparo disparo( #
matar'(;
,

public void matar'( #
super.matar'(;
<estorElementos.singleton'(.aPade'new Explosion'get='(1get9'(((;
,

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_*lvis,jav
a
pac.age com.ulpgc.mmacias.items.personajes;

import com.ulpgc.mmacias.items.H4jetoMovil;
import com.ulpgc.mmacias.items.armas.Disparo;
import com.ulpgc.mmacias.items.otros.@alaMala;
import com.ulpgc.mmacias.util.<estorElementos;
import com.ulpgc.mmacias.util.*antalla;
import com.ulpgc.mmacias.0ases.7ase;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

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&lto2a4lero'(M*antalla.2I/EKSIQEG2M&/2H(;
,

public void mover'( #
tiempoBB;
switch'estado( #
case -O
move'M31-(;
if'tiempoV!33-( #
if'get7rame'(33-( #
set7rame'1(;
> ?)% >
Ap/ndices
, else #
set7rame'-(;
,
,
if'tiempoV2-33-( #
<estorElementos ge3<estorElementos.singleton'(;
*rotagonista prota3ge.get*rotagonista'(;
ge.aPade'new @alaMala'get='(B&8CEHG21get9'(B1"1prota.get='(1prota.get9'(((;
,
if'get='(L*antalla.get&ncho2a4lero'(G2( #
estado31;
tiempo3-;
,
brea.;
case 1O
if'tiempoV233-( #
if'get7rame'(332( #
set7rame'3(;
, else #
set7rame'2(;
,
,
if'tiempoV1"33-( #
<estorElementos ge3<estorElementos.singleton'(;
ge.aPade'new 8otaMusical'((;
,
if'tiempoN+-( #
estado32;
tiempo3-;
,
brea.;
case 2O
if'tiempoV233-( #
if'get7rame'(33-( #
set7rame'1(;
, else #
set7rame'-(;
,
,
move'direccion1-(;
if'get='(L- II get='(N*antalla.get&ncho2a4lero'(M&8CEH( #
direccion3Mdireccion;
if'direccionN-( #
set2rans0orm'Sprite.2F&8SKMIFFHF(;
, else #
set2rans0orm'Sprite.2F&8SK8H8E(;
,
,
if'tiempoV1"33-( #
<estorElementos ge3<estorElementos.singleton'(;
*rotagonista prota3ge.get*rotagonista'(;
ge.aPade'new @alaMala'get='(1get9'(M&/2HG!1prota.get='(1prota.get9'(((;
,
if'tiempoN)"( #
estado31;
tiempo3-;
,
brea.;
case 3O
move'"1direccionBB(;
switch''tiempoBB(V!( #
case -O
set2rans0orm'2F&8SK8H8E(;
brea.;
case 1O
set2rans0orm'2F&8SKFH22%-(;
brea.;
case 3O
set2rans0orm'2F&8SKFH21)-(;
brea.;
case !O
set2rans0orm'2F&8SKFH2+-(;
brea.;
,
if'get='(N*antalla.get&ncho2a4lero'(( #
super.matar'(;
> ?)8 >
$reacin de videojuegos con 5%6*
0ase.set&ca4ada'true(;
,
brea.;
,

,

public void tocar'Disparo disparo( #
energiaM3disparo.get7uer6a'(;
if'energiaL-( #
matar'(;
,
,

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;

import com.ulpgc.mmacias.items.H4jetoMovil;
import com.ulpgc.mmacias.items.armas.Disparo;
import com.ulpgc.mmacias.items.otros.@alaMala;
import com.ulpgc.mmacias.util.<estorElementos;
import javax.microedition.lcdui.Image;

public abstract class Enemigo extends H4jetoMovil #
public Enemigo'Image image( #
super'image(;
this.tipo32I*HKE8EMI<H;
,

public Enemigo'Image image1 int ancho1 int alto( #
super'image1ancho1alto(;
this.tipo32I*HKE8EMI<H;
,

public void matar'( #
<estorElementos.singleton'(.acumula*untuacion'get*untuacion'((;
terminar'(;
,

protected void dispara'( #
<estorElementos ge3<estorElementos.singleton'(;
*rotagonista p3ge.get*rotagonista'(;
ge.aPade'new @alaMala'get='(1get9'(1p.get='(1p.get9'(((;
,



public abstract void tocar'Disparo disparo(;
public abstract int get*untuacion'(; //devuelve el numero de puntos a sumar cuando muere el
enemi!o

,
> ?)' >
Ap/ndices
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_personajes_Fota6u
sical,java
pac.age com.ulpgc.mmacias.items.personajes;

import com.ulpgc.mmacias.items.armas.Disparo;
import com.ulpgc.mmacias.items.otros.Explosion;
import com.ulpgc.mmacias.util.<estorElementos;
import com.ulpgc.mmacias.util.*antalla;
import com.ulpgc.mmacias.util.>tils;

import javax.microedition.lcdui.Image;

public class 8otaMusical extends Enemigo #
public static final int &8CEH 3 1$;
public static final int &/2H 3 1$;

private static Image image3null;
static #
image3cargaImagen'"%nota&png"(;
,

private boolean atacando3false;
private int time3-;
private int accelx3-;
private int accel3-;

public 8otaMusical'( #
super'image1&8CEH1&/2H(;
this.tipo32I*HKH2FH;
de0ineFe0erence*ixel'&8CEHG21&/2HG2(;
set*osition'>tils.random'*antalla.get&ncho2a4lero'((1>tils.random'*antalla.get&lto2a4lero'((
(;
,

public void tocar'Disparo disparo( #
matar'(;
,

public void mover'( #
timeBB;
if'atacando( #
*rotagonista prota3<estorElementos.singleton'(.get*rotagonista'(;
int x3get='(1 3get9'(;
if'timeV"33-( #
accelxB3xNprota.get='(WM1OB1;
accelB3Nprota.get9'(WM1OB1;
,
if'xLM&8CEH II LM&/2H II xN*antalla.get&ncho2a4lero'(B&8CEH II
N*antalla.get&lto2a4lero'(B&/2H( #
terminar'(;
, else #
next7rame'(;
move'accelx1accel(;
,
, else #
set?isi4le'timeV233-WtrueOfalse(;
if'timeN13( #
set?isi4le'true(;
atacando3true;
tipo32I*HKE8EMI<H;
,
,
,

public int get*untuacion'( //devuelve el numero de puntos a sumar cuando muere el enemi!o
#
return 1-;
,

public void matar'( #
super.matar'(;
<estorElementos.singleton'(.aPade'new Explosion'get='(1get9'(((;
,
,
> ?)) >
$reacin de videojuegos con 5%6*
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_items_personajes_Protago
nista,java
pac.age com.ulpgc.mmacias.items.personajes;

import com.ulpgc.mmacias.items.H4jetoMovil;
import com.ulpgc.mmacias.items.armas.DisparoSimple;
import com.ulpgc.mmacias.items.otros.Explosion;
import com.ulpgc.mmacias.util.<estorElementos;
import com.ulpgc.mmacias.util.*antalla;

import javax.microedition.lcdui.Image;

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;
,

private void setSaliendo'( #
muriendo3false;
saliendo3true;
set*osition'2-1"-(;
tiempo3-;
set?isi4le'false(;
,

public void mover'( #
if'disparando( #
disparando3false;
<estorElementos.singleton'(.aPade'new DisparoSimple'get='(1get9'(B&/2HG2((;
,
if'muriendo( #
move'-1BBvelocKcaida(;
if'velocKcaidaL)( #
set7rame'-(;
, else #
set7rame'1(;
,
if'velocKcaidaV333-( #
<estorElementos.singleton'(.aPade'new Explosion'get='(1get9'(((;
,
if'get9'(N*antalla.get&lto2a4lero'(( #
setSaliendo'(;
> ?)9 >
Ap/ndices
,
, else #
if'saliendo( #
set?isi4le''tiempoV2(33-WtrueOfalse(;
if'tiempoBBN2!( #
set?isi4le'true(;
saliendo3false;
,
,
errorveloc3'errorvelocBvelocidad(V1-;
int v3'errorvelocBvelocidad(G1-;

if''direccion U >*(T3-( #
set7rame'2(;
if'get9'(N-( #
move'-1Mv(;
,
, else if''direccion U DHD8(T3-( #
set7rame'1(;
if'get9'(L'*antalla.get&lto2a4lero'(M&/2H(( #
move'-1v(;
,
, else #
set7rame'-(;
,

if''direccion U /E72(T3-( #
if'get='(N-( #
move'Mv1-(;
,

, else if''direccion U FI<E2(T3-( #
if'get='(L*antalla.get&ncho2a4lero'(M3-( #
move'v1-(;
,
,
,
,

public void matar'( #
if'puedeMorir'(( #
muriendo3true;
velocKcaida3-;
,
,

public boolean isMuriendo'( #
return muriendo;
,

public boolean puedeMorir'( #
return Tmuriendo UU Tsaliendo;
,

public void addDireccion'int direccion( #
this.direccion3this.direccion I direccion;
,

public void deleteDireccion'int direccion( #
this.direccion3this.direccion U Xdireccion;
,

public void dispara'( #
disparando3true;
,

,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_util_sound_#estor-onidos,
java
pac.age com.ulpgc.mmacias.util.sound;

> ?): >
$reacin de videojuegos con 5%6*
import com.ulpgc.mmacias.util.Con0iguracion;

import javax.microedition.media.MediaException;
import java.util.?ector;

public class <estorSonidos #
private static <estorSonidos gm3null;
private ?ector sonidos3new ?ector'"(;

private Integer indexKtocando3null;

private <estorSonidos'( #
,

public static <estorSonidos singleton'( #
if'gm33null( #
gm3new <estorSonidos'(;
,
return gm;
,

public void eliminaSonidos'( #
if'sonidosT3null( #
for'int i3-;iLsonidos.si6e'(;iBB( #
Media*laer sonido3''Media*laer(sonidos.element&t'i((;
sonido.stop'(;
sonido.close'(;
,
,
indexKtocando3null;
sonidos3new ?ector'"(;
,

//Letorna la posici+n del vector donde est' el sonido
public int cargaSonido'String 0ilename1 String tpe1 boolean repeat( #
Media*laer sonido3new Media*laer'0ilename1tpe1repeat(;
tr$ #
sonido.reali6e'(;
, catch'MediaException e( #
Sstem.out.println'"'rror cargando el sonido( "Be.getMessage'((;
,
sonidos.addElement'sonido(;
return sonidos.indexH0'sonido(;
,

public void tocaSonido'int index( #
paraSonido'(;
if'Con0iguracion.singleton'(.isMusic'(( #
''Media*laer(sonidos.element&t'index((.start'(;
indexKtocando3new Integer'index(;
,
,

public Integer getIndexSonido&ctual'( #
return indexKtocando;
,

public void paraSonido'( #
if'indexKtocandoT3null( #
''Media*laer(sonidos.element&t'indexKtocando.int?alue'(((.stop'(;
indexKtocando3null;
,
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_util_sound_6ediaPlayer,ja
va
pac.age com.ulpgc.mmacias.util.sound;

import javax.microedition.media..;
import java.io.IHException;

> ?); >
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(;
,

public void remove*laer/istener'*laer/istener plaer/istener( #
the*laer.remove*laer/istener'plaer/istener(;
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_util_$onfiguracion,java
pac.age com.ulpgc.mmacias.util;

public class Con0iguracion #
private static Con0iguracion con0ig3null;
private boolean music;
private int vidas;

private Con0iguracion'( #
//*onfi!uraci+n por defecto
music3false;
vidas33;
,

static public Con0iguracion singleton'( #
if'con0ig33null( #
con0ig3new Con0iguracion'(;
,
return con0ig;
,

public boolean isMusic'( #
return music;
,

public void setMusic'boolean music( #
this.music 3 music;
,
> ?9& >
Ap/ndices

public int get?idasIniciales'( #
return vidas;
,

public void set?idasIniciales'int vidas( #
this.vidas 3 vidas;
,


,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_util_#estor*lementos,java
pac.age com.ulpgc.mmacias.util;

import com.ulpgc.mmacias.0ases.7ase;
import com.ulpgc.mmacias.0ases.7ase1;
import com.ulpgc.mmacias.items.H4jetoMovil;
import com.ulpgc.mmacias.items.personajes.*rotagonista;

public class <estorElementos #
private class 8odo #
public H4jetoMovil o4jeto3null;
public 8odo siguiente3null;
,

private 8odo actual:;;
private 8odo primero3null;

private static <estorElementos ge3null;

private 7ase 0ase3null;
private *rotagonista prota3null;

private int puntuacionKacumulada3-;

public int getSi6e'( #
return 0ase.getSi6e'(;
,

public void iniciaDatos'( #
prota3new *rotagonista'(;
puntuacionKacumulada3-;

actual3new 8odo:2;; actual:-;3null; actual:1;3null;
,

// 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 static <estorElementos singleton'( #
if'ge33null( #
ge3new <estorElementos'(;
,
return ge;
,

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;
,
,

public boolean reinicia'int n( #
if'primero33null( #
return false;
,
actual:n;3primero;
return true;
,

// 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 H4jetoMovil getH4jetoMovil'int n( #
if'actual:n;33null( return null;
return actual:n;.o4jeto;
,

public void elimina'H4jetoMovil o4jetoMovil( #
0ase.remove'o4jetoMovil(;

8odo recorr3primero;
8odo anterior3null;
boolean encontrado3false;

if'primero.o4jeto33o4jetoMovil( #
primero3primero.siguiente;
, else #
while'Tencontrado UU recorrT3null( #
if'recorr.o4jeto33o4jetoMovil( #
if'anteriorT3null( #
anterior.siguiente3recorr.siguiente;
,
encontrado3true;
, else #
anterior3recorr;
recorr3recorr.siguiente;
,
,
,
,

public void carga7ase'int num( #
switch'num( #
> ?9% >
Ap/ndices
case 1O
0ase3new 7ase1'(;
brea.;
,
,

public 7ase get7ase'( #
return 0ase;
,

public void li4era7ase'( #
0ase3null;
,


,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_util_#estor#rafico,java
pac.age com.ulpgc.mmacias.util;

import com.ulpgc.mmacias.0ases.7ase;
import com.ulpgc.mmacias.items.personajes.*rotagonista;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.<raphics;
import javax.microedition.lcdui.7ont;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.<ameCanvas;

public class <estor<ra0ico extends <ameCanvas #
private <estorElementos ge3<estorElementos.singleton'(;
private <estorJuego el<estorJuego3null;
private 7ont 0uente3null;
Image marcador3null;
private int puntosanteriores3-1vidasanteriores3-;

private <estor<ra0ico'( #
super'false(;
0uente37ont.get7ont'7ont.7&CEK*FH*HF2IH8&/17ont.S29/EK@H/D17ont.SIQEKMEDI>M(;
marcador3Image.createImage'*antalla.get&ncho*antalla'(1*antalla.get&lto*antalla'(M
*antalla.get&lto2a4lero'((;
,

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&lto2a4lero'(;
int alp3*antalla.get&lto*antalla'(;

graphics.setColor'3-13-12--(;
graphics.0illFect'-1alt1anp1alpMalt(;
> ?98 >
$reacin de videojuegos con 5%6*
graphics.setColor'+-1+-12""(;
graphics.draCFect'-1alt1anp1alpMalt(;

graphics.set7ont'0uente(;
graphics.setColor'2""12""12""(;
graphics.draCString'"Puntos( "Bpuntosanteriores1!1altB21<raphics.2H*I<raphics./E72(;
graphics.draCString'"#idas( "Bvidasanteriores1anpM!1altB21<raphics.2H*I
<raphics.FI<E2(;
,
, else #
Sstem.out.println'"el)estor4uego es null"(;
,

,

protected void Re*ressed'int i( #
super.Re*ressed'i(;
*rotagonista prota3<estorElementos.singleton'(.get*rotagonista'(;
switch'get<ame&ction'i(( #
case Canvas.>*O
prota.addDireccion'*rotagonista.>*(;
brea.;
case Canvas.DHD8O
prota.addDireccion'*rotagonista.DHD8(;
brea.;
case Canvas./E72O
prota.addDireccion'*rotagonista./E72(;
brea.;
case Canvas.FI<E2O
prota.addDireccion'*rotagonista.FI<E2(;
brea.;
case Canvas.7IFEO
prota.dispara'(;
brea.;
,
,

protected void ReFeleased'int i( #
super.ReFeleased'i(;
*rotagonista prota3<estorElementos.singleton'(.get*rotagonista'(;
switch'get<ame&ction'i(( #
case Canvas.>*O
prota.deleteDireccion'*rotagonista.>*(;
brea.;
case Canvas.DHD8O
prota.deleteDireccion'*rotagonista.DHD8(;
brea.;
case Canvas./E72O
prota.deleteDireccion'*rotagonista./E72(;
brea.;
case Canvas.FI<E2O
prota.deleteDireccion'*rotagonista.FI<E2(;
brea.;
,
,
,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_util_#estor5uego,java
pac.age com.ulpgc.mmacias.util;

import com.ulpgc.mmacias.0ases.7ase;
import com.ulpgc.mmacias.items.H4jetoMovil;
import com.ulpgc.mmacias.items.options.Hption;
import com.ulpgc.mmacias.items.armas.Disparo;
import com.ulpgc.mmacias.items.personajes.Enemigo;
import com.ulpgc.mmacias.items.personajes.*rotagonista;
import com.ulpgc.mmacias.DemoJuego;
import com.ulpgc.mmacias.util.sound.<estorSonidos;
import javax.microedition.lcdui..;

public class <estorJuego implements Funna4le1 Command/istener #
private <estorElementos ge3<estorElementos.singleton'(;
> ?9' >
Ap/ndices
private <estor<ra0ico gg3new <estor<ra0ico'this(;
private DemoJuego midlet3null;

private boolean letreroKpuesto;
private final static int 7F&MESKSE<>8DH31-;

private long tiempoactual1tiempoanterior;
private long iteraciones;

private int vidas;
private int puntos;

private int tiempo;
private int musica<ameHver;

private Integer sonidoKtocando;

private Command cmdContinuar3new Command'"Continuar"1Command.SCFEE811(;
private Command cmd*ausar3new Command'"Pausar"1Command.SCFEE811(;

public <estorJuego'DemoJuego midlet( #
this.midlet3midlet;
Displa.getDispla'midlet(.setCurrent'gg(;
tiempoanterior3Sstem.current2imeMillis'(;
iteraciones3-;
vidas3Con0iguracion.singleton'(.get?idasIniciales'(;
letreroKpuesto3false;
puntos3-;
,

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'(;
,

public void command&ction'Command command1 Displaa4le displaa4le( #
if'command33cmd*ausar( #
midlet.setEstado'DemoJuego.ES2&DHK*&>S&(;
, else if'command33cmdContinuar( #
midlet.setEstado'DemoJuego.ES2&DHKJ>E<H(;
,
,

public void pausar'boolean pausa( #
if'gg33null( return;
if'pausa( #
gg.removeCommand'cmd*ausar(;
gg.addCommand'cmdContinuar(;
sonidoKtocando3<estorSonidos.singleton'(.getIndexSonido&ctual'(;
<estorSonidos.singleton'(.paraSonido'(;
, else #
gg.removeCommand'cmdContinuar(;
gg.addCommand'cmd*ausar(;
if'sonidoKtocandoT3null( #
<estorSonidos.singleton'(.tocaSonido'sonidoKtocando.int?alue'((;
,
,
,

private class /etrero<ameHver extends H4jetoMovil #
public /etrero<ameHver'( #
super'cargaImagen'"%gameover&png"((;
this.set2ipo'H4jetoMovil.2I*HKH2FH(;
set*osition'*antalla.get&ncho2a4lero'(G2MgetDidth'(G21*antalla.get&lto2a4lero'(G2M
getEeight'(G2(;

,
public void mover'( #
,
,

private void mover'( #
add*untos'<estorElementos.singleton'(.desacumula*untuacion'((;

*rotagonista prota3ge.get*rotagonista'(;

int estado3midlet.getEstado'(;
if'estadoT3DemoJuego.ES2&DHKJ>E<H UU
'estadoT3DemoJuego.ES2&DHK<&MEH?EF II Tprota.isMuriendo'((( #
if'TletreroKpuesto( #
letreroKpuesto3true;
prota.set?isi4le'false(;
<estorElementos.singleton'(.aPade'new /etrero<ameHver'((;
<estorSonidos.singleton'(.tocaSonido'musica<ameHver(;
tiempo3-;
, else #
tiempoBB;
if'tiempoN+)( #
midlet.setEstado'DemoJuego.ES2&DHK*FESE82&CIH8(;
,
,
, else #
prota.mover'(;
,


7ase 0ase3ge.get7ase'(;
0ase.mover'(;

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((;
,

if'o4j1.collidesDith'prota1false(( #
matar*rotagonista'(;
brea.;
,
brea.;
case H4jetoMovil.2I*HK@&/&M&/&O
if'o4j1.collidesDith'prota1false(( #
o4j1.matar'(;
matar*rotagonista'(;
brea.;
,
brea.;
case H4jetoMovil.2I*HKH*2IH8O
if'o4j1.collidesDith'prota1false(( #
''Hption( o4j1(.actua'(;
,
,
o4j1.mover'(;
, while'ge.siguiente'-((;
,
,

private void matar*rotagonista'( #
*rotagonista prota3ge.get*rotagonista'(;
if'prota.puedeMorir'(( #
prota.matar'(;
if'MMvidasL3-( #
gg.removeCommand'cmd*ausar(;
gg.removeCommand'cmdContinuar(;
midlet.setEstado'DemoJuego.ES2&DHK<&MEH?EF(;
,
,
,

public int get*untos'( #
return puntos;
,

private void add*untos'int puntos( #
this.puntosB3puntos;
,

public int get?idas'( #
return vidas;
,

,
$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_util_Pantalla,java
pac.age com.ulpgc.mmacias.util;

import javax.microedition.lcdui.Displaa4le;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.<raphics;
import javax.microedition.midlet.MIDlet;

> ?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&lto*antalla'( #
return alto*antalla;
,

public static int get&ncho2a4lero'( #
return ancho*antalla;
,

public static int get&lto2a4lero'( #
return 1-.2I/EKSIQE;
,




,

$:_program_HTJ%%_apps_Demo5uego_src_com_ulpgc_mmacias_util_!tils,java
pac.age com.ulpgc.mmacias.util;

import java.util.Fandom;

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;
,

return r;
,

,
> ?9; >
<iDliogra&%a
<iDliogra&%a
4ecr!o! electrnico!
T#arca %&&8U Alberto #arca -errano 3%&&84, Programacin de jego! para mvile! con J2ME,
PDF disponible en:
.ttp:((222,agserrano,com(publi,.tml 3=ltima consulta: Foviembre %&&'4
T6a.moud %&&8U Ausay M, 6a.moud 35unio %&&84, ?2e J2ME MoDile Media 6PI, MT6" disponible
en: .ttp:((developers,sun,com(tec.topics(mobility(midp(articles(mmapiovervie2(
3=ltima consulta: Diciembre %&&'4
J2ME Jame 5ptimiCation .ecret!, MT6" disponible en:
.ttp:((222,developer,com(java(j%me(article,p.p(?&<8'Z%%8'98?Z? 3=ltima consulta:
*nero %&&)4
J2ME :ata!2eet, PDF disponible en: .ttp:((java,sun,com(j%me(j%me>ds,pdf 3=ltima
consulta: *nero %&&)4
T-un %&&'U 5%6* Hireless ToolIit !ser[s #uide, MT6" disponible en:
.ttp:((java,sun,com(j%me(docs(2tI%,%(docs(!ser#uide>.tml(inde1,.tml 3=ltima
consulta: *nero %&&)4
Cecursos bibliograficos
TMartley ?<<;U -tep.en 5, Martley 3Febrero ?<<;4, $oncrrent Programming= ?2e Java
Programming 7angage. D1ford !niversity Press
TOarios %&&8U Oarios autores 3Diciembre %&&84, Programacin de videojego! para tel1&ono!
mvile! en Java con J2ME. *diversitas 6ultimedia -,",
TDrti7 %&&?U *, Drti7+ *, #uigRre 3Foviembre %&&?4 ?2e MoDile In&ormation :evice Pro&ile &or
Java 2 Micro Edition= Pro&e!!ional :eveloper,! Jide. 5o.n Hiley ] -ons+ Inc

También podría gustarte