Tutorial 3- Nuestro primer sprite en pantalla

INTRODUCCIÓN:

En la primer tutorial se ha explicado de que trata J2ME y se detalla un pequeño programa que visualiza la frase "Hola Mundo en la pantalla del movil. Ahora crearemos un pequeño programa donde haremos que una bola rebote de un lado a otro de la pantalla para ello hemos modificado el código de la primera tutorial.

Clases que intervendrán en el siguiente ejemplo:

- Demo1
- SSCanvas
- Sprite

Aqui el código completo, más abajo se analizará cada parte del código.

Codigo fuente

EXPLICACION DEL CÓDIGO

Clase Demo1:

Esta clase es una extensión de la clase MIDlet, esto quiere decir que ésta clase creada por nosotros (clase Demo1) adquirira la funcionalidad de la clase MIDlet.

La Clase MIDlet es una clase del sistema, es decir viene dentro del paquete de java. Ésta clase se utilizará siempre en cualquier aplicación movil ya que es la primera que se lanza cuando se ejecuta un archivo de java para movil (archivo con extension .jar). Esta clase se encarga basicamente del control del movil.

Volviendo a nuestra clase Demo1. Siendo ésta una extensión de MIDlet será necesario introducir los métodos que controlan al MIDlet. Estos métodos son:

public void startApp()
public void pauseApp()
public void destroyApp(boolean unconditional)

El primero de ellos se lanza (ejecuta) cuando el MIDlet es ejecutado, el segundo cuando el MIDlet entra en pausa y el tercero cuando el MIDlet es destruido.

En fin, esta clase se encargará de arrancar la aplicación y de derivar a la siguiente clase (SSCanvas) el control de la pantalla y demás funcionalidades necesarias para nuestro juego.

Clase SSCanvas:

Esta clase es una extensión de la clase Canvas. Canvas es una clase de sistema que se encarga basicamente de la parte gráfica a bajo nivel. Con ello podremos acceder a todas las funcionalidades gráficas brindadas por java y el dispositivo movil. El método más importante de la clase Canvas es paint cuyo único parámetro es el objeto Graphics, éste método nos da la posibilidad de pintar en pantalla a través de la clase Graphics.

Nuestra clase SSCanvas además de ser una extensión de Canvas implemente un hilo independiente de ejecución, por medio de Runnable, con ésto conseguimos que nuestra aplicación tenga vida y podamos mover sprites por pantalla. Que lio no?. Hablando en cristiano, utilizando solo Canvas sin implementar Runnable es como sacar un foto, en cambio si implementamos Runnable esto sera más bien como un video, en donde las cosas se mueven por la pantalla.

Para implementar Runnable tendrémos que añadir un método obligatorio llamado run(). Déntro, nosotros pondremos el código necesario para que esto tome vida.

Clase Sprite:

Esta clase esta integramente creada por nosotros no implementa ni es una extensión de ninguna otra clase. Lo primero de todo será explicar que es un Sprite, aqui el concepto.

Sprite : es cualquier objeto que aparece en nuestro videojuego. Normalmente tiene asociado algunos atributos, siendo los más básicos una imagen y una posición.

Dicho esto, nuestro Sprite no tendrá una imágen sino que será una primitiva gráfica (circulo, cuadrado,lineas, etc), en este caso un circulo pintado de color rojo para ser exactos. Los atributos de este sprite son la posicion donde se mostrará (x, y) el ancho y alto que tendrá (width, height), y el incremento sobre el eje x (incX).

Además de atributos la clase Sprite tendrá tres métodos

- el primero será el método constructor (es el primer método que se lanza cuando es instanciada un objeto de esta clase) que espera los siguientes parámetros posicion inicial (x e y) y el ancho y alto que tendrá el sprite (width y height).

- el segundo será el método compute(int screenW, int screenH). como parametros espera el ancho y alto de pantalla y su función será la se mover la bola de un lado a otro de la pantalla.

- el tercero será el método draw(Graphics g), como parámetro espera el objeto graphics donde pintará a nuestro sprite. Este método solo servira para pintar nuestro sprite en el objeto graphics.

 

EXPLICACIÓN DEL CÓDIGO LINEA A LINEA

Clase Demo1

Import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
>
Importaremos las clases que utilizaremos en nuestro programa. Utilizamos la sentencia Import seguido de la clase que deseamos importar y al final podemos utilizar .* para traer todas las clases.

 

