miércoles, 3 de marzo de 2010

Crear Sprites


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.

Codigo fuente

//importamos las clases de java que utilizaremos en nuestro programa
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


/*aqui nuestro MIDlet, esta clase sera la primera en ser ejecutada cuando se
ejecute el programa*/
public class Demo1 extends MIDlet {    
    //metodo cuando el midlet arranca
    public void startApp() {
        //creamos un objeto SSCanvas (nuestra pantalla de juego)
        SSCanvas screen=new SSCanvas();
        //indicamos al dispositivo que screen (instancia de SSCanvas) será la 
  //nueva pantalla activa
        Display.getDisplay(this).setCurrent(screen);   
        new Thread(screen).start(); //arrancamos el bucle (nuevo hilo de ejecución)
    }
    
    //metodo cuando el midlet entra en pausa
    public void pauseApp() {
    }
    
    //metodo cuando el midlet es destruido
    public void destroyApp(boolean unconditional) {
    }
}


//esta clase es la encargada de hacer funcionar nuestra aplicación gráfica 
class SSCanvas extends Canvas implements Runnable{ 
    private Sprite ball;
    
    //metodo constructor
    public SSCanvas(){
        //instanciamos (creamos) el objeto ball a partir de la clase Sprite
        ball = new Sprite(getWidth()/2,getHeight()/2,20,20);
    }
    
    public void run(){
        while(true){
            //actualizamos la posicion de la bola
            ball.compute(getWidth(),getHeight());
            //forzamos el repintado de la pantalla
            repaint();
            serviceRepaints();
            try {
                Thread.sleep(30);            
            } catch (InterruptedException e) {        
            }
        }
    }
    //metodo de la clase canvas para pintar en pantalla
    public void paint(Graphics g){          
        //seleccionamos el color negro para pintar el fondo
 g.setColor(0,0,0);
 //pintamos el fondo de pantalla con un rectangulo con el tamaño de
 //la pantalla getWidth() y getHeight() es un método de la clase canvas
 //que nos devuelve el ancho y alto de la pantalla
        g.fillRect(0,0,getWidth(),getHeight());       
        //pintamos la bola en pantalla
        ball.draw(g);
    }    
}

class Sprite{
    //atributos privados
    protected int x; 
    protected int y;
    protected int width;
    protected int height;
    protected int incX;
    
    //metodo constructor 
    public Sprite(int x,int y,int width,int height){
        this.x=x;
        this.y=y;
        this.width=width;
        this.height=height;
        incX=3;
    }
    
    //metodo que actualiza la posición del sprite
    public void compute(int screenW, int screenH){
        if(x <= 0)incX=3;
        else if(x+width >= screenW)incX=-3;
        
        x+=incX;
    }
    
    //metodo que muestra en pantalla al sprite
    public void draw(Graphics g){
        g.setColor(250,0,0);
        g.fillArc(x,y, width, height,0, 360);
    }
}

No hay comentarios: