Programación Java J2ME: Java para dispositivos móviles

Texto completo

(1)

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

(2)

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

(3)

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

(4)

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

(5)

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.

(6)

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.

(7)

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 del

proveedor

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.

(8)

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

(9)

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

(10)

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

(11)

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

ó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

(12)

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:

(13)

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); } } }

(14)

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

(15)

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:

(16)

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

} } }

(17)

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); }

(18)

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 er

par

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

(19)

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

(20)

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

(21)

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

(22)

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); } } } } }

(23)

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

(24)

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 {

(25)

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

í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

(26)

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

(27)

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,

(28)

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

(29)

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(); }

} }

(30)

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) {} }

(31)

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

} }

(32)

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 …

(33)

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)

(34)

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

(35)

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;

(36)

71 71

Programa

Programa:

: DBVBabosin

DBVBabosin

(2/6)

(2/6)

// Constructor

public 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 colisiones

private 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

Figure

Actualización...

Referencias

Actualización...

Related subjects :