Programación Java
J2ME: Java para dispositivos móviles
Febrero 2006
Febrero 2006
David Bueno Vallejo
David Bueno Vallejo
Master Universitario en Informática
Aplicada a las Telecomunicaciones Móviles
Plan
Plan
•
•
Introducció
Introducci
ón
n
•
•
Instalació
Instalaci
ón
n
•
•
Primer Programa
Primer Programa
•
•
Interfaz de Usuario en J2ME
Interfaz de Usuario en J2ME
–
–
Commands
Commands
–
–
Screen
Screen
(Alertas, formularios, im
(Alertas, formularios, im
á
á
genes,
genes,
choicegroup
choicegroup
,
,
ticker
ticker
)
)
–
–
GameCanvas
GameCanvas
(lectura de teclado, dibujar en pantalla,
(lectura de teclado, dibujar en pantalla,
sprites
sprites
,
,
tiledLayer
tiledLayer
,
,
tiledManager
tiledManager
,
,
scroll
scroll
, colisiones)
, colisiones)
•
•
RMS
RMS
•
3 3
Introducci
Introducció
ón
n
•
•
Se llama J2ME (Java Micro Edition
Se llama J2ME (Java Micro
Edition) a las
) a las
implementaciones de Java par dispositivos m
implementaciones de Java par dispositivos mó
óviles
viles
•
•
Hay varias implementaciones dependiendo del tipo de
Hay varias implementaciones dependiendo del tipo de
dispositivo
dispositivo
•
•
En este tema se ve la implementació
En este tema se ve la implementaci
ón relacionada con
n relacionada con
Tel
Telé
éfonos M
fonos Mó
óviles, PALM y
viles, PALM y Blackberry
Blackberry
(API MIDP)
(API MIDP)
Teléfonos, PALM, Blackberry
CLDC y MIDP
PDAs Pocket PC
Personal Java (jdk 1.22)
Blackberry
API propia
Introducci
Introducció
ón
n
5 5
Introducci
Introducció
ón
n
Componentes software de MIDP.
Imagen de [Knudsen2003]Instalaci
Instalació
ón
n
•
•
Java Development
Java
Development
Kit
Kit
(JDK)
(JDK)
Descripci
Descripci
ó
ó
n:
n:
Entorno de desarrollo de java para PC. Versi
Entorno de desarrollo de java para PC. Versi
ó
ó
n 1.4.2 o
n 1.4.2 o
superior (
superior (
ú
ú
ltima 1.5 y 1.6 Beta)
ltima 1.5 y 1.6 Beta)
Descarga:
Descarga:
http://java.sun.com/j2se/downloads.html
http://java.sun.com/j2se/downloads.html
j2sdk
j2sdk
-
-
1_4_2
1_4_2
-
-
windows
windows
-
-
i586.
i586.
exe
exe
y j2sdk
y j2sdk
-
-
1_4_2
1_4_2
-
-
doc.zip
doc.zip
(
(
docs
docs
)
)
Instalaci
Instalaci
ó
ó
n:
n:
•
•
Ejecutar el instalador y seleccionar la carpeta por defecto.
Ejecutar el instalador y seleccionar la carpeta por defecto.
P.ej
P.ej
:
:
c:
c:
\
\
jsdk1
jsdk1
.4.2
.4.2
•
•
Descomprimir la documentaci
Descomprimir la documentaci
ó
ó
n en esa carpeta
n en esa carpeta
•
7 7
Instalaci
Instalació
ón
n
•
•
J2ME Sun Java Wireless
J2ME Sun Java
Wireless
Toolkit
Toolkit
Descripci
Descripci
ó
ó
n:
n:
Entorno para compilar y generar .
Entorno para compilar y generar .
jar
jar
y .
y .
jad
jad
incluye
incluye
emuladores
emuladores
Descarga:
Descarga:
http
http
://java.sun.com/products/sjwtoolkit/download
://java.sun.com/products/sjwtoolkit/download
-
-
2_3.html
2_3.html
sun_java_wireless_toolkit
sun_java_wireless_toolkit
-
-
2_3
2_3
-
-
beta
beta
-
-
windows.exe
windows.exe
(Admite
(Admite
bluetooth
bluetooth
, multimedia, API 3D, posicionamiento,
, multimedia, API 3D, posicionamiento,
…
…
)
)
Instalaci
Instalaci
ó
ó
n:
n:
•
•
Ejecutar el instalador y seleccionar destino: c:
Ejecutar el instalador y seleccionar destino: c:
\
\
WTK23
WTK23
Primer Programa: Hola Mundo
Primer Programa: Hola Mundo
•
•
A continuaci
A continuació
ón se va a realizar el primer programa:
n se va a realizar el primer programa:
HolaMundo
HolaMundo
•
•
Primero se compilar
Primero se compilará
á
y ejecutará
y ejecutar
á
en el PC en un
en el PC en un
emulador
emulador
•
•
Despu
Despué
é
s se enviará
s se enviar
á
al mó
al m
óvil y se ejecutar
vil y se ejecutará
á
en é
en
él.
l.
•
•
Los pasos son los siguientes:
Los pasos son los siguientes:
1.
1.
Con un editor de texto escribir el programa de la
Con un editor de texto escribir el programa de la
transparencia siguiente. Guardarlo como
transparencia siguiente. Guardarlo como
HolaMundo.java
9 9
Primer Programa: C
Primer Programa: Có
ódigo y explicaci
digo y explicaci
ón
ó
n
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class DBVHolaMundo extends MIDlet implements CommandListener { private Display pantalla ;
private TextBox texto1 ; private Command salir; public DBVHolaMundo() {
pantalla = Display.getDisplay(this);// Devuelve un manejador de la pantalla
salir = new Command("Salir", Command.SCREEN, 1);// Crea un nuevo comando para Salir texto1 = new TextBox("Hola Mundo", "Mi primer MIDlet", 40, 0);// Crea un cuadro de texto texto1 .addCommand(salir);// Añade el comando al cuadro de texto
texto1 .setCommandListener(this);// Indica que la gestión de evento se hace en esta clase }
public void startApp() {// Se ejecuta al comenzar la aplicación
pantalla .setCurrent(texto1);// Muestra en la pantalla el texto y el comando }
public void pauseApp() { }// Se ejecuta si se interrumpe la aplicación public void destroyApp(boolean unconditional) { }// Se ejecuta al terminar
public void commandAction(Command c, Displayable displayable) {// Gestiona los eventos if (c == salir) {// Si el evento es pulsar el botón salir, termina
destroyApp(false); notifyDestroyed(); }
} }
Primer Programa: Proyecto
Primer Programa: Proyecto
2.
2.
Abrir el programa
Abrir el programa Ktoolbar
Ktoolbar
(c:\
(c:
\j2me
j2me\
\WTK21
WTK21\
\bin
bin)
)
1.
11 11
Primer Programa: Generaci
Primer Programa: Generació
ón
n
2.
2.
Ktoolbar
Ktoolbar
2.
2.
Compilar/Enlazar el c
Compilar/Enlazar el c
ó
ó
digo con el bot
digo con el bot
ó
ó
n
n
Build
Build
Primer Programa: Ejecuci
Primer Programa: Ejecució
ón en emulador
n en emulador
2.
2.
Ktoolbar
Ktoolbar
3.
3.
Seleccionar el emulador en el
Seleccionar el emulador en el
desplegable
desplegable
Device
Device
4.
13 13
Primer Programa: Preparaci
Primer Programa: Preparació
ón para el m
n para el m
óvil
ó
vil
2.
2.
Ktoolbar
Ktoolbar
5.
5.
Editar datos del proyecto: (
Editar datos del proyecto: (
Project
Project
Settings
Settings
Required
Required
)
)
6.
6.
Generar los fichero .
Generar los fichero .
jad
jad
y .
y .
jar
jar
:
:
Project
Project
Package
Package
Create
Create
Package
Package
7.
7.
Los 2 ficheros a enviar al tel
Los 2 ficheros a enviar al tel
é
é
fono son:
fono son:
HolaMundo.jad
HolaMundo.jad
y
y
HolaMundo.jar
HolaMundo.jar
, guardados en
, guardados en
c:
c:
\
\
j2me
j2me
\
\
WTK21
WTK21
\
\
apps
apps
\
\
HolaMundo
HolaMundo
\
\
bin
bin
Nombre delproveedor
Nombre del perfil. Por defecto es MIDP-2.0. Si
el teléfono sólo es compatible con MIDP-1.0
es IMPRESCINDIBLE cambiarlo. (Por ejemplo,
para el Nokia 3650)
Primer Programa: Env
Primer Programa: Enví
ío al tel
o al telé
éfono
fono bluetooth
bluetooth
3.
3.
Enviar los 2 ficheros al tel
Enviar los 2 ficheros al telé
éfono por
fono por bluetooth
bluetooth
1.
1.
Instalar dispositivo
Instalar dispositivo
bluetooth
bluetooth
en PC (Como ejemplo se
en PC (Como ejemplo se
explicar
explicar
á
á
n los pasos para el dispositivo
n los pasos para el dispositivo
Bluetooth
Bluetooth
3Com)
3Com)
2.
2.
Arrancar en el PC el
Arrancar en el PC el
Bluetooth
Bluetooth
Connection
Connection
Manager
Manager
(o
(o
programa similar que traiga el
programa similar que traiga el
Bluetooth
Bluetooth
)
)
3.
3.
Encender en el tel
Encender en el tel
é
é
fono el
fono el
bluetooth
bluetooth
(Normalmente:
(Normalmente:
Conexiones
Conexiones
Bluetooth
Bluetooth
Activar
Activar
)
)
4.
4.
Si todo va bien
Si todo va bien
☺
☺
el PC ver
el PC ver
á
á
el
el
tel
tel
é
é
fono. Con el bot
fono. Con el bot
ó
ó
n derecho
n derecho
sobre el icono seleccionar
sobre el icono seleccionar
enviar
enviar
archivo
archivo
5.
15 15
3.
3.
Enviar los 2 ficheros al tel
Enviar los 2 ficheros al telé
éfono por
fono por bluetooth
bluetooth
6.
6.
En el tel
En el tel
é
é
fono se recibir
fono se recibir
á
á
n 2 mensajes. Uno por cada fichero.
n 2 mensajes. Uno por cada fichero.
Aceptarlos.
Aceptarlos.
7.
7.
En el men
En el men
ú
ú
mensajes
mensajes
Buzon
Buzon
de entrada del tel
de entrada del tel
é
é
fono Abrir el
fono Abrir el
fichero
fichero
HolaMundo.jad
HolaMundo.jad
. Aparecer
. Aparecer
á
á
un mensaje como:
un mensaje como:
8.
8.
Donde el nombre de la aplicaci
Donde el nombre de la aplicaci
ó
ó
n, la versi
n, la versi
ó
ó
n y el suministrador
n y el suministrador
son los que se hayan seleccionado al editar los datos del
son los que se hayan seleccionado al editar los datos del
proyecto
proyecto
9.
9.
Si la instalaci
Si la instalaci
ó
ó
n es correcta, se podr
n es correcta, se podr
á
á
ejecutar la aplicaci
ejecutar la aplicaci
ó
ó
n en
n en
el men
el men
ú
ú
del tel
del tel
é
é
fono
fono
Aplicaciones
Aplicaciones
Hola
Hola
Mundo
Mundo
¿Instalar HolaMundo 1.0 suministrado por David Bueno?
Primer Programa: Env
Primer Programa: Enví
ío al tel
o al telé
éfono
fono bluetooth
bluetooth
Primer Programa: Env
Primer Programa: Enví
ío al tel
o al telé
éfono infrarrojos
fono infrarrojos
•
•
NOKIA:
NOKIA:
–
–
Si se pasan los ficheros directamente no pueden ejecutarse
Si se pasan los ficheros directamente no pueden ejecutarse
–
–
Es necesario descargar el instalar la aplicaci
Es necesario descargar el instalar la aplicaci
ó
ó
n: NOKIA PC Suite
n: NOKIA PC Suite
–
–
Se puede descargar de http://
Se puede descargar de http://
www.nokia.es
www.nokia.es
(seleccionando el
(seleccionando el
te
17 17
Primer Programa: Env
Primer Programa: Enví
ío al tel
o al telé
éfono serie/
fono serie/usb
usb
•
•
SIEMENS:
SIEMENS:
–
–
Conectar el tel
Conectar el tel
é
é
fono al cable serie o
fono al cable serie o
usb
usb
–
–
Es necesario descargar el instalar la aplicaci
Es necesario descargar el instalar la aplicaci
ó
ó
n: Siemens Data
n: Siemens Data
Suite
Suite
–
–
Se puede descargar de http://
Se puede descargar de http://
www.siemens
www.siemens
-
-
mobile.com
mobile.com
(seleccionando el
(seleccionando el
te
te
é
é
fono
fono
y las aplicaciones para
y las aplicaciones para
é
é
ste)
ste)
–
–
Despu
Despu
é
é
s aparecer
s aparecer
á
á
el tel
el tel
é
é
fono como una carpeta y habr
fono como una carpeta y habr
á
á
que
que
copiar los ficheros .
copiar los ficheros .
jad
jad
y .
y .
jar
jar
en la carpeta /java/
en la carpeta /java/
jam
jam
/
/
HolaMundo
HolaMundo
Primer Programa: Env
Primer Programa: Enví
ío al tel
o al telé
éfono por Web
fono por Web
•
•
Se necesita un servidor Web accesible desde el exterior
Se necesita un servidor Web accesible desde el exterior
–
–
Dentro de la UMA es necesario tener abierto el puerto 80 en los
Dentro de la UMA es necesario tener abierto el puerto 80 en los
servicios centrales de Inform
servicios centrales de Inform
á
á
tica
tica
•
•
En el servidor web
En el servidor
web
habrá
habr
á
que configurar 2 tipos MIME:
que configurar 2 tipos MIME:
•
•
En algunos mó
En algunos m
óviles ser
viles será
á
suficiente con descargar el .jar
suficiente con descargar el .
jar
•
•
En lo que no sea suficiente, habrá
En lo que no sea suficiente, habr
á
que descargar el .
que descargar el .jad
jad
pero modificando la
pero modificando la linea
linea
URL de la siguiente forma:
URL de la siguiente forma:
text/vnd.sun.j2me.app-descriptor jad application/java-archive jar
19 19
Interfaz de Usuario en J2ME
Interfaz de Usuario en J2ME
•
•
Hay 3 formas como un usuario puede interactuar con las
Hay 3 formas como un usuario puede interactuar con las
aplicaciones
aplicaciones
–
–
Command
Command
.
.
-
-
Son acciones que se asocian a los botones que el
Son acciones que se asocian a los botones que el
usuario pulsa en el dispositivo para realizar alguna tarea
usuario pulsa en el dispositivo para realizar alguna tarea
–
–
Screen
Screen
.
.
-
-
Interfaz de alto nivel con alertas, formularios, cuadros
Interfaz de alto nivel con alertas, formularios, cuadros
de texto,
de texto,
radiobuttons
radiobuttons
,
,
checkbox
checkbox
, listas similares a las utilizadas
, listas similares a las utilizadas
en HTML
en HTML
–
–
Canvas
Canvas
.
.
-
-
Interfaz de bajo nivel en la que el usuario trabaja a
Interfaz de bajo nivel en la que el usuario trabaja a
nivel de
nivel de
pixel
pixel
, utilizadas para aplicaciones como juegos
, utilizadas para aplicaciones como juegos
IU:
IU: Display
Display
Class
Class
•
•
La pantalla del dispositivo se asocia a un objeto Display
La pantalla del dispositivo se asocia a un objeto
Display
•
•
Un MIDlet
Un
MIDlet
est
est
á
á
asociado a un ú
asociado a un
único objeto
nico objeto Display
Display
•
•
En este objeto se pueden mostrar objetos de tipo
En este objeto se pueden mostrar objetos de tipo
Displayable
Displayable
(
(
Screen
Screen
y
y
Canvas
Canvas
)
)
Displayable
Screen
Alert
List
TextBox
Form
21 21
IU:
IU: Display
Display
Class
Class
•
•
La referencia al objeto Display
La referencia al objeto
Display
se obtiene normalmente
se obtiene normalmente
en el constructor o en
en el constructor o en startApp
startApp() aunque se declare
() aunque se declare
como atributo de la clase
como atributo de la clase
•
•
Se pueden tener varios objetos de tipo Displayable
Se pueden tener varios objetos de tipo
Displayable
pero
pero
s
só
ólo uno (aunque puede ser compuesto como un
lo uno (aunque puede ser compuesto como un form
form)
)
que se muestre en el
que se muestre en el Display
Display. Para asociarlo a la pantalla
. Para asociarlo a la pantalla
se utiliza
se utiliza setCurrent
setCurrent
y se puede cambiar cuando se
y se puede cambiar cuando se
quiera
quiera
public class NombreClase… { Private Display pantalla; Public void startApp() {
pantalla= Display.getDisplay(this); } } TextBox cuadrotexto; cuadrotexto=new TextBox(“titulo”,”contenido”,30,TextField.ANY); pantalla.setCurrent(cuadrotexto);
IU:
IU: Command
Command
Class
Class
•
•
Son acciones que se asocian a botones del dispositivo.
Son acciones que se asocian a botones del dispositivo.
Los posibles tipos son:
Los posibles tipos son:
•
•
Aunque existan todos esos tipos en realidad no influye el
Aunque existan todos esos tipos en realidad no influye el
hecho de elegir uno u otro salvo en la posici
hecho de elegir uno u otro salvo en la posició
ón en la que
n en la que
aparecer
aparecerá
á
en pantalla
en pantalla
Command.BACK Ir a la pantalla anterior Command.CANCEL Cancelar la operación actual Command.EXIT Terminar la aplicación Command.HELP Mostrar ayuda
Command.ITEM Asocia una acción a un elemento de la pantalla Command.OK Aceptar
Command.SCREEN Acción genérica para comandos específicos de la aplicación Command.STOP Para parar la operación actual
23 23
IU:
IU: Command
Command
Class
Class
•
•
Para a
Para a
ñ
ñ
adir el
adir el
Command
Command
al
al
display
display
•
•
Para asociar una acci
Para asociar una acci
ó
ó
n a un
n a un
Command
Command
hay que implementar la
hay que implementar la
interfaz
interfaz
CommandListener
CommandListener
•
•
Como ejemplo un programa con 2 cuadros de texto, uno de los
Como ejemplo un programa con 2 cuadros de texto, uno de los
cuales es una ayuda, en total hay 3
cuales es una ayuda, en total hay 3
command
command
asociados a las
asociados a las
operaciones de salir de la aplicaci
operaciones de salir de la aplicaci
ó
ó
n, ayuda y volver (salir de la
n, ayuda y volver (salir de la
ayuda)
ayuda)
Pantalla.addCommand(miok);
public class MiClase extends MIDlet implements CommandListener { …
public void commandAction(Command c, Displayable displayable) { if (c == quitar) { destroyApp(false); notifyDestroyed(); } else if (c==miok) { … } }
Programa:
25 25
Programa:
Programa: DBVCommands
DBVCommands
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class DBVCommands extends MIDlet implements CommandListener { private Display pantalla ;
private TextBox tintro,tayuda ; private Command salir, ayuda, volver; public DBVCommands () {
pantalla = Display.getDisplay(this); // Preparando la pantalla principal
tintro = new TextBox("Mis Comandos", "Puedes salir o elegir ayuda", 40, 0);
salir = new Command("Salir", Command.EXIT, 0); ayuda = new Command("Ayuda",Command.HELP,1); tintro .addCommand(salir);
tintro.addCommand(ayuda); tintro.setCommandListener(this);
// Preparando pantalla de ayuda
tayuda = new TextBox("Ayuda", "Para salir debe regresar :-)", 40, 0);
volver=new Command("Volver",Command.BACK,1); tayuda.addCommand(volver);
tayuda.setCommandListener(this);
}
public void startApp() { pantalla .setCurrent(tintro);
}
public void pauseApp() { }
Programa:
Programa: DBVCommands
DBVCommands
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable displayable) {
if (c == salir) { destroyApp(false); notifyDestroyed(); } else if (c==ayuda) { pantalla.setCurrent(tayuda); } else if (c==volver) { pantalla.setCurrent(tintro); } } }
27 27
IU:
IU: Screen:Alertas
Screen:Alertas
•
•
Las alertas son cuadros de dialogo que avisan al usuario
Las alertas son cuadros de dialogo que avisan al usuario
de alg
de algú
ún problema, confirman alguna acci
n problema, confirman alguna acció
ón del usuario,
n del usuario,
o muestran un recordatorio en la pantalla
o muestran un recordatorio en la pantalla
•
•
Hay varios tipos predefinidos
Hay varios tipos predefinidos
•
•
El constructor de la alerta tiene 4 pará
El constructor de la alerta tiene 4 par
á
metros: tí
metros: t
ítulo,
tulo,
texto, imagen, tipo
texto, imagen, tipo
•
•
Las alertas pueden ser:
Las alertas pueden ser:
–
–
Modales. Permanecen hasta que el usuario realce alguna acci
Modales. Permanecen hasta que el usuario realce alguna acci
ó
ó
n
n
–
–
Temporales. Se cierran pasado algunos segundos
Temporales. Se cierran pasado algunos segundos
Alert mialerta;
mialerta=new Alert(“Titulo”,”Texto de la alerta”, null, AlertType.CONFIRMATION);
AlertType.ALARM, AlertType.CONFIRMATION, AlertType.ERROR, AlertType.INFO, AlertType.WARNING
mialerta.setTimeout(Alert.FOREVER);
mialerta.setTimeout(5000); // Espera 5 segundos
IU:
IU: Screen:Alertas
Screen:Alertas
•
•
Por defecto aparecen acciones ‘
Por defecto aparecen acciones
‘Command
Command’
’
asociadas a
asociadas a
las alertas, aunque pueden definirse nuevas con
las alertas, aunque pueden definirse nuevas con
addCommand
addCommand
para personalizar los resultados
para personalizar los resultados
•
•
Para mostrar la alerta se cambia el display
Para mostrar la alerta se cambia el
display
como siempre
como siempre
•
•
Cuando la alerta se cierra se vuelve a la pantalla anterior
Cuando la alerta se cierra se vuelve a la pantalla anterior
•
•
Si se quiere que al cerrar la alerta se pase a otra
Si se quiere que al cerrar la alerta se pase a otra
pantalla se utiliza un segundo par
pantalla se utiliza un segundo pará
ámetro de
metro de setCurrent
setCurrent
pantalla.setCurrent(mialerta,siguientepantalla); pantalla.setCurrent(mialerta);
29 29
IU:
IU: Screen:Formularios
Screen:Formularios
•
•
Los formularios permiten recoger datos del usuario
Los formularios permiten recoger datos del usuario
•
•
En un formulario se pueden incluir derivados de la clase
En un formulario se pueden incluir derivados de la clase
Item
Item
–
–
ChoiceGroup
ChoiceGroup
,
,
CustomItem
CustomItem
,
,
DateField
DateField
, Gauge, ImageItem
, Gauge,
ImageItem
,
,
Spacer,
Spacer, StringItem
StringItem
,
, TextField
TextField
•
•
Se añ
Se a
ñaden elementos al formulario con
aden elementos al formulario con Append
Append
•
•
A continuació
A continuaci
ón un ejemplo de un formulario que pide un
n un ejemplo de un formulario que pide un
nombre de usuario y una contrase
nombre de usuario y una contraseñ
ña. Utiliza una alerta
a. Utiliza una alerta
para mostrar el nombre le
para mostrar el nombre leí
ído
do
Form miform; miform=new Form(“Título"); TextField usuario; usuario=new TextField("usuario","",10,TextField.ANY); miform.append(usuario);
Programa:
31 31
Programa:
Programa: DBVAcceso
DBVAcceso
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class DBVAcceso extends MIDlet implements CommandListener { private Display pantalla ;
private Form flogin ;
private Alert confirmacion;
private TextField usuario; private TextField passwd;
private Command salir,aceptar; private String cad;
public DBVAcceso () {
pantalla = Display.getDisplay(this); // Preparando la pantalla principal
flogin=new Form("Control Acceso");
usuario=new TextField("usuario","",10,TextField.ANY);
passwd=new TextField("contraseña","",10,TextField.ANY|TextField.PASSWORD);
aceptar = new Command("Enviar", Command.OK, 0); salir = new Command("Salir", Command.EXIT, 0);
flogin.append(usuario); flogin.append(passwd); flogin.addCommand(aceptar); flogin.addCommand(salir); flogin.setCommandListener(this);
// Alerta de confirmacion de datos
confirmacion= new Alert ("Confirmación","", null, AlertType.CONFIRMATION); confirmacion.setTimeout(Alert.FOREVER);
}
Programa:
Programa: DBVAcceso
DBVAcceso
public void startApp() { pantalla .setCurrent(flogin); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable displayable) { if (c == salir) {
destroyApp(false); notifyDestroyed(); } else if (c==aceptar) {
cad="Bienvenido al sistema " + this.usuario.getString();
confirmacion.setString(cad); pantalla.setCurrent(confirmacion);
} } }
33 33
IU:
IU: Screen
Screen: Formularios: Im
: Formularios: Imá
ágenes
genes
•
•
Para trabajar con imá
Para trabajar con im
ágenes hay que hacerlo en formato
genes hay que hacerlo en formato
.
.png
png
•
•
El programa Paint
El programa
Paint
de Windows guarda cualquier imagen
de Windows guarda cualquier imagen
en este formato
en este formato
•
•
Hay que guardar las imá
Hay que guardar las im
ágenes en la carpeta
genes en la carpeta res
res
que
que
genera J2ME
genera J2ME Wireless
Wireless
Toolkit
Toolkit
(WT) al crear un proyecto
(WT) al crear un proyecto
•
•
La referencia a la imagen se hace con esta carpeta como
La referencia a la imagen se hace con esta carpeta como
raiz
raiz
/.
/.
–
–
Es decir, una imagen dentro de esta carpeta se referencia
Es decir, una imagen dentro de esta carpeta se referencia
“
“
/
/
imagen.png
imagen.png
”
”
–
–
Una imagen en res/
Una imagen en res/
imagenes
imagenes
se referencia
se referencia
“
“
/im
/im
á
á
genes/
genes/
imagen.png
imagen.png
”
”
•
•
Las imá
Las im
ágenes se a
genes se añ
ñadir
adirá
án al fichero .
n al fichero .jar
jar
(lo hace WT)
(lo hace WT)
IU:
IU: Screen
Screen: Formularios: Im
: Formularios: Imá
ágenes
genes
•
•
Una objeto imagen se declara y crea:
Una objeto imagen se declara y crea:
•
•
Es importante crear la imagen en un try
Es importante crear la imagen en un
try..
..catch
catch
por si no
por si no
se encuentra
se encuentra
Image mimagen;
mimagen=Image.createImage("/nombre.png");
try { // Ejemplo de imagen en formulario
mimagen=Image.createImage("/nombre.png"); } catch (java.io.IOException error) {
Alert alerta=new Alert("Error","No se pueda cargar la imagen",null,AlertType.ERROR); alerta.setTimeout(5000);
pantalla.setCurrent(alerta); }
35 35
IU:
IU: Screen
Screen: Formularios: Im
: Formularios: Imá
ágenes
genes
•
•
Para usarla en una alerta se pondrá
Para usarla en una alerta se pondr
á
como 3
como 3
er erpar
pará
ámetro
metro
en el constructor de la alerta
en el constructor de la alerta
•
•
Para usarla en un formulario hay que crear un
Para usarla en un formulario hay que crear un
ImageItem
ImageItem
•
•
En el siguiente ejemplo se carga una imagen en una
En el siguiente ejemplo se carga una imagen en una
alerta que dura 3 segundos y despu
alerta que dura 3 segundos y despué
é
s se muestra un
s se muestra un
formulario con otra imagen
formulario con otra imagen
intro=new Alert(“Titulo", “Texto...",mimagen,AlertType.INFO);
imagenit=new ImageItem(null,mimagen,ImageItem.LAYOUT_CENTER,"Davilin"); principal.append(imagenit);
Programa:
Programa: DBVImagenes
DBVImagenes
37 37
Programa:
Programa: DBVImagenes
DBVImagenes
(1/3)
(1/3)
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class DBVImagenes extends MIDlet implements CommandListener { private Alert intro;
private Display pantalla ; private Form principal ; private Command salir; private Image imagen2,imagen1; private ImageItem imagenit; private String cad; public DBVImagenes() {
pantalla = Display.getDisplay(this); // Preparando la pantalla principal principal=new Form("Imagenes");
salir = new Command("Salir", Command.EXIT, 0); principal.addCommand(salir);
principal.setCommandListener(this); ...
Programa:
Programa: DBVImagenes
DBVImagenes
(2/3)
(2/3)
// Creación de la imagen
try { // Ejemplo de imagen en formulario
imagen2=Image.createImage("/david2.png");
imagenit=new ImageItem(null,imagen2,ImageItem.LAYOUT_CENTER,"Davilin"); principal.append(imagenit);
} catch (java.io.IOException error) {
Alert alerta=new Alert("Error","No se pueda cargar la imagen",null,AlertType.ERROR); alerta.setTimeout(5000);
pantalla.setCurrent(alerta); }
// Preparacion de la pantalla de bienvenida try {// Ejemplo de imagen en alerta
imagen1=Image.createImage("/david1.png");
intro=new Alert("Bienvenido", "Bienvenido a mi programa\nCargando...",imagen1,AlertType.INFO); intro.setTimeout(3000);
} catch (java.io.IOException error) {
Alert alerta=new Alert("Error","No se pueda cargar la imagen",null,AlertType.ERROR); alerta.setTimeout(5000);
39 39
Programa:
Programa: DBVImagenes
DBVImagenes
(3/3)
(3/3)
public void startApp() {
pantalla.setCurrent(intro,principal); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable displayable) { if (c == salir) { destroyApp(false); notifyDestroyed(); } } }
IU:
IU: Screen:Formularios:ChoiceGroup
Screen:Formularios:ChoiceGroup
•
•
Permite crear botones de tipo radio y checkbox
Permite crear botones de tipo radio y
checkbox.
.
•
•
Hay 3 tipos
Hay 3 tipos
•
•
Para crear las selecciones:
Para crear las selecciones:
•
•
Para procesar elemento seleccionado en radio:
Para procesar elemento seleccionado en radio:
•
•
Para procesar elementos seleccionados en check:
Para procesar elementos seleccionados en check:
Choice.EXCLUSIVE Botones Radio Choice.MULTIPLE Botones Checkbox Choice.IMPLICIT Menú
miradio=new ChoiceGroup("Mi Radio",Choice.EXCLUSIVE); miradio.append("opcion1",null); // 2º parámetro es una imagen miradio.append("opcion2",null);
principal.append(miradio);
i=miradio.getSelectedIndex();
41 41
Programa:
Programa: DBVChoice
DBVChoice
Programa:
Programa: DBVChoice
DBVChoice
(1/3)
(1/3)
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class DBVChoice extends MIDlet implements CommandListener { private ChoiceGroup miradio, micheck, milista;
private Command procesaradio, procesacheck, salir; private Display pantalla ;
private Form principal ; private String cad; public DBVChoice() {
pantalla = Display.getDisplay(this); // Preparando la pantalla principal principal=new Form("Imagenes");
salir = new Command("Salir", Command.EXIT, 0);
procesaradio = new Command("Ver Radio", Command.SCREEN, 0); procesacheck = new Command("Ver Check", Command.SCREEN, 0); principal.addCommand(salir);
principal.addCommand(procesaradio); principal.addCommand(procesacheck);
43 43
Programa:
Programa: DBVChoice
DBVChoice
(2/3)
(2/3)
// Checkbox
micheck=new ChoiceGroup("Mi Check",Choice.MULTIPLE); micheck.append("check1",null);
micheck.append("check2",null); principal.append(micheck);
}
public void startApp() { pantalla.setCurrent(principal); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable displayable) { int i; StringItem mensaje; if (c == salir) { destroyApp(false); notifyDestroyed();
Programa:
Programa: DBVChoice
DBVChoice
(3/3)
(3/3)
} else if (c==procesaradio) { i=miradio.getSelectedIndex(); mensaje=new StringItem("",miradio.getString(i)+"\n"); principal.append(mensaje); } else if (c==procesacheck){ for (i=0;i<micheck.size();i++) { if (micheck.isSelected(i)){ mensaje=new StringItem("",micheck.getString(i)+"\n"); principal.append(mensaje); } } } } }
45 45
IU:
IU: Screen:Ticker
Screen:Ticker
•
•
Permite mostrar un scroll
Permite mostrar un
scroll
horizontal.
horizontal.
•
•
Se puede asociar a cualquier clase derivada de Screen
Se puede asociar a cualquier clase derivada de
Screen
•
•
Para crearlo y asociarlo, por ejemplo a un formulario
Para crearlo y asociarlo, por ejemplo a un formulario
•
•
Para modificar su valor
Para modificar su valor
•
•
A continuació
A continuaci
ón un ejemplo que tiene
n un ejemplo que tiene ticker
ticker
y un radio y
y un radio y
muestra en el
muestra en el ticker
ticker
informació
informaci
ón adicional sobre el
n adicional sobre el
significado del radio
significado del radio
cad=new String("Soy un texto que se desplaza por la pantalla"); miticker=new Ticker(cad);
principal.setTicker(miticker);
miticker.setString(“Texto nuevo del ticker");
Programa
47 47
Programa:
Programa: DBVTicker
DBVTicker
(1/2)
(1/2)
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class DBVTicker extends MIDlet implements CommandListener, ItemStateListener{ private ChoiceGroup miradio;
private Command salir; private Display pantalla ; private Form principal ; private String cad; private Ticker miticker; public DBVTicker() {
pantalla = Display.getDisplay(this); // Preparando el ticker
cad=new String("Soy un texto que se desplaza por la pantalla"); miticker=new Ticker(cad);
// Preparando la pantalla principal principal=new Form("Formulario");
principal.setTicker(miticker); // Se asocia el ticker al formulario salir = new Command("Salir", Command.EXIT, 0);
principal.addCommand(salir); principal.setCommandListener(this); // Radio
miradio=new ChoiceGroup("Mi Radio",Choice.EXCLUSIVE); miradio.append("opcion1",null);
miradio.append("opcion2",null); principal.append(miradio);
principal.setItemStateListener(this); // Listener que se llama si cambia el radio }
Programa:
Programa: DBVTicker
DBVTicker
(2/2)
(2/2)
public void startApp() { pantalla.setCurrent(principal); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable displayable) { if (c == salir) {
destroyApp(false); notifyDestroyed(); }
}
public void itemStateChanged(Item item){ // Listener de RadioButton int i;
if (item==miradio) {
i=miradio.getSelectedIndex();
if (i==0) { // Dependiendo del radio elegido se cambia en texto del ticker miticker.setString("La Opcion primera es muy buena");
} else {
49 49
IU:
IU: Canvas
Canvas
y GameCanvas
y
GameCanvas
•
•
Canvas
Canvas
es la clase b
es la clase b
á
á
sica para trabajar con la pantalla a bajo nivel:
sica para trabajar con la pantalla a bajo nivel:
Dibujar
Dibujar
pixels
pixels
,
,
lineas
lineas
, figuras, etc.
, figuras, etc.
•
•
GameCanvas
GameCanvas
mejora
mejora
Canvas
Canvas
incluyendo carga de Im
incluyendo carga de Im
á
á
genes,
genes,
Sprites
Sprites
,
,
TiledLayers
TiledLayers
y un mejor control de los botones del tel
y un mejor control de los botones del tel
é
é
fono
fono
•
•
Estas clases son la utilizada para hacer los juegos Java que han
Estas clases son la utilizada para hacer los juegos Java que han
hecho tan populares los m
hecho tan populares los m
ó
ó
viles
viles
•
•
La programaci
La programaci
ó
ó
n de juegos se convierte en algo mucho m
n de juegos se convierte en algo mucho m
á
á
s sencillo
s sencillo
que en cualquier otra plataforma
que en cualquier otra plataforma
•
•
El programador no tiene que preocuparse de problemas cl
El programador no tiene que preocuparse de problemas cl
á
á
sicos
sicos
como:
como:
–
–
Refresco de pantalla, doble
Refresco de pantalla, doble
buffering
buffering
, colisiones, gesti
, colisiones, gesti
ó
ó
n de capas o
n de capas o
mapas
mapas
•
•
Las clases anteriores se encargan de todo el
Las clases anteriores se encargan de todo el
‘
‘
trabajo sucio
trabajo sucio
’
’
IU:
IU: GameCanvas
GameCanvas
•
•
Las
Las
aplicaciones
aplicaciones
no
no
suelen
suelen
utilizar
utilizar
directamente
directamente
GameCanvas
GameCanvas,
, sino
sino
que
que
heredan
heredan
de esta
de
esta
clase
clase
•
•
Como
Como
mí
m
ínimo
nimo
hay dos
hay dos clases
clases:
:
Una
Una
para
para
el
el
midlet
midlet
principal y
principal y otra
otra
para
para
la clase
la
clase
que
que
hereda
hereda
de GameCanvas
de
GameCanvas
•
•
El
El
juego
juego
suele
suele
ejecutarse
ejecutarse
en
en
una
una
hebra
hebra
independiente
independiente
con el
con el siguiente
siguiente
bucle
bucle
principal
principal
// Dentro de la clase que hereda de GameCanvas
public void run() {
Graphics g = getGraphics(); while (jugando == true) {
colision(); // Controla colisiones
51 51
IU:
IU: GameCanvas
GameCanvas:
: Lectura
Lectura
de teclado
de
teclado
•
•
Para leer de teclado
Para leer de
teclado
es
es
necesario
necesario
leer el estado
leer el
estado
de
de
las
las
teclas
teclas
con:
con:
•
•
Hay varias
Hay
varias
constantes
constantes
en GameCanvas
en
GameCanvas
para
para
cada
cada
tecla
tecla:
:
// Metodo para gestionar el teclado
private void leeTeclado() { int keyStates = getKeyStates();
// Izquierda
if ((keyStates & LEFT_PRESSED) != 0) {
// Acciones cuando pulse izquierda
}
// Derecha
if ((keyStates & RIGHT_PRESSED) !=0 ) {
// Acciones cuando pulse izquierda
} … }
int keyStates = getKeyStates();
DOWN_PRESSED, LEFT_PRESSED, RIGHT_PRESSED, UP_PRESSED, FIRE_PRESSED, GAME_A_PRESSED, GAME_B_PRESSED, GAME_C_PRESSED, GAME_D_PRESSED
IU:
IU: GameCanvas
GameCanvas:
: Dibujar
Dibujar
en la
en la
pantalla
pantalla
•
•
Suele haber un mé
Suele haber un m
étodo en el que se realiza todo el
todo en el que se realiza todo el
refresco de pantalla: im
refresco de pantalla: imá
ágenes,
genes, lineas
lineas,
, sprites
sprites,
, fondos
fondos…
…
•
•
Para hacer cualquier dibujo se utiliza un objeto Graphics
Para hacer cualquier dibujo se utiliza un objeto
Graphics
que puede obtenerse dentro de
que puede obtenerse dentro de GameCanvas
GameCanvas
con
con
•
•
Algunos de las acciones posibles:
Algunos de las acciones posibles:
Graphics g=getGraphics();
g.setColor(0xbbecf3); // Selecciona el color de lo siguiente que se dibuje
g.fillRect(0, 0, ancho, alto); // Dibuja un rectangulo relleno con ese color
g.setColor(0x0000ff);
g.drawLine(0,100,200,0); // Dibuja una línea
// Para escribir un texto, se indican las coordenadas de la pantalla y la // alineación del texto en la pantalla
53 53
IU:
IU: GameCanvas
GameCanvas: Sprites
: Sprites
•
•
La clase Sprite
La clase
Sprite
maneja los personajes del juego
maneja los personajes del juego
•
•
Carga del Sprite
Carga del
Sprite
en un fichero con 5 posiciones
en un fichero con 5 posiciones
•
•
Se indica el tamañ
Se indica el tama
ño de un elemento
o de un elemento
24
24
80
0
1
2
3
4
Sprite babosin; Image imagen; imagen = Image.createImage("/babosin.png");babosin = new Sprite (image,16,24);
16
Fichero: babosin.png
IU:
IU: GameCanvas
GameCanvas: Sprites
: Sprites
•
•
Para mostrar el
Para mostrar el
sprite
sprite
hay que seleccionar la posici
hay que seleccionar la posició
ón de
n de
pantalla
pantalla
•
•
Tambié
Tambi
én cual de los
n cual de los
frames
frames
se va a mostrar
se va a mostrar
•
•
Y có
Y c
ómo quiere mostrarse: Su posici
mo quiere mostrarse: Su posició
ón original, invertida
n original, invertida
o girada en x grados
o girada en x grados
•
•
Para dibujar se necesita un Graphics
Para dibujar se necesita un
Graphics
g que puede
g que puede
obtenerse con:
obtenerse con: Graphics
Graphics
g = getGraphics
g =
getGraphics();
();
Sprite.TRANS_NONE, Sprite.TRANS_MIRROR, Sprite.TRANS_ROT90, Sprite.TRANS_ROT180, Sprite.TRANS_ROT270, Sprite.TRANS_MIRROR_ROT90, Sprite.TRANS_MIRROR_ROT180,
55 55
Programa:
Programa: DBVGameCanvas
DBVGameCanvas
•
•
Se va a mostrar en un programa los elementos
Se va a mostrar en un programa los elementos
relacionados con
relacionados con GameCanvas
GameCanvas
vistos hasta este punto
vistos hasta este punto
•
•
Se dibujaran algunas lí
Se dibujaran algunas l
íneas y rect
neas y rectá
ángulos y se mover
ngulos y se moverá
á
un
un Sprite
Sprite
por la pantalla
por la pantalla
•
•
Se va a utilizar una clase para el midlet
Se va a utilizar una clase para el
midlet
(
(DBVGameCanvas
DBVGameCanvas
), que será
), que ser
á
muy similar en todos los
muy similar en todos los
programas que usen
programas que usen GameCanvas
GameCanvas
•
•
Por otro lado, se va a utilizar una clase que hereda de
Por otro lado, se va a utilizar una clase que hereda de
GameCanvas
GameCanvas
(BabosinCanvas
(
BabosinCanvas
) sobre la que recae la
) sobre la que recae la
mayor parte de la acci
mayor parte de la acció
ón
n
•
•
Esta
Esta
ú
última tiene una hebra que es iniciada por la clase
ltima tiene una hebra que es iniciada por la clase
principal
principal
Programa:
Programa: DBVGameCanvas
DBVGameCanvas
57 57
Programa:
Programa: DBVGameCanvas
DBVGameCanvas
(1/2)
(1/2)
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class DBVGameCanvas extends MIDlet implements CommandListener { private Display display;
private BabosinCanvas babosinCanvas; private Command salir;
public void startApp() { try {
display = Display.getDisplay(this); babosinCanvas= new BabosinCanvas();
babosinCanvas.start(); // Inicia la hebra del canvas
salir = new Command("Salir", Command.EXIT, 0); // Boton para salir
babosinCanvas.addCommand(salir); babosinCanvas.setCommandListener(this); display.setCurrent(babosinCanvas); } catch (Exception ex) {
System.out.println(ex); }
}
public void pauseApp() { }
Programa:
Programa: DBVGameCanvas
DBVGameCanvas
(2/2)
(2/2)
public void destroyApp(boolean unconditional) { if (babosinCanvas != null) {
babosinCanvas.stop(); // Para la hebra del canvas
} }
public void commandAction(Command c, Displayable s) { if (c.getCommandType() == Command.EXIT) {
System.gc(); // Llama al recolector de basura
destroyApp(true); notifyDestroyed(); }
} }
59 59
Programa:
Programa:
DBVGameCanvas
DBVGameCanvas
-
-
BabosinCanvas
BabosinCanvas
(1/4)
(1/4)
import javax.microedition.lcdui.*;import javax.microedition.lcdui.game.*;
public class BabosinCanvas extends GameCanvas implements Runnable { private boolean jugando; // Indica que la partida esta en curso
private long retraso; // Retraso entre cada ciclo
private int babosinX, babosinY; // Coordenadas del personaje
private int ancho; // Ancho de la pantalla
private int alto; // Alto de la pantalla
private int posbabosin; // babosin actual del personaje (0-4)
private Sprite babosin; // Sprites del personaje // Constructor
public BabosinCanvas() throws Exception { super(true); ancho = getWidth(); alto = getHeight(); babosinX = ancho / 2; babosinY = alto / 2; retraso = 20;
// Carga el personaje principal
Image image = Image.createImage("/babosin.png"); babosin = new Sprite (image,16,24);
}
Programa:
Programa:
DBVGameCanvas
DBVGameCanvas
-
-
BabosinCanvas
BabosinCanvas
(2/4)
(2/4)
// Crea y arranca la hebra del juego
public void start() { jugando = true;
Thread t = new Thread(this); t.start();
}
public void stop() { jugando = false; }
// Bucle principal del juego
public void run() {
Graphics g = getGraphics(); while (jugando == true) {
leeTeclado(); // Lee acciones del usuario
dibujaPantalla(g); // Dibuja la escena actual
try { Thread.sleep(retraso); } catch (InterruptedException ie) {} }
61 61
Programa:
Programa:
DBVGameCanvas
DBVGameCanvas
-
-
BabosinCanvas
BabosinCanvas
(3/4)
(3/4)
// Metodo para gestionar el teclado
private void leeTeclado() { int keyStates = getKeyStates();
if ((keyStates & LEFT_PRESSED) != 0) {// Izquierda
babosinX = Math.max(0, babosinX - 1); posbabosin=(posbabosin+1)%5; babosin.setFrame(posbabosin);
babosin.setTransform(Sprite.TRANS_NONE); }
if ((keyStates & RIGHT_PRESSED) !=0 ) {// Derecha
babosinX = Math.min(ancho-16, babosinX + 1); posbabosin=(posbabosin+1)%5;
babosin.setFrame(posbabosin);
babosin.setTransform(Sprite.TRANS_MIRROR); }
if ((keyStates & UP_PRESSED) != 0) {// Arriba
babosinY = Math.max(0, babosinY - 1); babosin.setFrame(0);
}
if ((keyStates & DOWN_PRESSED) !=0) {// Abajo
babosinY = Math.min(alto-24,babosinY + 1); babosin.setFrame(4);
} }
Programa:
Programa:
DBVGameCanvas
DBVGameCanvas
-
-
BabosinCanvas
BabosinCanvas
(4/4)
(4/4)
// Dibuja la pantalla
private void dibujaPantalla(Graphics g) {
// lineas montañas
g.setColor(0xbbecf3);
g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0x0000ff); g.drawLine(0,getHeight()/2,getWidth()/2,0); g.drawLine(getWidth()/2,0,getWidth(),getHeight()/2); g.setColor(0xf5d58d); g.drawLine(0,(getHeight()/4)*3,getWidth(),(getHeight()/4)*3); // dibuja el personaje babosin.setPosition(babosinX,babosinY); babosin.paint(g);
flushGraphics(); // actualiza la pantalla
} }
63 63
IU:
IU: GameCanvas
GameCanvas:
: TiledLayer
TiledLayer
Image tileImages = Image.createImage("/deco.png"); // Carga la imagen con los elementos de la pantalla
TiledLayer decorado = new TiledLayer(40,24,tileImages,8,8); // reserva espacio para la capa del decorado // Selecciona los 40x24 elementos del decorado según su posición en deco.png
// 0 indica que no hay nada en esa posición
int[] map= {42,41,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,1,2,42,41,42,41,1,2, 264,264,264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,264, 264,264,264,0,0,248,249,250,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,264, … }
// Guarda los elementos del mapa en la posición de pantalla que corresponda
for (int i=0; i < mapa.length; i++) {
int columna = i % 40; // Se divide por el número de elementos de una fila=numero de columnas
int fila = i/40;
decorado.setCell(columna,fila,mapa[i]); // Actualiza 1 a 1 todas las celdas
}
+
=
Deco.png
IU:
IU: GameCanvas
GameCanvas:
: TiledLayer
TiledLayer
•
•
Para mover un TiledLayer
Para mover un
TiledLayer
se utiliza
se
utiliza
setPosition
setPosition
•
•
Para dibujarlo se puede utilizar el mé
Para dibujarlo se puede utilizar el m
étodo
todo
paint
paint
de
de
TiledLayer
TiledLayer
o un LayerManager
o un
LayerManager
que gestiona todas las
que gestiona todas las
capas
capas
decorado.setPosition(decox,decoy);
private LayerManager controlcapas; // Declaración del LayerManager …
controlcapas=new LayerManager(); // Crea el control de capas …
controlcapas.append(decorado); // Añade cada capa que se quiera controlar …
65 65
IU:
IU: GameCanvas
GameCanvas:
: TiledLayer+Sprite+Image
TiledLayer+Sprite+Image
+
+
=
// Dibuja la imagen de fondo g.drawImage(fondo,decox/4,decoy/4,0);
decorado.setPosition(decox,decoy); // Actualiza el decorado controlcapas.paint(g,0,0); // Pinta el decorado
// Actualiza el personaje
babosin.setPosition(babosinX,babosinY); babosin.paint(g); // pinta el personaje
IU:
IU: GameCanvas
GameCanvas: Scroll
: Scroll Fondos
Fondos
TRUCO
TRUCO
•
•
En muchos juegos de plataformas los escenarios pueden
En muchos juegos de plataformas los escenarios pueden
estar a diferentes distancias
estar a diferentes distancias
•
•
Los escenarios má
Los escenarios m
ás lejanos deben moverse a menor
s lejanos deben moverse a menor
velocidad que los cercanos para producir un movimiento
velocidad que los cercanos para producir un movimiento
real
real
•
•
Es fá
Es f
ácil conseguir ese efecto d
cil conseguir ese efecto dá
ándole al primer plano
ndole al primer plano
unas coordenadas (
unas coordenadas (x,y
x,y) y a cada plano m
) y a cada plano má
á
s lejano se le
s lejano se le
asignar
asignará
á
un (x/
un (x/distancia,y
distancia,y/distancia)
/distancia)
•
67 67
IU:
IU: GameCanvas
GameCanvas:
: Colisiones
Colisiones
•
•
Se puede
Se
puede
mirar
mirar
en cada
en
cada
momento
momento
si
si
un Sprite choca
un Sprite
choca
con
con
otro
otro
Sprite,
Sprite, Imagen
Imagen
o TiledLayer
o
TiledLayer
•
•
Las
Las
colisiones
colisiones
se
se
pueden
pueden
hacer
hacer
a
a
nivel
nivel
de pixel
de pixel
(
(pixelLevel
pixelLevel=true) o
=true) o aproximando
aproximando
la
la
imagen
imagen
a un
a un
rectangulo
rectangulo
(pixelLevel
(
pixelLevel=false)
=false)
// Mira si el sprite babosin choca con la imagen situada en x,y choca=babosin.collidesWith(imagen,x,y,pixelLevel);
// Mira si el sprite babosin choca con la otro Sprite choca=babosin.collidesWith(enemigo,pixelLevel); // Mira si el sprite babosin choca con un tiledLayer choca=babosin.collidesWith(escenario,pixelLevel);
Programa:
Programa: DBVBabosin
DBVBabosin
•
•
En el siguiente programa se combina todo lo relacionado
En el siguiente programa se combina todo lo relacionado
con
con
GameCanvas:
GameCanvas
:
Sprites, Im
Sprites
, Imá
ágenes,
genes,
TiledLayer
TiledLayer,
,
LayerManager
LayerManager, Control de
, Control de Teclado
Teclado…
…
•
•
Con esto se podrí
Con esto se podr
ía hacer pr
a hacer pr
ácticamente cualquier juego
á
cticamente cualquier juego
en 2D
en 2D
•
•
Se va a utilizar para el midlet
Se va a utilizar para el
midlet
la misma clase que en
la misma clase que en
(
(DBVGameCanvas
DBVGameCanvas
)
)
•
•
Por otro lado, se va a utilizar una clase que hereda de
Por otro lado, se va a utilizar una clase que hereda de
GameCanvas
GameCanvas
(
(BabosinCanvas
BabosinCanvas
) en la que se desarrolla el
) en la que se desarrolla el
juego
juego
•
69 69
Programa:
Programa: DBVBabosin
DBVBabosin
Con los cursores se desplaza el personaje, el escenario y el fondo
Programa
Programa:
: DBVBabosin
DBVBabosin
(1/6)
(1/6)
import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*;
public class BabosinCanvas extends GameCanvas implements Runnable { private boolean jugando; // Indica que la partida esta en curso
private long retraso; // Retraso entre cada ciclo
private int babosinX, babosinY; // Coordenadas del personaje
private int antx,anty; // Coord. anterior del personaje (para colisiones)
private int decox,decoy; // Coordenadas del decorado
private int antdecox,antdecoy;
private int ancho; // Ancho de la pantalla
private int alto; // Alto de la pantalla
private int posbabosin; // sprite actual del personaje (0-4)
private LayerManager controlcapas;
private int ultmov; // Ultimo movimiento: 0 nada 1 izq 2 dch 3 arr 4 aba
private TiledLayer decorado; // Escenario
private boolean cayendo=true; private Image fondo;
71 71
Programa
Programa:
: DBVBabosin
DBVBabosin
(2/6)
(2/6)
// Constructorpublic BabosinCanvas() throws Exception {
// Llama al constructor de GameCanvas, al ser true, desabilita // el manejo estandar del teclado
super(true);
// Lee las coordedanas del dispositivo
ancho = getWidth(); alto = getHeight();
// Coloca el muñeco en una posición que no choque
babosinX = 100; babosinY = 30;
// Inicializa las coordenadas del decorado a la esquina sup,izq de la pantalla
decox=0; decoy=0;
// inicializa coordenadas anteriores (para deshacer movimientos si choca)
antdecox=decox; antdecoy=decoy; antx=babosinX; anty=babosinY; ultmov=0;
retraso = 5;
decorado=iniDecorado(); // Carga e inicializa el decorado
fondo= Image.createImage("/fondo2.png"); // Carga imagen de fondo
controlcapas=new LayerManager(); // Crea el control de capas
controlcapas.append(decorado);
Image image = Image.createImage("/babosin.png"); // Carga el personaje principal
babosin = new Sprite (image,16,24); } // Fin del constructor
Programa
Programa:
: DBVBabosin
DBVBabosin
(3/6)
(3/6)
// Controla las colisionesprivate void colision() {
if (!babosin.collidesWith(decorado, false)) {
// Si babosin colisiona con el decorado se vuelve a su estado anterior
decox=antdecox;decoy=antdecoy; babosinX=antx; babosinY=anty; }
}
// Dibuja todo
private void dibujaPantalla(Graphics g) { g.setColor(0xffffff); // Dibuja un fondo blanco
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(fondo,decox/4,decoy/4,0); // Dibuja la imagen de fondo
decorado.setPosition(decox,decoy); // Actualiza el decorado
controlcapas.paint(g,0,0); // Pinta el decorado
babosin.setPosition(babosinX,babosinY); // Actualiza el personaje
babosin.paint(g); // pinta el personaje
g.setColor(0x000000); // Pone el color a negro