miércoles, 3 de marzo de 2010

Mover sprites con el teclado


Explicación del código

Clase Demo1

No sufre ningún cambio respecto a la entrada anterior.

Clase SSCanvas

El principal cambio es añadir la capacidad de escuchar (leer) desde el teclado del ratón los eventos producidos por este (eventos son las acciones que puede producir un objeto, en el caso del teclado son cuando una tecla es pulsada, es soltada, etc). Con esto haremos que uno de los sprites (el que llamamos player) podamos moverlo por la pantalla en el sentido que le indiquemos por medio del teclado o joystick del movil. El otro cambio es crear un sprite más llamado player que será con el que interactuemos con el teclado y unas lineas más de codigo para actualizar su posición y el pintado en pantalla.

Clase Sprite

Aqui añadiremos más atributos para controlar el estado del desplazamiento (utilizado por player), otros atributos estáticos para identificar las teclas pulsadas y 3 métodos más. El primer método es computePlayer que controlara el movimiento del sprite cuando se utilice un teclado, luego dos métodos que que controlaran en que dirección debe desplazarse, el primero keyDown activa el desplazamiento y keyUp desactiva el desplazamiento.

Código 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;
    private Sprite player;
    
    //metodo constructor
    public SSCanvas(){
        //instanciamos (creamos) el objeto ball a partir de la clase Sprite
        ball = new Sprite(getWidth()/2,getHeight()/2,20,20);
        player = new Sprite(getWidth()/2,getHeight()/3,30,30);
    }
    
    public void run(){
        while(true){
            //actualizamos la posicion de la bola
            ball.compute(getWidth(),getHeight());  
            player.computePlayer(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);
        player.draw(g);
    }    
    
    /*sobrecarga de método para detectar cuando una tecla es soltada 
    por el usuario*/
    public void keyReleased(int keyCode) {
 int action=getGameAction(keyCode);  
 switch (action) {
            case LEFT:    
                player.keyUp(player.LEFT);
  break;
            case RIGHT: 
                player.keyUp(player.RIGHT);
  break;
            case UP:
                player.keyUp(player.UP);
  break;
            case DOWN: 
                player.keyUp(player.DOWN);
  break; 
            case FIRE:                
                break;            
        }
    }

    //sobrecarga del método que detecta cuando una tecla es pulsada por el usuario
    public void keyPressed(int keyCode) {
 int action=getGameAction(keyCode);         
        switch (action) {
            case LEFT:
                player.keyPress(player.LEFT);               
                break;
            case RIGHT:
                player.keyPress(player.RIGHT);  
  break;
            case UP:
                player.keyPress(player.UP);                
                break;
            case DOWN:
  player.keyPress(player.DOWN); 
  break;
            case FIRE:      
  break;                     
         }        
    }
}

class Sprite{
    //atributos privados
    protected int x; 
    protected int y;
    protected int width;
    protected int height;
    protected int incX,incY;
    private boolean startX=false;
    private boolean startY=false;
    
    //declaracion de constantes
    protected static final int LEFT = 1;
    protected static final int RIGHT = 2;
    protected static final int UP = 3;
    protected static final int DOWN = 4;
    protected static final int FIRE = 5;
    
    
    //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;
        incY=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 actualiza la posicion del sprite que controlamos por teclado
    public void computePlayer(int screenW, int screenH) {
        if(x + incX > 0 && (x + incX) < (screenW - width)){
            x+=incX;             
            if(startX==false)incX=0;
        }
        if(y + incY > 0 && (y + incY) < (screenH - height)){
            y+=incY;
            if(startY==false)incY=0;
        }          
    } 
    
    //metodo para detener el desplazamiento del sprite
     public void keyUp(int keyCode) {
 switch (keyCode) {
            case LEFT:
  startX=false;    
  break;
            case RIGHT:
  startX=false;
  break;
            case UP:
  startY=false;
             break;
            case DOWN:
  startY=false;
  break;        
        }  
    }
 
    //método para indicar la dirección del desplazamiento
    public void keyPress(int keyCode) { 
        switch (keyCode) {
            case LEFT:
                incX=-5;
                startX=true;     
                break;
            case RIGHT:
                incX=5; 
                startX=true;   
                break;
            case UP:
                incY=-5;
                startY=true;
                break;
            case DOWN:
                incY=5;
                startY=true;
                break;
            case FIRE:                    
                break;
        }
    }   
    
    //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: