Como continuación del ejemplo #21, ahora se verá en este ejemplo como enviar datos desde la interfaz de alto nivel a la interfaz de bajo nivel, este es una forma para poder capturar datos del usuario y usarlos en la clase GameCanvas, recuerde que en esta clase no existe forma alguna para que el usuario introduzca los datos.
El ejemplo de hoy va a hacer uso del código Java del ejemplo #19, el cuál puedes ver dando clic aqui, el ejemplo, como se recordará muestra la animación de una pelotita que está rebotando por toda la pantalla, una y otra vez, pero lo hace a una velocidad constante siempre, hoy se mostrará cómo se puede elegir desde la interfaz de alto nivel, la velocidad de la pelotita la cual se enviará a la interfaz de bajo nivel para que la pelotita responda a esta velocidad.
Interfaz de alto nivel
La imagen siguiente muestra la interfaz de alto nivel para este ejemplo:
Si has seguido el blog desde los artículos iníciales, sabrás fácilmente realizar la interfaz de usuario mostrada en la figura anterior, lleva dos TextField y un okCommand.
Por otro lado, en el ejemplo #19 se hace uso de la clase llamada “Animacion” también vista ya en varios ejemplos del blog, el nombre de la clase es importante para poder mandarla llamar desde la interfaz de alto nivel
Vea el código siguiente:
int velx = Integer.parseInt(textField.getString());
int vely = Integer.parseInt(textField1.getString());
Con ese par de instrucciones se obtiene el valor que el usuario ingreso en los TextField, en las variables de tipo entero llamadas “velx” y “vely”, estas variables se envían como parámetros a la interaz de bajo nivel, tal y como se observa en la siguiente instrucción:
Animacion canvas = new Animacion(this, velx, vely);
Recuerde con esa instrucción se crea un objeto llamado “canvas” de la clase “Animación, vea las variables “velx”, y “velY” son enviadas a la clase “Animacion” como parámetros. Así de fácil se envían los datos de la interfaz de alto nivel a la clase que deriva de GameCanvas.
El código completo, cuando se presiona el comando que nos envía a la interfaz de bajo nivel entonces queda así:
int velx = Integer.parseInt(textField.getString());
int vely = Integer.parseInt(textField1.getString());
Animacion gameCanvas = new Animacion(this, velx, vely);
Display.getDisplay(this).setCurrent(gameCanvas);
Si no tienes idea de donde se ubica este código al final del post viene el video tutorial para que no quede duda alguna.
Cambios a la clase "Animacion"
Este es el código final del ejemplo #19 que hacia rebotar la pelotita por toda la pantalla:
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class Animacion extends GameCanvas implements Runnable {
Graphics g;
Thread subproceso;
Image fondo, pelota;
public Animacion() {
super(true);
g = getGraphics();
try {
fondo = Image.createImage("/fondo.jpg");
pelota = Image.createImage("/pelotita.gif");
} catch (Exception e) { }
subproceso = new Thread(this);
subproceso.start();
}
public void run() {
int coordX = 0;
int coordY = 0;
int velX = 5;
int velY = 3;
int alto = getHeight();
int ancho = getWidth();
while(true) {
g.drawImage(fondo, 0, 0, Graphics.TOP | Graphics.LEFT);
g.drawImage(pelota, coordX, coordY, Graphics.TOP | Graphics.LEFT);
try {
subproceso.sleep(30);
} catch (InterruptedException e) { }
coordX = coordX + velX;
coordY = coordY + velY;
if ((coordX + pelota.getWidth()) > ancho || (coordX < 0))
velX = -velX;
if ((coordY + pelota.getHeight()) > alto || (coordY < 0))
velY = -velY;
flushGraphics();
}
}
}
Vea las variables "velX" y "velY", se declaran en el método run() y ahí son inicializadas con un valor fijo de 5 y 3 respectivamente, bueno pues en primer lugar hay que quitarlas de ahí, porque ahora los valores para estas variables vienen de la interfaz de alto nivel, se declaran a continuación de la definición de la clase, con eso basta para poder las usar en todo lo largo del programa.
Otro cambio es el constructor que ahora recibe tres parámetros, el primero es el MIDlet y los otros dos son las variables de la velocidad que se enviaron desde la interfaz de alto nivel, enseguida se muestra parte del código para el constructor:
// Declaración de las variables (después de la clase)
int velX;
int velY;
int velY;
public Animacion(HelloMIDlet mid, int vx, int vy) {
// Aquí va el código para el constructor
VelX = vx;
VelY = vy;
}
}
Justo aquí se asignan los valores que vienen de la interfaz de alto nivel a las variables de la clase, con esto basta para poder comunicarnos, para poder enviar datos desde la interfaz de alto nivel, al hacer lo anterior la velocidad de la pelotita va respondiendo al valor que se ingreso en la interfaz.
Básicamente eso son los cambios, más significativos, lo que sigue es repetir lo que se hizo en la entrada anterior (ejemplo #21), que es lo de agregar los comandos para cambiarse de una interfaz a otra, esto ya se explico con detalle, en ese ejercicio, así que no tiene caso volverlo repetir.
Fiel a mi costumbre y para evitar malos entendidos, y para eliminar las dudas que pudieran surgir de lo visto arriba, a continuación se muestra el video tutorial para este ejemplo.
Aún así, por si hubiera dudas del video puesto que hubo una parte de copiar y pegar, voy a colocar en este enlace, un archivo comprimido que incluye toda la carpeta que genera NetBeans para este ejemplo, la versión que se uso fue la 6.8, ahí está el código fuente completo, incluso en la carpeta “dist” se encuentra el archivo JAR para enviarlo directo al celular y probar este ejemplo en el teléfono.
desde españa felicidades por el blog. me has ayudado bastante en el desarrollo con j2me.
ResponderEliminarun pregunta, tengo un movil tactil, y tengo el netbeans preparado con el sdk correspondiente. en concreto es un nokia 5800. He quitado un teclado que aparece por defecto tactil, para poder ejecutar las aplicaciones a full screen mode. La cuestión es que me gustaría darle funcionalidad a mis propios botones (imagenes)
alguna propuesta?
saludos!