public class Demo1 extends MIDlet {
Clase principal que extiende de la clase MIDlet. La clase MIDlet es la primera que se ejecuta en un juego o aplicación realizada en J2ME.

 

public void startApp() {
SSCanvas screen = new SSCanvas();
Display.getDisplay(this).setCurrent(screen);
new Thread(screen).start();
}
Este método es lanzado al crearse el MIDlet, este y el resto de métodos para esta clase son obligatorios ya que es una extensión de la clase MIDlet y es necesario para su correcto funcionamiento.
Dentro del método startApp() creamos un objeto del tipo SSCanvas (pantalla de nuestro juego). En la segunda linea con el objeto Display obtenemos la referencia a la pantalla del movil y con el método setCurrent indicamos que screen (objeto SSCanvas) será la pantalla activa. Finalmente con new Thread creamos un nuevo hilo de ejecución para screen y con start() lo lanzamos.

 

public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
Ambos son métodos obligatorios cuando creamos una clase que implementa de la clase MIDlet. el primero se lanza automaticamente cuando el MIDlet entra en pausa y el segundo cuando el MIDlet es destruido. Estos métodos son de gran ayuda para poder controlar el ciclo de vida de nuestro midlet como detener la aplicación por x tiempo o simplemente salir de ella.

Clase SSCanvas

class SSCanvas extends Canvas implements Runnable {
Aqui la clase que se encargara de nuestro juego o aplicación. Ésta es una extensión de la clase Canvas (es una clase que nos permite acceder a la parte gráfica del movil), además implemente de la clase Runnable, esto hace que nuestra clase pueda ejecutarse libremente del MIDlet que lo ha creado.

 

private Sprite ball;
Declaramos un atributo privado de tipo Sprite.

 

public SSCanvas(){
ball = new Sprite(getWidth()/2,getHeight()/2,20,20); }
Método constructor de la clase. Aqui instanciamos (creamos) un objeto de tipo Sprite y pasamos por parámetros la posición inicial y el ancho y alto que tendrá el objeto. En este caso la posicion inicial sera el centro de la pantalla, ya que le pasamos en x el ancho de pantalla / 2 y en y el alto de pantalla / 2 (con getWidth() y con getHeight() respectivamente).

 

public void run() {
while (true){
ball.compute();
repaint();
serviceRepaints();
try {
Thread.sleep(30);
}catch(InterruptedException e){
}
}
}
Método que se lanza desde la clase anterior (Demo1). Aqui está nuestro bucle principal, while (true) indica que sera un bucle infinito. Dentro de este bucle llamamos al método compute() del objeto ball (instancia de la clase Sprite) y hacemos las llamadas al repintado de la pantalla del móvil con repaint(); y controlamos que solo se pinte en pantalla cuando se hayan actualizado todos los datos de nuestro juego (como actualizar la posicion de un sprite) y esto lo hacemos con serviceRepaints();. Finalmente con la sentencia Thread.sleep(30); indicamos que se detenga 30 milésimas de segundo entre cada ciclo del bucle. Esta última linea se encuentra entre try y catch, ya que es obligatorio para este método.
Try y Catch controlan excepciones o errores que se pueden producir, si no hay error se ejecuta las lineas de Try en caso contrario se ejecutaria las lineas contenidas dentro de catch.

 

public void paint(Graphics g){
g.setColor(0,0,0);
g.fillRect(0,0,getWidth(),getHeight());
ball.draw(g) ;
}
Este es una sobrecarga del método paint de Canvas (mirar glosario al final de la página)será el encargado de pintar en pantalla su único parámetro es Graphics que es el encargado de las rutinas gráficas a mostrar por Canvas. en la primera línea seleccionamos el color negro con el método setColor(0,0,0), en la segunda linea pintamos con un rectangulo toda la pantalla del movil con el color antes seleccionado, y finalmente llamamos al método draw del objeto ball.

Clase Sprite

class Sprite{
//atributos privados
protected int x;
protected int y;
protected int width;
protected int height;
protected int incX;
Aqui la clase que protagonista, en este ejemplo sera una simple bola que se desplaza de un lado a otro de la pantalla de nuestro movil. para crear una clase se comienza con la palabra reservada class seguida del nombre que querramos (debemos utilizar un nombre claro a lo que sera la clase y que no exista otra clase con ese nombre ni tampoco utilizar caracteres prohibidos como ,.""* etc.). Dento de la clase Sprite declaramos los atributos de la misma primero introducimos su nivel de visibilidad, en este caso privado el tipo y el nombre que le demos a estos atributos.

 

public Sprite(int x,int y,int width,int height){
this.x=x;
this.y=y;
this.width=width;
this.height=height;
incX=3;
}
Método constructor de la clase, aqui inicializaremos los atributos de la clase con los valores que son pasados por parámetros.

 

public void compute(int screenW, int screenH){ if(x <= 0)incX=3;
else if(x+width >= screenW)incX=-3;
x+=incX;
}
Éste método se encarga de actualizar la posición de la bola, moviendola de un lado a otro de la pantalla. sus parametros son el ancho y alto de pantalla. Aunque solo usamos el ancho para detectar si ha llegado al límite de pantalla el alto de pantalla nos serviria si quisieramos que rebotara por todos los lados.

 

public void draw(Graphics g){
g.setColor(250,0,0);
g.fillArc(x,y, width, height,0, 360);
}
Éste método se encargara de pintar la bola por la pantalla del movil su único parámetro es el objeto Graphics que es pasado por referencia desde la clase SSCanvas. con los métodos propios de graphics dibujaremos la bola con fillArc cuyos parametros son la posicion x, y el ancho y el alto, width y height, y el grado inicial y el grado final 0,360.

 

Para ver el programa en acción mira la siguiente tutorial y si no comprendes del todo el código dos tutoriales mas adelante te explicará con más detalles éste programa.

javamovil.info

Condiciones generales | Contactar | RSS | Porqué registrarse? | Registrarse

Todos los derechos reservados Copyright | © 2007-2009 JavaMovil.info